summaryrefslogtreecommitdiffstats
path: root/core/java/android/app
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2013-07-17 17:23:25 -0700
committerDianne Hackborn <hackbod@google.com>2013-07-17 17:25:13 -0700
commite98f5dbe6b6f9f2cb6a73ee750faacda2596b34f (patch)
tree37817f45c1efd4f1338c2ec190e58e30d4f1c541 /core/java/android/app
parent209bede6b9edb9171e5bee4077b48e35004a37b4 (diff)
downloadframeworks_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.java25
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) {
}
}