Merge "Be tolerant of GPS session and engine on status messages arriving out of order." into eclair
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java
index 7763549..134756e 100755
--- a/location/java/com/android/internal/location/GpsLocationProvider.java
+++ b/location/java/com/android/internal/location/GpsLocationProvider.java
@@ -182,6 +182,9 @@
 
     // 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 @@
             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 @@
 
         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 @@
                 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();
             }