diff options
Diffstat (limited to 'services/java/com/android/server/LocationManagerService.java')
-rw-r--r-- | services/java/com/android/server/LocationManagerService.java | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index 231cfe14c0c8..c6c9845979ad 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -47,7 +47,6 @@ import android.location.LocationRequest; import android.os.Binder; import android.os.Bundle; import android.os.Handler; -import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.Message; @@ -222,6 +221,9 @@ public class LocationManagerService extends ILocationManager.Stub { AppOpsManager.Callback callback = new AppOpsManager.Callback() { public void opChanged(int op, String packageName) { synchronized (mLock) { + for (Receiver receiver : mReceivers.values()) { + receiver.updateMonitoring(true); + } applyAllProviderRequirementsLocked(); } } @@ -460,6 +462,7 @@ public class LocationManagerService extends ILocationManager.Stub { final HashMap<String,UpdateRecord> mUpdateRecords = new HashMap<String,UpdateRecord>(); + boolean mOpMonitoring; int mPendingBroadcasts; PowerManager.WakeLock mWakeLock; @@ -477,6 +480,8 @@ public class LocationManagerService extends ILocationManager.Stub { mPid = pid; mPackageName = packageName; + updateMonitoring(true); + // construct/configure wakelock mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY); mWakeLock.setWorkSource(new WorkSource(mUid, mPackageName)); @@ -512,6 +517,21 @@ public class LocationManagerService extends ILocationManager.Stub { return s.toString(); } + public void updateMonitoring(boolean allow) { + if (!mOpMonitoring) { + if (allow) { + mOpMonitoring = mAppOps.startOpNoThrow(AppOpsManager.OP_MONITOR_LOCATION, + mUid, mPackageName) == AppOpsManager.MODE_ALLOWED; + } + } else { + if (!allow || mAppOps.checkOpNoThrow(AppOpsManager.OP_MONITOR_LOCATION, + mUid, mPackageName) != AppOpsManager.MODE_ALLOWED) { + mAppOps.finishOp(AppOpsManager.OP_MONITOR_LOCATION, mUid, mPackageName); + mOpMonitoring = false; + } + } + } + public boolean isListener() { return mListener != null; } @@ -1366,6 +1386,8 @@ public class LocationManagerService extends ILocationManager.Stub { } } + receiver.updateMonitoring(false); + // Record which providers were associated with this listener HashSet<String> providers = new HashSet<String>(); HashMap<String, UpdateRecord> oldRecords = receiver.mUpdateRecords; |