summaryrefslogtreecommitdiffstats
path: root/location/java/com
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2009-04-22 17:12:34 -0700
committerJean-Baptiste Queru <jbq@google.com>2009-04-22 17:12:34 -0700
commit74008f608af0c567456d37e63d48643689388c74 (patch)
tree02354593bed51d5c4bb0ac5f9b44032034cbbaaf /location/java/com
parent6fc52c4928ec8a658d7eb0b7881fcbc879aeb18c (diff)
parent644cf62660c87a9b8d5bcb22412cc2ad2aeea291 (diff)
downloadframeworks_base-74008f608af0c567456d37e63d48643689388c74.zip
frameworks_base-74008f608af0c567456d37e63d48643689388c74.tar.gz
frameworks_base-74008f608af0c567456d37e63d48643689388c74.tar.bz2
Merge donut into master
Diffstat (limited to 'location/java/com')
-rw-r--r--location/java/com/android/internal/location/GpsLocationProvider.java136
-rw-r--r--location/java/com/android/internal/location/LocationProviderProxy.java37
2 files changed, 123 insertions, 50 deletions
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java
index 8a33574..924641c 100644
--- a/location/java/com/android/internal/location/GpsLocationProvider.java
+++ b/location/java/com/android/internal/location/GpsLocationProvider.java
@@ -22,20 +22,23 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.location.Criteria;
import android.location.IGpsStatusListener;
-import android.location.ILocationCollector;
import android.location.ILocationManager;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.location.LocationProviderImpl;
+import android.net.ConnectivityManager;
import android.net.SntpClient;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.SystemClock;
import android.util.Config;
import android.util.Log;
+import android.util.SparseIntArray;
+import com.android.internal.app.IBatteryStats;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.TelephonyIntents;
@@ -99,6 +102,14 @@ public class GpsLocationProvider extends LocationProviderImpl {
private static final int GPS_STATUS_ENGINE_ON = 3;
private static final int GPS_STATUS_ENGINE_OFF = 4;
+ // these need to match GpsSuplStatusValue defines in gps.h
+ /** SUPL status event values. */
+ private static final int GPS_REQUEST_SUPL_DATA_CONN = 1;
+ private static final int GPS_RELEASE_SUPL_DATA_CONN = 2;
+ private static final int GPS_SUPL_DATA_CONNECTED = 3;
+ private static final int GPS_SUPL_DATA_CONN_DONE = 4;
+ private static final int GPS_SUPL_DATA_CONN_FAILED = 5;
+
// these need to match GpsLocationFlags enum in gps.h
private static final int LOCATION_INVALID = 0;
private static final int LOCATION_HAS_LAT_LONG = 1;
@@ -122,6 +133,11 @@ public class GpsLocationProvider extends LocationProviderImpl {
private static final int GPS_DELETE_CELLDB_INFO = 0x8000;
private static final int GPS_DELETE_ALL = 0xFFFF;
+ // for mSuplDataConnectionState
+ private static final int SUPL_DATA_CONNECTION_CLOSED = 0;
+ private static final int SUPL_DATA_CONNECTION_OPENING = 1;
+ private static final int SUPL_DATA_CONNECTION_OPEN = 2;
+
private static final String PROPERTIES_FILE = "/etc/gps.conf";
private int mLocationFlags = LOCATION_INVALID;
@@ -176,6 +192,12 @@ public class GpsLocationProvider extends LocationProviderImpl {
private String mSuplHost;
private int mSuplPort;
private boolean mSetSuplServer;
+ private String mSuplApn;
+ private int mSuplDataConnectionState;
+ private final ConnectivityManager mConnMgr;
+
+ private final IBatteryStats mBatteryStats;
+ private final SparseIntArray mClientUids = new SparseIntArray();
// how often to request NTP time, in milliseconds
// current setting 4 hours
@@ -184,8 +206,6 @@ public class GpsLocationProvider extends LocationProviderImpl {
// current setting - 5 minutes
private static final long RETRY_INTERVAL = 5*60*1000;
- private ILocationCollector mCollector;
-
private class TelephonyBroadcastReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
@@ -198,10 +218,12 @@ public class GpsLocationProvider extends LocationProviderImpl {
if (Config.LOGD) {
Log.d(TAG, "state: " + state + " apnName: " + apnName + " reason: " + reason);
}
- if ("CONNECTED".equals(state)) {
- native_set_supl_apn(apnName);
- } else {
- native_set_supl_apn("");
+ if ("CONNECTED".equals(state) && apnName != null && apnName.length() > 0) {
+ mSuplApn = apnName;
+ if (mSuplDataConnectionState == SUPL_DATA_CONNECTION_OPENING) {
+ native_supl_data_conn_open(mSuplApn);
+ mSuplDataConnectionState = SUPL_DATA_CONNECTION_OPEN;
+ }
}
}
}
@@ -220,6 +242,11 @@ public class GpsLocationProvider extends LocationProviderImpl {
intentFilter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
context.registerReceiver(receiver, intentFilter);
+ mConnMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
+
+ // Battery statistics service to be notified when GPS turns on or off
+ mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"));
+
mProperties = new Properties();
try {
File file = new File(PROPERTIES_FILE);
@@ -242,10 +269,6 @@ public class GpsLocationProvider extends LocationProviderImpl {
}
}
- public void setLocationCollector(ILocationCollector collector) {
- mCollector = collector;
- }
-
/**
* Returns true if the provider requires access to a
* data network (e.g., the Internet), false otherwise.
@@ -547,6 +570,30 @@ public class GpsLocationProvider extends LocationProviderImpl {
}
@Override
+ public void addListener(int uid) {
+ mClientUids.put(uid, 0);
+ if (mNavigating) {
+ try {
+ mBatteryStats.noteStartGps(uid);
+ } catch (RemoteException e) {
+ Log.w(TAG, "RemoteException in addListener");
+ }
+ }
+ }
+
+ @Override
+ public void removeListener(int uid) {
+ mClientUids.delete(uid);
+ if (mNavigating) {
+ try {
+ mBatteryStats.noteStopGps(uid);
+ } catch (RemoteException e) {
+ Log.w(TAG, "RemoteException in removeListener");
+ }
+ }
+ }
+
+ @Override
public boolean sendExtraCommand(String command, Bundle extras) {
if ("delete_aiding_data".equals(command)) {
@@ -675,16 +722,6 @@ public class GpsLocationProvider extends LocationProviderImpl {
}
reportLocationChanged(mLocation);
-
- // Send to collector
- if ((flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG
- && mCollector != null) {
- try {
- mCollector.updateLocation(mLocation);
- } catch (RemoteException e) {
- Log.w(TAG, "mCollector.updateLocation failed");
- }
- }
}
if (mStarted && mStatus != AVAILABLE) {
@@ -725,6 +762,20 @@ public class GpsLocationProvider extends LocationProviderImpl {
}
}
+ try {
+ // update battery stats
+ for (int i=mClientUids.size() - 1; i >= 0; i--) {
+ int uid = mClientUids.keyAt(i);
+ if (mNavigating) {
+ mBatteryStats.noteStartGps(uid);
+ } else {
+ mBatteryStats.noteStopGps(uid);
+ }
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "RemoteException in reportStatus");
+ }
+
// send an intent to notify that the GPS has been enabled or disabled.
Intent intent = new Intent(GPS_ENABLED_CHANGE_ACTION);
intent.putExtra(EXTRA_ENABLED, mNavigating);
@@ -782,7 +833,44 @@ public class GpsLocationProvider extends LocationProviderImpl {
updateStatus(TEMPORARILY_UNAVAILABLE, mSvCount);
}
}
-
+
+ /**
+ * called from native code to update SUPL status
+ */
+ private void reportSuplStatus(int status) {
+ switch (status) {
+ case GPS_REQUEST_SUPL_DATA_CONN:
+ int result = mConnMgr.startUsingNetworkFeature(
+ ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_SUPL);
+ if (result == Phone.APN_ALREADY_ACTIVE) {
+ native_supl_data_conn_open(mSuplApn);
+ mSuplDataConnectionState = SUPL_DATA_CONNECTION_OPEN;
+ } else if (result == Phone.APN_REQUEST_STARTED) {
+ mSuplDataConnectionState = SUPL_DATA_CONNECTION_OPENING;
+ } else {
+ native_supl_data_conn_failed();
+ }
+ break;
+ case GPS_RELEASE_SUPL_DATA_CONN:
+ if (mSuplDataConnectionState != SUPL_DATA_CONNECTION_CLOSED) {
+ mConnMgr.stopUsingNetworkFeature(
+ ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_SUPL);
+ native_supl_data_conn_closed();
+ mSuplDataConnectionState = SUPL_DATA_CONNECTION_CLOSED;
+ }
+ break;
+ case GPS_SUPL_DATA_CONNECTED:
+ // Log.d(TAG, "GPS_SUPL_DATA_CONNECTED");
+ break;
+ case GPS_SUPL_DATA_CONN_DONE:
+ // Log.d(TAG, "GPS_SUPL_DATA_CONN_DONE");
+ break;
+ case GPS_SUPL_DATA_CONN_FAILED:
+ // Log.d(TAG, "GPS_SUPL_DATA_CONN_FAILED");
+ break;
+ }
+ }
+
private void xtraDownloadRequest() {
if (Config.LOGD) Log.d(TAG, "xtraDownloadRequest");
if (mNetworkThread != null) {
@@ -1002,6 +1090,8 @@ public class GpsLocationProvider extends LocationProviderImpl {
private native void native_inject_xtra_data(byte[] data, int length);
// SUPL Support
+ private native void native_supl_data_conn_open(String apn);
+ private native void native_supl_data_conn_closed();
+ private native void native_supl_data_conn_failed();
private native void native_set_supl_server(int addr, int port);
- private native void native_set_supl_apn(String apn);
}
diff --git a/location/java/com/android/internal/location/LocationProviderProxy.java b/location/java/com/android/internal/location/LocationProviderProxy.java
index 1f4940f..72dd07d 100644
--- a/location/java/com/android/internal/location/LocationProviderProxy.java
+++ b/location/java/com/android/internal/location/LocationProviderProxy.java
@@ -222,52 +222,35 @@ public class LocationProviderProxy extends LocationProviderImpl {
}
}
- public void updateCellLockStatus(boolean acquired) {
+ public void addListener(int uid) {
try {
- mProvider.updateCellLockStatus(acquired);
- } catch (RemoteException e) {
- Log.e(TAG, "updateCellLockStatus failed", e);
- }
- }
-
- public void addListener(String[] applications) {
- try {
- mProvider.addListener(applications);
+ mProvider.addListener(uid);
} catch (RemoteException e) {
Log.e(TAG, "addListener failed", e);
}
}
- public void removeListener(String[] applications) {
+ public void removeListener(int uid) {
try {
- mProvider.removeListener(applications);
+ mProvider.removeListener(uid);
} catch (RemoteException e) {
Log.e(TAG, "removeListener failed", e);
}
}
- public String getFromLocation(double latitude, double longitude, int maxResults,
- String language, String country, String variant, String appName, List<Address> addrs) {
+ public void wakeLockAcquired() {
try {
- return mProvider.getFromLocation(latitude, longitude, maxResults, language, country,
- variant, appName, addrs);
+ mProvider.wakeLockAcquired();
} catch (RemoteException e) {
- Log.e(TAG, "getFromLocation failed", e);
- return null;
+ Log.e(TAG, "wakeLockAcquired failed", e);
}
}
- public String getFromLocationName(String locationName,
- double lowerLeftLatitude, double lowerLeftLongitude,
- double upperRightLatitude, double upperRightLongitude, int maxResults,
- String language, String country, String variant, String appName, List<Address> addrs) {
+ public void wakeLockReleased() {
try {
- return mProvider.getFromLocationName(locationName, lowerLeftLatitude,
- lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
- maxResults, language, country, variant, appName, addrs);
+ mProvider.wakeLockReleased();
} catch (RemoteException e) {
- Log.e(TAG, "getFromLocationName failed", e);
- return null;
+ Log.e(TAG, "wakeLockReleased failed", e);
}
}
}