From 2f3a615feaa1286612576bc15f6bd8cae011301f Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Mon, 7 Dec 2009 18:43:36 -0500 Subject: [PATCH 1/5] GpsLocationProvider: Do not release wakelock until the GPS engine is fully off Change-Id: I705b1d33af2d70aa1084cca8f6280fade9461d2c Signed-off-by: Mike Lockwood --- .../location/GpsLocationProvider.java | 72 +++++++++---------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index cd62ed196e6ce..7763549ee1e55 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--; } + + // 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); } - 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); - - if (!mNavigating) { + if (status == GPS_STATUS_ENGINE_OFF && mWakeLock.isHeld()) { if (DEBUG) Log.d(TAG, "Releasing wakelock"); mWakeLock.release(); } From c2a6738215af95bc50639e43c8f9291a0d521b37 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Wed, 20 Jan 2010 10:14:54 -0500 Subject: [PATCH 2/5] Be tolerant of GPS session and engine on status messages arriving out of order. BUG: 2366194 Change-Id: Iac152cc46f3647e12c9077f1bfa4183f19ac94b6 Signed-off-by: Mike Lockwood --- .../location/GpsLocationProvider.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index 7763549ee1e55..134756eceb52d 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(); } From 8ab11f87acf01b830ad0db46ec549406b33c39de Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Tue, 2 Feb 2010 11:41:52 -0500 Subject: [PATCH 3/5] 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 --- .../java/com/android/internal/location/GpsLocationProvider.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index 134756eceb52d..1fe3d05ba6526 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; } From 4766defdd0778d7e0a656179d03a4865a9a40523 Mon Sep 17 00:00:00 2001 From: Andreas Agvard Date: Fri, 5 Feb 2010 08:16:01 +0100 Subject: [PATCH 4/5] Fixed Android animation framework, for using interpolators that do not start at 0.0f There is a bug that affects interpolators that do not return 0.0f when given 0.0f as input. All default interpolators in Android do return 0.0f, which is why it hasn't been noticed. Some custom interpolators can for example run backwards, returning 1.0f when given input 0.0f. --- core/java/android/view/animation/Animation.java | 2 +- core/java/android/view/animation/AnimationSet.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java index c8396c4d49799..000e4ceded229 100644 --- a/core/java/android/view/animation/Animation.java +++ b/core/java/android/view/animation/Animation.java @@ -880,7 +880,7 @@ public abstract class Animation implements Cloneable { region.inset(-1.0f, -1.0f); if (mFillBefore) { final Transformation previousTransformation = mPreviousTransformation; - applyTransformation(0.0f, previousTransformation); + applyTransformation(mInterpolator.getInterpolation(0.0f), previousTransformation); } } diff --git a/core/java/android/view/animation/AnimationSet.java b/core/java/android/view/animation/AnimationSet.java index 98b259451ae18..1546dcd763bd8 100644 --- a/core/java/android/view/animation/AnimationSet.java +++ b/core/java/android/view/animation/AnimationSet.java @@ -282,7 +282,9 @@ public class AnimationSet extends Animation { final Animation a = animations.get(i); temp.clear(); - a.applyTransformation(0.0f, temp); + final Interpolator interpolator = a.mInterpolator; + a.applyTransformation(interpolator != null ? interpolator.getInterpolation(0.0f) + : 0.0f, temp); previousTransformation.compose(temp); } } From 8621cfa43fd12b5ad1376eb1a2454729ce9d9c7e Mon Sep 17 00:00:00 2001 From: Marc Capdevielle Date: Fri, 5 Feb 2010 19:28:23 +0100 Subject: [PATCH 5/5] Fix x coordinate of the ACTION_UP event in TouchUtils.drag() method The ACTION_UP event was fired at the "fromX" position instead of being fired at the "toX" position which is the current value of local var "x". This bug had no real impact as the VelocityTracker always ignores the last MotionEvent when it received more than 3 events... --- test-runner/android/test/TouchUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test-runner/android/test/TouchUtils.java b/test-runner/android/test/TouchUtils.java index 962b2f9aab300..69c6d2d57d00e 100644 --- a/test-runner/android/test/TouchUtils.java +++ b/test-runner/android/test/TouchUtils.java @@ -773,7 +773,7 @@ public class TouchUtils { float xStep = (toX - fromX) / stepCount; MotionEvent event = MotionEvent.obtain(downTime, eventTime, - MotionEvent.ACTION_DOWN, fromX, y, 0); + MotionEvent.ACTION_DOWN, x, y, 0); inst.sendPointerSync(event); inst.waitForIdleSync(); @@ -787,7 +787,7 @@ public class TouchUtils { } eventTime = SystemClock.uptimeMillis(); - event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, fromX, y, 0); + event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, 0); inst.sendPointerSync(event); inst.waitForIdleSync(); }