diff options
| author | Dianne Hackborn <hackbod@google.com> | 2013-07-17 17:23:25 -0700 |
|---|---|---|
| committer | Dianne Hackborn <hackbod@google.com> | 2013-07-17 17:25:13 -0700 |
| commit | e98f5dbe6b6f9f2cb6a73ee750faacda2596b34f (patch) | |
| tree | 37817f45c1efd4f1338c2ec190e58e30d4f1c541 /core/java/android/app | |
| parent | 209bede6b9edb9171e5bee4077b48e35004a37b4 (diff) | |
| download | frameworks_base-e98f5dbe6b6f9f2cb6a73ee750faacda2596b34f.zip frameworks_base-e98f5dbe6b6f9f2cb6a73ee750faacda2596b34f.tar.gz frameworks_base-e98f5dbe6b6f9f2cb6a73ee750faacda2596b34f.tar.bz2 | |
Make it safe to use start/stop app ops outside of system proc
We now keep track of all of the active start operations per
non-system process, so they can be cleaned up if the process
goes away.
Change-Id: I9d05f1e0281c47dbe1213de014f0491f1359685c
Diffstat (limited to 'core/java/android/app')
| -rw-r--r-- | core/java/android/app/AppOpsManager.java | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index c22de0c..8d47236 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -16,6 +16,8 @@ package android.app; +import android.os.Binder; +import android.os.IBinder; import android.util.ArrayMap; import com.android.internal.app.IAppOpsService; import com.android.internal.app.IAppOpsCallback; @@ -55,6 +57,8 @@ public class AppOpsManager { final ArrayMap<Callback, IAppOpsCallback> mModeWatchers = new ArrayMap<Callback, IAppOpsCallback>(); + static IBinder sToken; + public static final int MODE_ALLOWED = 0; public static final int MODE_IGNORED = 1; public static final int MODE_ERRORED = 2; @@ -640,6 +644,21 @@ public class AppOpsManager { return noteOp(op, Process.myUid(), mContext.getBasePackageName()); } + /** @hide */ + public static IBinder getToken(IAppOpsService service) { + synchronized (AppOpsManager.class) { + if (sToken != null) { + return sToken; + } + try { + sToken = service.getToken(new Binder()); + } catch (RemoteException e) { + // System is dead, whatevs. + } + return sToken; + } + } + /** * Report that an application has started executing a long-running operation. Note that you * must pass in both the uid and name of the application to be checked; this function will @@ -658,7 +677,7 @@ public class AppOpsManager { */ public int startOp(int op, int uid, String packageName) { try { - int mode = mService.startOperation(op, uid, packageName); + int mode = mService.startOperation(getToken(mService), op, uid, packageName); if (mode == MODE_ERRORED) { throw new SecurityException("Operation not allowed"); } @@ -674,7 +693,7 @@ public class AppOpsManager { */ public int startOpNoThrow(int op, int uid, String packageName) { try { - return mService.startOperation(op, uid, packageName); + return mService.startOperation(getToken(mService), op, uid, packageName); } catch (RemoteException e) { } return MODE_IGNORED; @@ -693,7 +712,7 @@ public class AppOpsManager { */ public void finishOp(int op, int uid, String packageName) { try { - mService.finishOperation(op, uid, packageName); + mService.finishOperation(getToken(mService), op, uid, packageName); } catch (RemoteException e) { } } |
