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
This commit is contained in:
Ahaan Ugale
2021-06-17 22:24:01 -07:00
parent ba23b84687
commit c27cb748b1
3 changed files with 55 additions and 1 deletions

View File

@@ -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<IBinder, Integer, Integer, String, String> superImpl) {
superImpl.accept(clientId, code, uid, packageName, attributionTag);
}
/**
* Allows overriding finish proxy op.
*

View File

@@ -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) {

View File

@@ -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<IBinder, Integer, Integer, String, String> 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<Integer, AttributionSource,