Loading services/core/java/com/android/server/AppOpsService.java +68 −17 Original line number Diff line number Diff line Loading @@ -191,17 +191,37 @@ public class AppOpsService extends IAppOpsService.Stub { public final class ModeCallback implements DeathRecipient { final IAppOpsCallback mCallback; final int mUid; final int mWatchingUid; final int mCallingUid; final int mCallingPid; public ModeCallback(IAppOpsCallback callback, int uid) { public ModeCallback(IAppOpsCallback callback, int watchingUid, int callingUid, int callingPid) { mCallback = callback; mUid = uid; mWatchingUid = watchingUid; mCallingUid = callingUid; mCallingPid = callingPid; try { mCallback.asBinder().linkToDeath(this, 0); } catch (RemoteException e) { } } @Override public String toString() { StringBuilder sb = new StringBuilder(128); sb.append("ModeCallback{"); sb.append(Integer.toHexString(System.identityHashCode(this))); sb.append(" watchinguid="); UserHandle.formatUid(sb, mWatchingUid); sb.append(" from uid="); UserHandle.formatUid(sb, mCallingUid); sb.append(" pid="); sb.append(mCallingPid); sb.append('}'); return sb.toString(); } public void unlinkToDeath() { mCallback.asBinder().unlinkToDeath(this, 0); } Loading @@ -214,17 +234,37 @@ public class AppOpsService extends IAppOpsService.Stub { public final class ActiveCallback implements DeathRecipient { final IAppOpsActiveCallback mCallback; final int mUid; final int mWatchingUid; final int mCallingUid; final int mCallingPid; public ActiveCallback(IAppOpsActiveCallback callback, int uid) { public ActiveCallback(IAppOpsActiveCallback callback, int watchingUid, int callingUid, int callingPid) { mCallback = callback; mUid = uid; mWatchingUid = watchingUid; mCallingUid = callingUid; mCallingPid = callingPid; try { mCallback.asBinder().linkToDeath(this, 0); } catch (RemoteException e) { } } @Override public String toString() { StringBuilder sb = new StringBuilder(128); sb.append("ActiveCallback{"); sb.append(Integer.toHexString(System.identityHashCode(this))); sb.append(" watchinguid="); UserHandle.formatUid(sb, mWatchingUid); sb.append(" from uid="); UserHandle.formatUid(sb, mCallingUid); sb.append(" pid="); sb.append(mCallingPid); sb.append('}'); return sb.toString(); } public void destroy() { mCallback.asBinder().unlinkToDeath(this, 0); } Loading Loading @@ -769,7 +809,7 @@ public class AppOpsService extends IAppOpsService.Stub { private void notifyOpChanged(ModeCallback callback, int code, int uid, String packageName) { if (uid != UID_ANY && callback.mUid >= 0 && callback.mUid != uid) { if (uid != UID_ANY && callback.mWatchingUid >= 0 && callback.mWatchingUid != uid) { return; } // There are components watching for mode changes such as window manager Loading Loading @@ -941,9 +981,11 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void startWatchingMode(int op, String packageName, IAppOpsCallback callback) { int watchedUid = -1; final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); if (mContext.checkCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS) != PackageManager.PERMISSION_GRANTED) { watchedUid = Binder.getCallingUid(); watchedUid = callingUid; } Preconditions.checkArgumentInRange(op, AppOpsManager.OP_NONE, AppOpsManager._NUM_OP - 1, "Invalid op code: " + op); Loading @@ -954,7 +996,7 @@ public class AppOpsService extends IAppOpsService.Stub { op = (op != AppOpsManager.OP_NONE) ? AppOpsManager.opToSwitch(op) : op; ModeCallback cb = mModeWatchers.get(callback.asBinder()); if (cb == null) { cb = new ModeCallback(callback, watchedUid); cb = new ModeCallback(callback, watchedUid, callingUid, callingPid); mModeWatchers.put(callback.asBinder(), cb); } if (op != AppOpsManager.OP_NONE) { Loading Loading @@ -1222,9 +1264,11 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void startWatchingActive(int[] ops, IAppOpsActiveCallback callback) { int watchedUid = -1; final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); if (mContext.checkCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS) != PackageManager.PERMISSION_GRANTED) { watchedUid = Binder.getCallingUid(); watchedUid = callingUid; } if (ops != null) { Preconditions.checkArrayElementsInRange(ops, 0, Loading @@ -1239,7 +1283,8 @@ public class AppOpsService extends IAppOpsService.Stub { callbacks = new SparseArray<>(); mActiveWatchers.put(callback.asBinder(), callbacks); } final ActiveCallback activeCallback = new ActiveCallback(callback, watchedUid); final ActiveCallback activeCallback = new ActiveCallback(callback, watchedUid, callingUid, callingPid); for (int op : ops) { callbacks.put(op, activeCallback); } Loading Loading @@ -1384,7 +1429,7 @@ public class AppOpsService extends IAppOpsService.Stub { final SparseArray<ActiveCallback> callbacks = mActiveWatchers.valueAt(i); ActiveCallback callback = callbacks.get(code); if (callback != null) { if (callback.mUid >= 0 && callback.mUid != uid) { if (callback.mWatchingUid >= 0 && callback.mWatchingUid != uid) { continue; } if (dispatchedCallbacks == null) { Loading Loading @@ -2477,8 +2522,9 @@ public class AppOpsService extends IAppOpsService.Stub { needSep = true; pw.println(" All op mode watchers:"); for (int i=0; i<mModeWatchers.size(); i++) { pw.print(" "); pw.print(mModeWatchers.keyAt(i)); pw.print(" -> "); pw.println(mModeWatchers.valueAt(i)); pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(mModeWatchers.keyAt(i)))); pw.print(": "); pw.println(mModeWatchers.valueAt(i)); } } if (mActiveWatchers.size() > 0) { Loading @@ -2489,8 +2535,11 @@ public class AppOpsService extends IAppOpsService.Stub { if (activeWatchers.size() <= 0) { continue; } pw.print(" "); pw.print(mActiveWatchers.keyAt(i)); pw.print(" -> ["); pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode( mActiveWatchers.keyAt(i)))); pw.println(" ->"); pw.print(" ["); final int opCount = activeWatchers.size(); for (i = 0; i < opCount; i++) { pw.print(AppOpsManager.opToName(activeWatchers.keyAt(i))); Loading @@ -2498,7 +2547,9 @@ public class AppOpsService extends IAppOpsService.Stub { pw.print(','); } } pw.print("]" ); pw.println(activeWatchers.valueAt(0)); pw.println("]"); pw.print(" "); pw.println(activeWatchers.valueAt(0)); } } if (mClients.size() > 0) { Loading Loading
services/core/java/com/android/server/AppOpsService.java +68 −17 Original line number Diff line number Diff line Loading @@ -191,17 +191,37 @@ public class AppOpsService extends IAppOpsService.Stub { public final class ModeCallback implements DeathRecipient { final IAppOpsCallback mCallback; final int mUid; final int mWatchingUid; final int mCallingUid; final int mCallingPid; public ModeCallback(IAppOpsCallback callback, int uid) { public ModeCallback(IAppOpsCallback callback, int watchingUid, int callingUid, int callingPid) { mCallback = callback; mUid = uid; mWatchingUid = watchingUid; mCallingUid = callingUid; mCallingPid = callingPid; try { mCallback.asBinder().linkToDeath(this, 0); } catch (RemoteException e) { } } @Override public String toString() { StringBuilder sb = new StringBuilder(128); sb.append("ModeCallback{"); sb.append(Integer.toHexString(System.identityHashCode(this))); sb.append(" watchinguid="); UserHandle.formatUid(sb, mWatchingUid); sb.append(" from uid="); UserHandle.formatUid(sb, mCallingUid); sb.append(" pid="); sb.append(mCallingPid); sb.append('}'); return sb.toString(); } public void unlinkToDeath() { mCallback.asBinder().unlinkToDeath(this, 0); } Loading @@ -214,17 +234,37 @@ public class AppOpsService extends IAppOpsService.Stub { public final class ActiveCallback implements DeathRecipient { final IAppOpsActiveCallback mCallback; final int mUid; final int mWatchingUid; final int mCallingUid; final int mCallingPid; public ActiveCallback(IAppOpsActiveCallback callback, int uid) { public ActiveCallback(IAppOpsActiveCallback callback, int watchingUid, int callingUid, int callingPid) { mCallback = callback; mUid = uid; mWatchingUid = watchingUid; mCallingUid = callingUid; mCallingPid = callingPid; try { mCallback.asBinder().linkToDeath(this, 0); } catch (RemoteException e) { } } @Override public String toString() { StringBuilder sb = new StringBuilder(128); sb.append("ActiveCallback{"); sb.append(Integer.toHexString(System.identityHashCode(this))); sb.append(" watchinguid="); UserHandle.formatUid(sb, mWatchingUid); sb.append(" from uid="); UserHandle.formatUid(sb, mCallingUid); sb.append(" pid="); sb.append(mCallingPid); sb.append('}'); return sb.toString(); } public void destroy() { mCallback.asBinder().unlinkToDeath(this, 0); } Loading Loading @@ -769,7 +809,7 @@ public class AppOpsService extends IAppOpsService.Stub { private void notifyOpChanged(ModeCallback callback, int code, int uid, String packageName) { if (uid != UID_ANY && callback.mUid >= 0 && callback.mUid != uid) { if (uid != UID_ANY && callback.mWatchingUid >= 0 && callback.mWatchingUid != uid) { return; } // There are components watching for mode changes such as window manager Loading Loading @@ -941,9 +981,11 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void startWatchingMode(int op, String packageName, IAppOpsCallback callback) { int watchedUid = -1; final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); if (mContext.checkCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS) != PackageManager.PERMISSION_GRANTED) { watchedUid = Binder.getCallingUid(); watchedUid = callingUid; } Preconditions.checkArgumentInRange(op, AppOpsManager.OP_NONE, AppOpsManager._NUM_OP - 1, "Invalid op code: " + op); Loading @@ -954,7 +996,7 @@ public class AppOpsService extends IAppOpsService.Stub { op = (op != AppOpsManager.OP_NONE) ? AppOpsManager.opToSwitch(op) : op; ModeCallback cb = mModeWatchers.get(callback.asBinder()); if (cb == null) { cb = new ModeCallback(callback, watchedUid); cb = new ModeCallback(callback, watchedUid, callingUid, callingPid); mModeWatchers.put(callback.asBinder(), cb); } if (op != AppOpsManager.OP_NONE) { Loading Loading @@ -1222,9 +1264,11 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void startWatchingActive(int[] ops, IAppOpsActiveCallback callback) { int watchedUid = -1; final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); if (mContext.checkCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS) != PackageManager.PERMISSION_GRANTED) { watchedUid = Binder.getCallingUid(); watchedUid = callingUid; } if (ops != null) { Preconditions.checkArrayElementsInRange(ops, 0, Loading @@ -1239,7 +1283,8 @@ public class AppOpsService extends IAppOpsService.Stub { callbacks = new SparseArray<>(); mActiveWatchers.put(callback.asBinder(), callbacks); } final ActiveCallback activeCallback = new ActiveCallback(callback, watchedUid); final ActiveCallback activeCallback = new ActiveCallback(callback, watchedUid, callingUid, callingPid); for (int op : ops) { callbacks.put(op, activeCallback); } Loading Loading @@ -1384,7 +1429,7 @@ public class AppOpsService extends IAppOpsService.Stub { final SparseArray<ActiveCallback> callbacks = mActiveWatchers.valueAt(i); ActiveCallback callback = callbacks.get(code); if (callback != null) { if (callback.mUid >= 0 && callback.mUid != uid) { if (callback.mWatchingUid >= 0 && callback.mWatchingUid != uid) { continue; } if (dispatchedCallbacks == null) { Loading Loading @@ -2477,8 +2522,9 @@ public class AppOpsService extends IAppOpsService.Stub { needSep = true; pw.println(" All op mode watchers:"); for (int i=0; i<mModeWatchers.size(); i++) { pw.print(" "); pw.print(mModeWatchers.keyAt(i)); pw.print(" -> "); pw.println(mModeWatchers.valueAt(i)); pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(mModeWatchers.keyAt(i)))); pw.print(": "); pw.println(mModeWatchers.valueAt(i)); } } if (mActiveWatchers.size() > 0) { Loading @@ -2489,8 +2535,11 @@ public class AppOpsService extends IAppOpsService.Stub { if (activeWatchers.size() <= 0) { continue; } pw.print(" "); pw.print(mActiveWatchers.keyAt(i)); pw.print(" -> ["); pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode( mActiveWatchers.keyAt(i)))); pw.println(" ->"); pw.print(" ["); final int opCount = activeWatchers.size(); for (i = 0; i < opCount; i++) { pw.print(AppOpsManager.opToName(activeWatchers.keyAt(i))); Loading @@ -2498,7 +2547,9 @@ public class AppOpsService extends IAppOpsService.Stub { pw.print(','); } } pw.print("]" ); pw.println(activeWatchers.valueAt(0)); pw.println("]"); pw.print(" "); pw.println(activeWatchers.valueAt(0)); } } if (mClients.size() > 0) { Loading