summaryrefslogtreecommitdiffstats
path: root/location/java/com
diff options
context:
space:
mode:
authorMike Lockwood <>2009-04-03 08:24:43 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-04-03 08:24:43 -0700
commit4e50b78bda9cd58be61581d2886c88ff6348a1c1 (patch)
treee94551d77542bc0a06844d536e1eface70005dde /location/java/com
parente84de8d702bd26fb1e5b55f3cfdd953d8a31ec22 (diff)
downloadframeworks_base-4e50b78bda9cd58be61581d2886c88ff6348a1c1.zip
frameworks_base-4e50b78bda9cd58be61581d2886c88ff6348a1c1.tar.gz
frameworks_base-4e50b78bda9cd58be61581d2886c88ff6348a1c1.tar.bz2
AI 144452: More Location Manager cleanup:
Remove 1 Hz "heartbeat" polling of location providers from LocationManagerService. Now location providers report their location to LocationManagerService via LocationManager.setLocation() rather than waiting to be polled. This reduces GPS fix latency by up to one second. Remove LocationProvderImpl.getLocation(). Since we are no longer polling, this method is no longer necessary. BUG=1729031 Automated import of CL 144452
Diffstat (limited to 'location/java/com')
-rw-r--r--location/java/com/android/internal/location/GpsLocationProvider.java24
-rw-r--r--location/java/com/android/internal/location/INetworkLocationProvider.java5
-rw-r--r--location/java/com/android/internal/location/MockProvider.java45
-rw-r--r--location/java/com/android/internal/location/TrackProvider.java86
4 files changed, 67 insertions, 93 deletions
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java
index f595050..d09318a 100644
--- a/location/java/com/android/internal/location/GpsLocationProvider.java
+++ b/location/java/com/android/internal/location/GpsLocationProvider.java
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.location.Criteria;
import android.location.IGpsStatusListener;
+import android.location.ILocationManager;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
@@ -209,8 +210,8 @@ public class GpsLocationProvider extends LocationProviderImpl {
return native_is_supported();
}
- public GpsLocationProvider(Context context) {
- super(LocationManager.GPS_PROVIDER);
+ public GpsLocationProvider(Context context, ILocationManager locationManager) {
+ super(LocationManager.GPS_PROVIDER, locationManager);
mContext = context;
TelephonyBroadcastReceiver receiver = new TelephonyBroadcastReceiver();
@@ -355,7 +356,7 @@ public class GpsLocationProvider extends LocationProviderImpl {
/**
* Enables this provider. When enabled, calls to getStatus()
- * and getLocation() must be handled. Hardware may be started up
+ * must be handled. Hardware may be started up
* when the provider is enabled.
*/
@Override
@@ -385,7 +386,7 @@ public class GpsLocationProvider extends LocationProviderImpl {
/**
* Disables this provider. When disabled, calls to getStatus()
- * and getLocation() need not be handled. Hardware may be shut
+ * need not be handled. Hardware may be shut
* down while the provider is disabled.
*/
@Override
@@ -449,19 +450,6 @@ public class GpsLocationProvider extends LocationProviderImpl {
}
@Override
- public boolean getLocation(Location l) {
- synchronized (mLocation) {
- // don't report locations without latitude and longitude
- if ((mLocationFlags & LOCATION_HAS_LAT_LONG) == 0) {
- return false;
- }
- l.set(mLocation);
- l.setExtras(mLocationExtras);
- return true;
- }
- }
-
- @Override
public void enableLocationTracking(boolean enable) {
if (mLocationTracking == enable) {
return;
@@ -685,6 +673,8 @@ public class GpsLocationProvider extends LocationProviderImpl {
mLocation.removeAccuracy();
}
+ reportLocationChanged(mLocation);
+
// Send to collector
if ((flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG
&& mCollector != null) {
diff --git a/location/java/com/android/internal/location/INetworkLocationProvider.java b/location/java/com/android/internal/location/INetworkLocationProvider.java
index 730cb48..f8947a6 100644
--- a/location/java/com/android/internal/location/INetworkLocationProvider.java
+++ b/location/java/com/android/internal/location/INetworkLocationProvider.java
@@ -20,12 +20,7 @@ import android.location.Address;
import android.location.Location;
import android.net.wifi.ScanResult;
-import com.google.common.io.protocol.ProtoBuf;
-
-import java.io.IOException;
-import java.util.Collection;
import java.util.List;
-import java.util.Locale;
/**
* Interface for network location provider
diff --git a/location/java/com/android/internal/location/MockProvider.java b/location/java/com/android/internal/location/MockProvider.java
index bd5cdd8..c8d5b4f 100644
--- a/location/java/com/android/internal/location/MockProvider.java
+++ b/location/java/com/android/internal/location/MockProvider.java
@@ -16,6 +16,7 @@
package com.android.internal.location;
+import android.location.ILocationManager;
import android.location.Location;
import android.location.LocationProviderImpl;
import android.os.Bundle;
@@ -46,10 +47,11 @@ public class MockProvider extends LocationProviderImpl {
private boolean mHasStatus;
private boolean mEnabled;
- public MockProvider(String name, boolean requiresNetwork, boolean requiresSatellite,
+ public MockProvider(String name, ILocationManager locationManager,
+ boolean requiresNetwork, boolean requiresSatellite,
boolean requiresCell, boolean hasMonetaryCost, boolean supportsAltitude,
boolean supportsSpeed, boolean supportsBearing, int powerRequirement, int accuracy) {
- super(name);
+ super(name, locationManager);
mRequiresNetwork = requiresNetwork;
mRequiresSatellite = requiresSatellite;
@@ -74,15 +76,6 @@ public class MockProvider extends LocationProviderImpl {
}
@Override
- public boolean getLocation(Location l) {
- if (mHasLocation) {
- l.set(mLocation);
- return true;
- }
- return false;
- }
-
- @Override
public int getStatus(Bundle extras) {
if (mHasStatus) {
extras.clear();
@@ -94,6 +87,11 @@ public class MockProvider extends LocationProviderImpl {
}
@Override
+ public long getStatusUpdateTime() {
+ return mStatusUpdateTime;
+ }
+
+ @Override
public boolean isEnabled() {
return mEnabled;
}
@@ -146,6 +144,7 @@ public class MockProvider extends LocationProviderImpl {
public void setLocation(Location l) {
mLocation.set(l);
mHasLocation = true;
+ reportLocationChanged(mLocation);
}
public void clearLocation() {
@@ -164,29 +163,7 @@ public class MockProvider extends LocationProviderImpl {
public void clearStatus() {
mHasStatus = false;
- }
-
- public int overrideStatus(int status) {
- if (mHasStatus) {
- return mStatus;
- } else {
- return status;
- }
- }
-
- public long overrideStatusUpdateTime(long statusUpdateTime) {
- if (mHasStatus) {
- return mStatusUpdateTime;
- } else {
- return statusUpdateTime;
- }
- }
-
- public void overrideExtras(Bundle extras) {
- if (mHasStatus) {
- extras.clear();
- extras.putAll(mExtras);
- }
+ mStatusUpdateTime = 0;
}
public void dump(PrintWriter pw, String prefix) {
diff --git a/location/java/com/android/internal/location/TrackProvider.java b/location/java/com/android/internal/location/TrackProvider.java
index 545d7dc..1686260 100644
--- a/location/java/com/android/internal/location/TrackProvider.java
+++ b/location/java/com/android/internal/location/TrackProvider.java
@@ -16,6 +16,7 @@ import java.util.List;
import java.util.StringTokenizer;
import android.location.Criteria;
+import android.location.ILocationManager;
import android.location.Location;
import android.location.LocationProviderImpl;
import android.os.Bundle;
@@ -50,6 +51,7 @@ public class TrackProvider extends LocationProviderImpl {
private static final long INTERVAL = 1000L;
private boolean mEnabled = true;
+ private TrackProviderThread mThread;
private double mLatitude;
private double mLongitude;
@@ -86,6 +88,36 @@ public class TrackProvider extends LocationProviderImpl {
private Location mInitialLocation;
+ private class TrackProviderThread extends Thread {
+
+ private boolean mDone = false;
+
+ public TrackProviderThread() {
+ super("TrackProviderThread");
+ }
+
+ public void run() {
+ // thread exits after disable() is called
+ synchronized (this) {
+ while (!mDone) {
+ try {
+ wait(INTERVAL);
+ } catch (InterruptedException e) {
+ }
+
+ if (!mDone) {
+ TrackProvider.this.update();
+ }
+ }
+ }
+ }
+
+ synchronized void setDone() {
+ mDone = true;
+ notify();
+ }
+ }
+
private void close(Reader rdr) {
try {
if (rdr != null) {
@@ -392,13 +424,13 @@ public class TrackProvider extends LocationProviderImpl {
}
}
- public TrackProvider(String name) {
- super(name);
+ public TrackProvider(String name, ILocationManager locationManager) {
+ super(name, locationManager);
setTimes();
}
- public TrackProvider(String name, File file) {
- this(name);
+ public TrackProvider(String name, ILocationManager locationManager, File file) {
+ this(name, locationManager);
String filename = file.getName();
if (filename.endsWith("kml")) {
@@ -429,12 +461,7 @@ public class TrackProvider extends LocationProviderImpl {
}
private void update() {
- // Don't update the position at all unless INTERVAL milliseconds
- // have passed since the last request
long time = System.currentTimeMillis() - mBaseTime;
- if (time - mLastTime < INTERVAL) {
- return;
- }
List<Waypoint> waypoints = mWaypoints;
if (waypoints == null) {
@@ -594,12 +621,22 @@ public class TrackProvider extends LocationProviderImpl {
mTrackSpeed = trackSpeed;
}
- @Override public void enable() {
- mEnabled = true;
+ @Override public synchronized void enable() {
+ mEnabled = true;
+ mThread = new TrackProviderThread();
+ mThread.start();
}
- @Override public void disable() {
+ @Override public synchronized void disable() {
mEnabled = false;
+ if (mThread != null) {
+ mThread.setDone();
+ try {
+ mThread.join();
+ } catch (InterruptedException e) {
+ }
+ mThread = null;
+ }
}
@Override public boolean isEnabled() {
@@ -610,31 +647,6 @@ public class TrackProvider extends LocationProviderImpl {
return AVAILABLE;
}
- @Override public boolean getLocation(Location l) {
- if (mEnabled) {
- update();
- l.setProvider(getName());
- l.setTime(mTime + mBaseTime);
- l.setLatitude(mLatitude);
- l.setLongitude(mLongitude);
- if (mSupportsAltitude && mHasAltitude) {
- l.setAltitude(mAltitude);
- }
- if (mSupportsBearing && mHasBearing) {
- l.setBearing(mBearing);
- }
- if (mSupportsSpeed && mHasSpeed) {
- l.setSpeed(mSpeed);
- }
- if (mExtras != null) {
- l.setExtras(mExtras);
- }
- return true;
- } else {
- return false;
- }
- }
-
public Location getInitialLocation() {
return mInitialLocation;
}