diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 679c91d7ae960..5d24d69caff7c 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -187,6 +187,14 @@ public class AppOpsManager { return null; } + public List getOpsForPackage(int uid, String packageName, int[] ops) { + try { + return mService.getOpsForPackage(uid, packageName, ops); + } catch (RemoteException e) { + } + return null; + } + public int checkOp(int op, int uid, String packageName) { try { int mode = mService.checkOperation(op, uid, packageName); diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index 827dba66d5c2c..a4eb4c5208494 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -20,6 +20,7 @@ import android.app.AppOpsManager; interface IAppOpsService { List getPackagesForOps(in int[] ops); + List getOpsForPackage(int uid, String packageName, in int[] ops); int checkOperation(int code, int uid, String packageName); int noteOperation(int code, int uid, String packageName); int startOperation(int code, int uid, String packageName); diff --git a/services/java/com/android/server/AppOpsService.java b/services/java/com/android/server/AppOpsService.java index 17128062b0a10..3d9ddaebf2d1e 100644 --- a/services/java/com/android/server/AppOpsService.java +++ b/services/java/com/android/server/AppOpsService.java @@ -127,6 +127,30 @@ public class AppOpsService extends IAppOpsService.Stub { } } + private ArrayList collectOps(Ops pkgOps, int[] ops) { + ArrayList resOps = null; + if (ops == null) { + resOps = new ArrayList(); + for (int j=0; j(); + } + resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.time, + curOp.duration)); + } + } + } + return resOps; + } + @Override public List getPackagesForOps(int[] ops) { mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS, @@ -136,26 +160,7 @@ public class AppOpsService extends IAppOpsService.Stub { for (int i=0; i packages = mUidOps.valueAt(i); for (Ops pkgOps : packages.values()) { - ArrayList resOps = null; - if (ops == null) { - resOps = new ArrayList(); - for (int j=0; j(); - } - resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.time, - curOp.duration)); - } - } - } + ArrayList resOps = collectOps(pkgOps, ops); if (resOps != null) { if (res == null) { res = new ArrayList(); @@ -170,6 +175,28 @@ public class AppOpsService extends IAppOpsService.Stub { return res; } + @Override + public List getOpsForPackage(int uid, String packageName, + int[] ops) { + mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS, + Binder.getCallingPid(), Binder.getCallingUid(), null); + synchronized (this) { + Ops pkgOps = getOpsLocked(uid, packageName, false); + if (pkgOps == null) { + return null; + } + ArrayList resOps = collectOps(pkgOps, ops); + if (resOps == null) { + return null; + } + ArrayList res = new ArrayList(); + AppOpsManager.PackageOps resPackage = new AppOpsManager.PackageOps( + pkgOps.packageName, pkgOps.uid, resOps); + res.add(resPackage); + return res; + } + } + @Override public int checkOperation(int code, int uid, String packageName) { uid = handleIncomingUid(uid); @@ -252,7 +279,7 @@ public class AppOpsService extends IAppOpsService.Stub { return uid; } - private Op getOpLocked(int code, int uid, String packageName, boolean edit) { + private Ops getOpsLocked(int uid, String packageName, boolean edit) { HashMap pkgOps = mUidOps.get(uid); if (pkgOps == null) { if (!edit) { @@ -289,6 +316,14 @@ public class AppOpsService extends IAppOpsService.Stub { ops = new Ops(packageName, uid); pkgOps.put(packageName, ops); } + return ops; + } + + private Op getOpLocked(int code, int uid, String packageName, boolean edit) { + Ops ops = getOpsLocked(uid, packageName, edit); + if (ops == null) { + return null; + } Op op = ops.get(code); if (op == null) { if (!edit) {