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

This commit is contained in:
Evan Severson
2021-07-21 17:10:21 +00:00
committed by Android (Google) Code Review
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.app.AppOpsManager.AttributionFlags;
import android.content.AttributionSource; import android.content.AttributionSource;
import android.os.IBinder; import android.os.IBinder;
import android.os.UserHandle;
import android.util.SparseArray; import android.util.SparseArray;
import android.util.SparseIntArray; import android.util.SparseIntArray;
@@ -215,4 +216,11 @@ public abstract class AppOpsManagerInternal {
* Sets a global restriction on an op code. * Sets a global restriction on an op code.
*/ */
public abstract void setGlobalRestriction(int code, boolean restricted, IBinder token); 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; package com.android.server.wm;
import static android.Manifest.permission.ACTIVITY_EMBEDDING; 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.INTERNAL_SYSTEM_WINDOW;
import static android.Manifest.permission.START_ANY_ACTIVITY; import static android.Manifest.permission.START_ANY_ACTIVITY;
import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED; import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
@@ -88,6 +89,7 @@ import android.app.ActivityManager;
import android.app.ActivityManagerInternal; import android.app.ActivityManagerInternal;
import android.app.ActivityOptions; import android.app.ActivityOptions;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.AppOpsManagerInternal;
import android.app.IActivityClientController; import android.app.IActivityClientController;
import android.app.ProfilerInfo; import android.app.ProfilerInfo;
import android.app.ResultInfo; import android.app.ResultInfo;
@@ -108,6 +110,8 @@ import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Rect; import android.graphics.Rect;
import android.hardware.SensorPrivacyManager;
import android.hardware.SensorPrivacyManagerInternal;
import android.os.Binder; import android.os.Binder;
import android.os.Build; import android.os.Build;
import android.os.Bundle; 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.ArrayUtils;
import com.android.internal.util.function.pooled.PooledConsumer; import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledLambda; import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.am.ActivityManagerService; import com.android.server.am.ActivityManagerService;
import com.android.server.am.UserState; import com.android.server.am.UserState;
import com.android.server.wm.ActivityMetricsLogger.LaunchingState; import com.android.server.wm.ActivityMetricsLogger.LaunchingState;
@@ -1221,6 +1226,24 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
if (getAppOpsManager().noteOpNoThrow(opCode, callingUid, if (getAppOpsManager().noteOpNoThrow(opCode, callingUid,
callingPackage, callingFeatureId, "") != AppOpsManager.MODE_ALLOWED) { 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; return ACTIVITY_RESTRICTION_APPOP;
} }