diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java index a757e32d0d752..7c85df831ce98 100644 --- a/core/java/android/app/AppOpsManagerInternal.java +++ b/core/java/android/app/AppOpsManagerInternal.java @@ -16,9 +16,9 @@ package android.app; -import android.app.AppOpsManager.AttributionFlags; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.AppOpsManager.AttributionFlags; import android.content.AttributionSource; import android.os.IBinder; import android.util.SparseArray; @@ -29,6 +29,7 @@ import com.android.internal.util.function.DecFunction; import com.android.internal.util.function.HeptFunction; import com.android.internal.util.function.HexFunction; import com.android.internal.util.function.QuadFunction; +import com.android.internal.util.function.QuintConsumer; import com.android.internal.util.function.QuintFunction; import com.android.internal.util.function.TriFunction; import com.android.internal.util.function.UndecFunction; @@ -154,6 +155,21 @@ public abstract class AppOpsManagerInternal { Boolean, String, Boolean, Boolean, Integer, Integer, Integer, SyncNotedAppOp> superImpl); + /** + * Allows overriding finish op. + * + * @param clientId The client state. + * @param code The op code to finish. + * @param uid The UID for which the op was noted. + * @param packageName The package for which it was noted. {@code null} for system package. + * @param attributionTag the attribution tag. + */ + default void finishOperation(IBinder clientId, int code, int uid, String packageName, + String attributionTag, + @NonNull QuintConsumer superImpl) { + superImpl.accept(clientId, code, uid, packageName, attributionTag); + } + /** * Allows overriding finish proxy op. * diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 99a33e4462e2b..583d86298d84c 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -4001,6 +4001,12 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void finishOperation(IBinder clientId, int code, int uid, String packageName, String attributionTag) { + mCheckOpsDelegateDispatcher.finishOperation(clientId, code, uid, packageName, + attributionTag); + } + + private void finishOperationImpl(IBinder clientId, int code, int uid, String packageName, + String attributionTag) { verifyIncomingUid(uid); verifyIncomingOp(code); verifyIncomingPackage(packageName, UserHandle.getUserId(uid)); @@ -7507,6 +7513,29 @@ public class AppOpsService extends IAppOpsService.Stub { attributionChainId, AppOpsService.this::startProxyOperationImpl); } + public void finishOperation(IBinder clientId, int code, int uid, String packageName, + String attributionTag) { + if (mPolicy != null) { + if (mCheckOpsDelegate != null) { + mPolicy.finishOperation(clientId, code, uid, packageName, attributionTag, + this::finishDelegateOperationImpl); + } else { + mPolicy.finishOperation(clientId, code, uid, packageName, attributionTag, + AppOpsService.this::finishOperationImpl); + } + } else if (mCheckOpsDelegate != null) { + finishDelegateOperationImpl(clientId, code, uid, packageName, attributionTag); + } else { + finishOperationImpl(clientId, code, uid, packageName, attributionTag); + } + } + + private void finishDelegateOperationImpl(IBinder clientId, int code, int uid, + String packageName, String attributionTag) { + mCheckOpsDelegate.finishOperation(clientId, code, uid, packageName, attributionTag, + AppOpsService.this::finishOperationImpl); + } + public void finishProxyOperation(int code, @NonNull AttributionSource attributionSource, boolean skipProxyOperation) { if (mPolicy != null) { diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java index 22c370ef4dbe7..563acf7692a06 100644 --- a/services/core/java/com/android/server/policy/AppOpsPolicy.java +++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java @@ -48,6 +48,7 @@ import com.android.internal.util.function.DecFunction; import com.android.internal.util.function.HeptFunction; import com.android.internal.util.function.HexFunction; import com.android.internal.util.function.QuadFunction; +import com.android.internal.util.function.QuintConsumer; import com.android.internal.util.function.QuintFunction; import com.android.internal.util.function.TriFunction; import com.android.internal.util.function.UndecFunction; @@ -242,6 +243,14 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat proxiedAttributionFlags, attributionChainId); } + @Override + public void finishOperation(IBinder clientId, int code, int uid, String packageName, + String attributionTag, + @NonNull QuintConsumer superImpl) { + superImpl.accept(clientId, resolveDatasourceOp(code, uid, packageName, attributionTag), + resolveUid(code, uid), packageName, attributionTag); + } + @Override public void finishProxyOperation(int code, @NonNull AttributionSource attributionSource, boolean skipProxyOperation, @NonNull TriFunction