diff options
author | Dianne Hackborn <hackbod@google.com> | 2013-07-09 18:17:27 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2013-07-09 18:17:27 -0700 |
commit | 1304f4ae32cf7121fe11e95f2a7151ea208b6cca (patch) | |
tree | dd12520fcec8cd88f79eb53e4b71562a9f208bd7 /services/java/com/android/server/LocationManagerService.java | |
parent | 607c6e2a56eb9699b8ec10c6594f8a6eb8feafc4 (diff) |
Add new location monitoring op, make some of app ops public.
The new location monitoring op is to tell us when an application
is monitoring for any location changes. It may be useful information
in addition to the more explicitly information about when location
data actually goes to the app.
Also make parts of AppOpsManager public for use by gcore. It is
not available to third party apps.
Change-Id: Ib639f704258ffdd7f3acd7567350ed2539da628a
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; |