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

Commit a4742064 authored by mattgilbride's avatar mattgilbride
Browse files

@EnforcePermission migrations - UiModeManagerService

Migrates call sites to use the @EnforcePermission annotation
instead of manually checking permissions.

These are fully behavior-preserving changes that can be identified by
Android Lint (see SimpleManualPermissionEnforcementDetector)

Bug: 265014041
Test: TH
Change-Id: Ib8c82be65f067b82a88c197992ad2ae8a5e3a463
parent 6f838a40
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ interface IUiModeManager {
     * @param nightModeCustomType
     * @hide
     */
    @EnforcePermission("MODIFY_DAY_NIGHT_MODE")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)")
    void setNightModeCustomType(int nightModeCustomType);

@@ -89,6 +90,7 @@ interface IUiModeManager {
     * {@link #MODE_NIGHT_CUSTOM_TYPE_UNKNOWN}.
     * @hide
     */
    @EnforcePermission("MODIFY_DAY_NIGHT_MODE")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)")
    int getNightModeCustomType();

@@ -163,21 +165,25 @@ interface IUiModeManager {
    /**
    * Registers a listener for changes to projection state.
    */
    @EnforcePermission("READ_PROJECTION_STATE")
    void addOnProjectionStateChangedListener(in IOnProjectionStateChangedListener listener, int projectionType);

    /**
    * Unregisters a listener for changes to projection state.
    */
    @EnforcePermission("READ_PROJECTION_STATE")
    void removeOnProjectionStateChangedListener(in IOnProjectionStateChangedListener listener);

    /**
    * Returns packages that have currently set the given projection type.
    */
    @EnforcePermission("READ_PROJECTION_STATE")
    List<String> getProjectingPackages(int projectionType);

    /**
    * Returns currently set projection types.
    */
    @EnforcePermission("READ_PROJECTION_STATE")
    int getActiveProjectionTypes();

    /**
+21 −23
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import android.os.BatteryManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.PermissionEnforcer;
import android.os.PowerManager;
import android.os.PowerManager.ServiceType;
import android.os.PowerManagerInternal;
@@ -199,6 +200,8 @@ final class UiModeManagerService extends SystemService {
    private final LocalService mLocalService = new LocalService();
    private PowerManagerInternal mLocalPowerManager;

    private final IUiModeManager.Stub mService;

    @GuardedBy("mLock")
    private final SparseArray<RemoteCallbackList<IUiModeManagerCallback>> mUiModeManagerCallbacks =
            new SparseArray<>();
@@ -221,6 +224,7 @@ final class UiModeManagerService extends SystemService {
    protected UiModeManagerService(Context context, boolean setupWizardComplete,
            TwilightManager tm, Injector injector) {
        super(context);
        mService = new Stub(context);
        mConfiguration.setToDefaults();
        mSetupWizardComplete = setupWizardComplete;
        mTwilightManager = tm;
@@ -663,7 +667,11 @@ final class UiModeManagerService extends SystemService {
        }
    }

    private final IUiModeManager.Stub mService = new IUiModeManager.Stub() {
    private final class Stub extends IUiModeManager.Stub {
        Stub(Context context) {
            super(PermissionEnforcer.fromContext(context));
        }

        @Override
        public void addCallback(IUiModeManagerCallback callback) {
            int userId = getCallingUserId();
@@ -851,25 +859,17 @@ final class UiModeManagerService extends SystemService {
            }
        }

        @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
        @Override
        public void setNightModeCustomType(@NightModeCustomType int nightModeCustomType) {
            if (getContext().checkCallingOrSelfPermission(
                    android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
                    != PackageManager.PERMISSION_GRANTED) {
                throw new SecurityException(
                        "setNightModeCustomType requires MODIFY_DAY_NIGHT_MODE permission");
            }
            setNightModeCustomType_enforcePermission();
            setNightModeInternal(MODE_NIGHT_CUSTOM, nightModeCustomType);
        }

        @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
        @Override
        public  @NightModeCustomReturnType int getNightModeCustomType() {
            if (getContext().checkCallingOrSelfPermission(
                    android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
                    != PackageManager.PERMISSION_GRANTED) {
                throw new SecurityException(
                        "getNightModeCustomType requires MODIFY_DAY_NIGHT_MODE permission");
            }
            getNightModeCustomType_enforcePermission();
            synchronized (mLock) {
                return mNightModeCustomType;
            }
@@ -1098,10 +1098,10 @@ final class UiModeManagerService extends SystemService {
            return releaseProjectionUnchecked(projectionType, callingPackage);
        }

        @android.annotation.EnforcePermission(android.Manifest.permission.READ_PROJECTION_STATE)
        @Override
        public @UiModeManager.ProjectionType int getActiveProjectionTypes() {
            getContext().enforceCallingOrSelfPermission(
                    android.Manifest.permission.READ_PROJECTION_STATE, "getActiveProjectionTypes");
            getActiveProjectionTypes_enforcePermission();
            @UiModeManager.ProjectionType int projectionTypeFlag = PROJECTION_TYPE_NONE;
            synchronized (mLock) {
                if (mProjectionHolders != null) {
@@ -1115,11 +1115,11 @@ final class UiModeManagerService extends SystemService {
            return projectionTypeFlag;
        }

        @android.annotation.EnforcePermission(android.Manifest.permission.READ_PROJECTION_STATE)
        @Override
        public List<String> getProjectingPackages(
                @UiModeManager.ProjectionType int projectionType) {
            getContext().enforceCallingOrSelfPermission(
                    android.Manifest.permission.READ_PROJECTION_STATE, "getProjectionState");
            getProjectingPackages_enforcePermission();
            synchronized (mLock) {
                List<String> packageNames = new ArrayList<>();
                populateWithRelevantActivePackageNames(projectionType, packageNames);
@@ -1127,11 +1127,10 @@ final class UiModeManagerService extends SystemService {
            }
        }

        @android.annotation.EnforcePermission(android.Manifest.permission.READ_PROJECTION_STATE)
        public void addOnProjectionStateChangedListener(IOnProjectionStateChangedListener listener,
                @UiModeManager.ProjectionType int projectionType) {
            getContext().enforceCallingOrSelfPermission(
                    android.Manifest.permission.READ_PROJECTION_STATE,
                    "addOnProjectionStateChangedListener");
            addOnProjectionStateChangedListener_enforcePermission();
            if (projectionType == PROJECTION_TYPE_NONE) {
                return;
            }
@@ -1161,11 +1160,10 @@ final class UiModeManagerService extends SystemService {
        }


        @android.annotation.EnforcePermission(android.Manifest.permission.READ_PROJECTION_STATE)
        public void removeOnProjectionStateChangedListener(
                IOnProjectionStateChangedListener listener) {
            getContext().enforceCallingOrSelfPermission(
                    android.Manifest.permission.READ_PROJECTION_STATE,
                    "removeOnProjectionStateChangedListener");
            removeOnProjectionStateChangedListener_enforcePermission();
            synchronized (mLock) {
                if (mProjectionListeners != null) {
                    for (int i = 0; i < mProjectionListeners.size(); ++i) {
+13 −14
Original line number Diff line number Diff line
@@ -27,14 +27,10 @@ import static android.app.UiModeManager.MODE_NIGHT_YES;
import static android.app.UiModeManager.PROJECTION_TYPE_ALL;
import static android.app.UiModeManager.PROJECTION_TYPE_AUTOMOTIVE;
import static android.app.UiModeManager.PROJECTION_TYPE_NONE;

import static com.android.server.UiModeManagerService.SUPPORTED_NIGHT_MODE_CUSTOM_TYPES;

import static com.google.common.truth.Truth.assertThat;

import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;

import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.empty;
import static org.junit.Assert.assertEquals;
@@ -77,12 +73,14 @@ import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.PermissionEnforcer;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.test.FakePermissionEnforcer;
import android.provider.Settings;
import android.test.mock.MockContentResolver;
import android.testing.AndroidTestingRunner;
@@ -151,11 +149,16 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
    private AlarmManager.OnAlarmListener mCustomListener;
    private Consumer<PowerSaveState> mPowerSaveConsumer;
    private TwilightListener mTwilightListener;
    private FakePermissionEnforcer mPermissionEnforcer;

    @Before
    public void setUp() {
        when(mContext.checkCallingOrSelfPermission(anyString()))
                .thenReturn(PackageManager.PERMISSION_GRANTED);
        // The AIDL stub will use PermissionEnforcer to check permission from the caller.
        mPermissionEnforcer = new FakePermissionEnforcer();
        mPermissionEnforcer.grant(Manifest.permission.MODIFY_DAY_NIGHT_MODE);
        mPermissionEnforcer.grant(Manifest.permission.READ_PROJECTION_STATE);
        doReturn(mPermissionEnforcer).when(mContext).getSystemService(
                eq(PermissionEnforcer.class));
        doAnswer(inv -> {
            mTwilightListener = (TwilightListener) inv.getArgument(0);
            return null;
@@ -312,8 +315,7 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {

    @Test
    public void setNightModeCustomType_noPermission_shouldThrow() throws RemoteException {
        when(mContext.checkCallingOrSelfPermission(eq(MODIFY_DAY_NIGHT_MODE)))
                .thenReturn(PackageManager.PERMISSION_DENIED);
        mPermissionEnforcer.revoke(MODIFY_DAY_NIGHT_MODE);

        assertThrows(SecurityException.class,
                () -> mService.setNightModeCustomType(MODE_NIGHT_CUSTOM_TYPE_BEDTIME));
@@ -753,8 +755,7 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
    @Test
    public void getNightModeCustomType_permissionNotGranted_shouldThrow()
            throws RemoteException {
        when(mContext.checkCallingOrSelfPermission(eq(MODIFY_DAY_NIGHT_MODE)))
                .thenReturn(PackageManager.PERMISSION_DENIED);
        mPermissionEnforcer.revoke(MODIFY_DAY_NIGHT_MODE);

        assertThrows(SecurityException.class, () -> mService.getNightModeCustomType());
    }
@@ -1116,8 +1117,7 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {

    @Test
    public void addOnProjectionStateChangedListener_enforcesReadProjStatePermission() {
        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
                eq(android.Manifest.permission.READ_PROJECTION_STATE), any());
        mPermissionEnforcer.revoke(android.Manifest.permission.READ_PROJECTION_STATE);
        IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);

        assertThrows(SecurityException.class, () -> mService.addOnProjectionStateChangedListener(
@@ -1141,8 +1141,7 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {

    @Test
    public void removeOnProjectionStateChangedListener_enforcesReadProjStatePermission() {
        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
                eq(android.Manifest.permission.READ_PROJECTION_STATE), any());
        mPermissionEnforcer.revoke(android.Manifest.permission.READ_PROJECTION_STATE);
        IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);

        assertThrows(SecurityException.class, () -> mService.removeOnProjectionStateChangedListener(