Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b6d6431 authored by Evan Severson's avatar Evan Severson
Browse files

Don't block intent if op is restricted due to toggles

Test: Create sdk 22 and 30 test apps and use the MEDIASTORE intents
Bug: 192635623
Change-Id: I250a5e398e72919ec8217e87b76273082e781f63
parent 75c9ab57
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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);
}
+24 −0
Original line number Diff line number Diff line
@@ -7290,6 +7290,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;
        }
    }

    /**
+23 −0
Original line number Diff line number Diff line
@@ -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;
@@ -88,6 +89,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;
@@ -108,6 +110,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;
@@ -1221,6 +1226,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;
        }