From 2f3a615feaa1286612576bc15f6bd8cae011301f Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Mon, 7 Dec 2009 18:43:36 -0500 Subject: GpsLocationProvider: Do not release wakelock until the GPS engine is fully off Change-Id: I705b1d33af2d70aa1084cca8f6280fade9461d2c Signed-off-by: Mike Lockwood --- .../internal/location/GpsLocationProvider.java | 70 +++++++++++----------- 1 file changed, 34 insertions(+), 36 deletions(-) (limited to 'location/java/com') diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index cd62ed196e6c..7763549ee1e5 100755 --- a/location/java/com/android/internal/location/GpsLocationProvider.java +++ b/location/java/com/android/internal/location/GpsLocationProvider.java @@ -875,53 +875,51 @@ public class GpsLocationProvider extends ILocationProvider.Stub { synchronized(mListeners) { boolean wasNavigating = mNavigating; mNavigating = (status == GPS_STATUS_SESSION_BEGIN); - - if (wasNavigating == mNavigating) { - return; - } - - if (mNavigating) { + + if (mNavigating && !mWakeLock.isHeld()) { if (DEBUG) Log.d(TAG, "Acquiring wakelock"); mWakeLock.acquire(); } - - int size = mListeners.size(); - for (int i = 0; i < size; i++) { - Listener listener = mListeners.get(i); + + if (wasNavigating != mNavigating) { + int size = mListeners.size(); + for (int i = 0; i < size; i++) { + Listener listener = mListeners.get(i); + try { + if (mNavigating) { + listener.mListener.onGpsStarted(); + } else { + listener.mListener.onGpsStopped(); + } + } catch (RemoteException e) { + Log.w(TAG, "RemoteException in reportStatus"); + mListeners.remove(listener); + // adjust for size of list changing + size--; + } + } + try { - if (mNavigating) { - listener.mListener.onGpsStarted(); - } else { - listener.mListener.onGpsStopped(); + // 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"); - mListeners.remove(listener); - // adjust for size of list changing - size--; } - } - 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); + mContext.sendBroadcast(intent); } - // 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); - mContext.sendBroadcast(intent); - - if (!mNavigating) { + if (status == GPS_STATUS_ENGINE_OFF && mWakeLock.isHeld()) { if (DEBUG) Log.d(TAG, "Releasing wakelock"); mWakeLock.release(); } -- cgit v1.2.3-59-g8ed1b From c2a6738215af95bc50639e43c8f9291a0d521b37 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Wed, 20 Jan 2010 10:14:54 -0500 Subject: Be tolerant of GPS session and engine on status messages arriving out of order. BUG: 2366194 Change-Id: Iac152cc46f3647e12c9077f1bfa4183f19ac94b6 Signed-off-by: Mike Lockwood --- .../internal/location/GpsLocationProvider.java | 33 ++++++++++++++++++---- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'location/java/com') diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index 7763549ee1e5..134756eceb52 100755 --- a/location/java/com/android/internal/location/GpsLocationProvider.java +++ b/location/java/com/android/internal/location/GpsLocationProvider.java @@ -182,6 +182,9 @@ public class GpsLocationProvider extends ILocationProvider.Stub { // true if GPS is navigating private boolean mNavigating; + + // true if GPS engine is on + private boolean mEngineOn; // requested frequency of fixes, in seconds private int mFixInterval = 1; @@ -556,13 +559,17 @@ public class GpsLocationProvider extends ILocationProvider.Stub { mNetworkThread = null; } + // do this before releasing wakelock + native_cleanup(); + // The GpsEventThread does not wait for the GPS to shutdown // so we need to report the GPS_STATUS_ENGINE_OFF event here if (mNavigating) { + reportStatus(GPS_STATUS_SESSION_END); + } + if (mEngineOn) { reportStatus(GPS_STATUS_ENGINE_OFF); } - - native_cleanup(); } public boolean isEnabled() { @@ -874,9 +881,24 @@ public class GpsLocationProvider extends ILocationProvider.Stub { synchronized(mListeners) { boolean wasNavigating = mNavigating; - mNavigating = (status == GPS_STATUS_SESSION_BEGIN); - if (mNavigating && !mWakeLock.isHeld()) { + switch (status) { + case GPS_STATUS_SESSION_BEGIN: + mNavigating = true; + break; + case GPS_STATUS_SESSION_END: + mNavigating = false; + break; + case GPS_STATUS_ENGINE_ON: + mEngineOn = true; + break; + case GPS_STATUS_ENGINE_OFF: + mEngineOn = false; + break; + } + + // beware, the events can come out of order + if ((mNavigating || mEngineOn) && !mWakeLock.isHeld()) { if (DEBUG) Log.d(TAG, "Acquiring wakelock"); mWakeLock.acquire(); } @@ -919,7 +941,8 @@ public class GpsLocationProvider extends ILocationProvider.Stub { mContext.sendBroadcast(intent); } - if (status == GPS_STATUS_ENGINE_OFF && mWakeLock.isHeld()) { + // beware, the events can come out of order + if (!mNavigating && !mEngineOn && mWakeLock.isHeld()) { if (DEBUG) Log.d(TAG, "Releasing wakelock"); mWakeLock.release(); } -- cgit v1.2.3-59-g8ed1b From 8ab11f87acf01b830ad0db46ec549406b33c39de Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Tue, 2 Feb 2010 11:41:52 -0500 Subject: Fix for GPS engines without separate session and engine status events. GPS_STATUS_SESSION_BEGIN now implies GPS_STATUS_ENGINE_ON and GPS_STATUS_ENGINE_OFF now implies GPS_STATUS_SESSION_END. Change-Id: Ifeeb1d5094d1e7304974b7c3ac27dd83b1e65bca Signed-off-by: Mike Lockwood --- location/java/com/android/internal/location/GpsLocationProvider.java | 2 ++ 1 file changed, 2 insertions(+) (limited to 'location/java/com') diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index 134756eceb52..1fe3d05ba652 100755 --- a/location/java/com/android/internal/location/GpsLocationProvider.java +++ b/location/java/com/android/internal/location/GpsLocationProvider.java @@ -885,6 +885,7 @@ public class GpsLocationProvider extends ILocationProvider.Stub { switch (status) { case GPS_STATUS_SESSION_BEGIN: mNavigating = true; + mEngineOn = true; break; case GPS_STATUS_SESSION_END: mNavigating = false; @@ -894,6 +895,7 @@ public class GpsLocationProvider extends ILocationProvider.Stub { break; case GPS_STATUS_ENGINE_OFF: mEngineOn = false; + mNavigating = false; break; } -- cgit v1.2.3-59-g8ed1b