From c27cb748b18bd0e68fc0b3b417589239b8187e25 Mon Sep 17 00:00:00 2001 From: Ahaan Ugale Date: Thu, 17 Jun 2021 22:24:01 -0700 Subject: [PATCH] Fix finishOp for HotwordDetectionService We currently specially handle the HotwordDetectionService uid in AppOpsPolicy. But CheckOpsDelegate doesn't currently include finishOp, so that doesn't work for the hotword service. This change adds finishOp to the interface and implements it in AppOpsPolicy to be consistent with the other ops. Bug: 190011174 Test: manual - no error in logs for finishOp Test: manual - privacy indicator works as expected (with another wip change) Change-Id: I77907092a917362aacd0d5562e54abd6f3c3d47b --- .../android/app/AppOpsManagerInternal.java | 18 +++++++++++- .../android/server/appop/AppOpsService.java | 29 +++++++++++++++++++ .../android/server/policy/AppOpsPolicy.java | 9 ++++++ 3 files changed, 55 insertions(+), 1 deletion(-) 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