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:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user