Merge "Don't block intent if op is restricted due to toggles" into sc-dev am: 2b11e7f25c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15245178

Change-Id: I6e6fea3721aed83e38d3b70f570036c1b3c72c03
This commit is contained in:
Evan Severson
2021-07-21 17:26:21 +00:00
committed by Automerger Merge Worker
3 changed files with 55 additions and 0 deletions

View File

@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.app.AppOpsManager.AttributionFlags;
import android.content.AttributionSource;
import android.os.IBinder;
import android.os.UserHandle;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -215,4 +216,11 @@ public abstract class AppOpsManagerInternal {
* Sets a global restriction on an op code.
*/
public abstract void setGlobalRestriction(int code, boolean restricted, IBinder token);
/**
* Gets the number of tokens restricting the given appop for a user, package, and
* attributionTag.
*/
public abstract int getOpRestrictionCount(int code, UserHandle user, String pkg,
String attributionTag);
}

View File

@@ -7297,6 +7297,30 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
}
@Override
public int getOpRestrictionCount(int code, UserHandle user, String pkg,
String attributionTag) {
int number = 0;
synchronized (AppOpsService.this) {
int numRestrictions = mOpUserRestrictions.size();
for (int i = 0; i < numRestrictions; i++) {
if (mOpUserRestrictions.valueAt(i)
.hasRestriction(code, pkg, attributionTag, user.getIdentifier())) {
number++;
}
}
numRestrictions = mOpGlobalRestrictions.size();
for (int i = 0; i < numRestrictions; i++) {
if (mOpGlobalRestrictions.valueAt(i).hasRestriction(code)) {
number++;
}
}
}
return number;
}
}
/**

View File

@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.Manifest.permission.ACTIVITY_EMBEDDING;
import static android.Manifest.permission.CAMERA;
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.Manifest.permission.START_ANY_ACTIVITY;
import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
@@ -89,6 +90,7 @@ import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
import android.app.AppOpsManager;
import android.app.AppOpsManagerInternal;
import android.app.IActivityClientController;
import android.app.ProfilerInfo;
import android.app.ResultInfo;
@@ -109,6 +111,8 @@ import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.hardware.SensorPrivacyManager;
import android.hardware.SensorPrivacyManagerInternal;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -141,6 +145,7 @@ import com.android.internal.protolog.common.ProtoLog;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.UserState;
import com.android.server.wm.ActivityMetricsLogger.LaunchingState;
@@ -1226,6 +1231,24 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
if (getAppOpsManager().noteOpNoThrow(opCode, callingUid,
callingPackage, callingFeatureId, "") != AppOpsManager.MODE_ALLOWED) {
if (CAMERA.equals(permission)) {
SensorPrivacyManagerInternal spmi =
LocalServices.getService(SensorPrivacyManagerInternal.class);
final UserHandle user = UserHandle.getUserHandleForUid(callingUid);
final boolean cameraPrivacyEnabled = spmi.isSensorPrivacyEnabled(
user.getIdentifier(), SensorPrivacyManager.Sensors.CAMERA);
if (cameraPrivacyEnabled) {
AppOpsManagerInternal aomi = LocalServices.getService(
AppOpsManagerInternal.class);
int numCameraRestrictions = aomi.getOpRestrictionCount(
AppOpsManager.OP_CAMERA, user, callingPackage, null);
if (numCameraRestrictions == 1) {
// Only restricted by the toggles, do not restrict
return ACTIVITY_RESTRICTION_NONE;
}
}
}
return ACTIVITY_RESTRICTION_APPOP;
}