summaryrefslogtreecommitdiff
path: root/services/core/java/com/android/server/appop/AttributedOp.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/core/java/com/android/server/appop/AttributedOp.java')
-rw-r--r--services/core/java/com/android/server/appop/AttributedOp.java51
1 files changed, 27 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/appop/AttributedOp.java b/services/core/java/com/android/server/appop/AttributedOp.java
index dcc36bcf6149..0ded75a848ac 100644
--- a/services/core/java/com/android/server/appop/AttributedOp.java
+++ b/services/core/java/com/android/server/appop/AttributedOp.java
@@ -199,28 +199,18 @@ final class AttributedOp {
@AppOpsManager.UidState int uidState, @AppOpsManager.OpFlags int flags,
@AppOpsManager.AttributionFlags
int attributionFlags, int attributionChainId) throws RemoteException {
- started(clientId, proxyUid, proxyPackageName, proxyAttributionTag,
- uidState, flags, /*triggerCallbackIfNeeded*/ true, attributionFlags,
- attributionChainId);
- }
-
- private void started(@NonNull IBinder clientId, int proxyUid,
- @Nullable String proxyPackageName, @Nullable String proxyAttributionTag,
- @AppOpsManager.UidState int uidState, @AppOpsManager.OpFlags int flags,
- boolean triggerCallbackIfNeeded, @AppOpsManager.AttributionFlags int attributionFlags,
- int attributionChainId) throws RemoteException {
startedOrPaused(clientId, proxyUid, proxyPackageName,
- proxyAttributionTag, uidState, flags, triggerCallbackIfNeeded,
- /*triggerCallbackIfNeeded*/ true, attributionFlags, attributionChainId);
+ proxyAttributionTag, uidState, flags, /* triggeredByUidStateChange */ false,
+ /* isStarted */ true, attributionFlags, attributionChainId);
}
@SuppressWarnings("GuardedBy") // Lock is held on mAppOpsService
private void startedOrPaused(@NonNull IBinder clientId, int proxyUid,
@Nullable String proxyPackageName, @Nullable String proxyAttributionTag,
@AppOpsManager.UidState int uidState, @AppOpsManager.OpFlags int flags,
- boolean triggerCallbackIfNeeded, boolean isStarted, @AppOpsManager.AttributionFlags
+ boolean triggeredByUidStateChange, boolean isStarted, @AppOpsManager.AttributionFlags
int attributionFlags, int attributionChainId) throws RemoteException {
- if (triggerCallbackIfNeeded && !parent.isRunning() && isStarted) {
+ if (!triggeredByUidStateChange && !parent.isRunning() && isStarted) {
mAppOpsService.scheduleOpActiveChangedIfNeededLocked(parent.op, parent.uid,
parent.packageName, tag, true, attributionFlags, attributionChainId);
}
@@ -263,19 +253,27 @@ final class AttributedOp {
* @param clientId Id of the finishOp caller
*/
public void finished(@NonNull IBinder clientId) {
- finished(clientId, true);
+ finished(clientId, false);
}
- private void finished(@NonNull IBinder clientId, boolean triggerCallbackIfNeeded) {
- finishOrPause(clientId, triggerCallbackIfNeeded, false);
+ private void finished(@NonNull IBinder clientId, boolean triggeredByUidStateChange) {
+ finishOrPause(clientId, triggeredByUidStateChange, false);
}
/**
* Update state when paused or finished is called. If pausing, it records the op as
* stopping in the HistoricalRegistry, but does not delete it.
+ *
+ * @param triggeredByUidStateChange If {@code true}, then this method operates as usual, except
+ * that {@link AppOpsService#mActiveWatchers} will not be notified. This is currently only
+ * used in {@link #onUidStateChanged(int)}, for the purpose of restarting (i.e.,
+ * finishing then immediately starting again in the new uid state) the AttributedOp. In this
+ * case, the caller is responsible for guaranteeing that either the AttributedOp is started
+ * again or all {@link AppOpsService#mActiveWatchers} are notified that the AttributedOp is
+ * finished.
*/
@SuppressWarnings("GuardedBy") // Lock is held on mAppOpsService
- private void finishOrPause(@NonNull IBinder clientId, boolean triggerCallbackIfNeeded,
+ private void finishOrPause(@NonNull IBinder clientId, boolean triggeredByUidStateChange,
boolean isPausing) {
int indexOfToken = isRunning() ? mInProgressEvents.indexOfKey(clientId) : -1;
if (indexOfToken < 0) {
@@ -320,7 +318,7 @@ final class AttributedOp {
mInProgressEvents = null;
// TODO ntmyren: Also callback for single attribution tag activity changes
- if (triggerCallbackIfNeeded && !parent.isRunning()) {
+ if (!triggeredByUidStateChange && !parent.isRunning()) {
mAppOpsService.scheduleOpActiveChangedIfNeededLocked(parent.op,
parent.uid, parent.packageName, tag, false,
event.getAttributionFlags(), event.getAttributionChainId());
@@ -368,7 +366,7 @@ final class AttributedOp {
@AppOpsManager.AttributionFlags
int attributionFlags, int attributionChainId) throws RemoteException {
startedOrPaused(clientId, proxyUid, proxyPackageName, proxyAttributionTag,
- uidState, flags, true, false, attributionFlags, attributionChainId);
+ uidState, flags, false, false, attributionFlags, attributionChainId);
}
/**
@@ -386,7 +384,7 @@ final class AttributedOp {
for (int i = 0; i < mInProgressEvents.size(); i++) {
InProgressStartOpEvent event = mInProgressEvents.valueAt(i);
mPausedInProgressEvents.put(event.getClientId(), event);
- finishOrPause(event.getClientId(), true, true);
+ finishOrPause(event.getClientId(), false, true);
mAppOpsService.scheduleOpActiveChangedIfNeededLocked(parent.op, parent.uid,
parent.packageName, tag, false,
@@ -475,6 +473,8 @@ final class AttributedOp {
InProgressStartOpEvent event = events.get(binders.get(i));
if (event != null && event.getUidState() != newState) {
+ int eventAttributionFlags = event.getAttributionFlags();
+ int eventAttributionChainId = event.getAttributionChainId();
try {
// Remove all but one unfinished start count and then call finished() to
// remove start event object
@@ -482,18 +482,18 @@ final class AttributedOp {
event.mNumUnfinishedStarts = 1;
AppOpsManager.OpEventProxyInfo proxy = event.getProxy();
- finished(event.getClientId(), false);
+ finished(event.getClientId(), true);
// Call started() to add a new start event object and then add the
// previously removed unfinished start counts back
if (proxy != null) {
startedOrPaused(event.getClientId(), proxy.getUid(),
proxy.getPackageName(), proxy.getAttributionTag(), newState,
- event.getFlags(), false, isRunning,
+ event.getFlags(), true, isRunning,
event.getAttributionFlags(), event.getAttributionChainId());
} else {
startedOrPaused(event.getClientId(), Process.INVALID_UID, null, null,
- newState, event.getFlags(), false, isRunning,
+ newState, event.getFlags(), true, isRunning,
event.getAttributionFlags(), event.getAttributionChainId());
}
@@ -507,6 +507,9 @@ final class AttributedOp {
Slog.e(AppOpsService.TAG,
"Cannot switch to new uidState " + newState);
}
+ mAppOpsService.scheduleOpActiveChangedIfNeededLocked(parent.op,
+ parent.uid, parent.packageName, tag, false,
+ eventAttributionFlags, eventAttributionChainId);
}
}
}