Loading core/java/android/app/IUiModeManager.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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(); Loading Loading @@ -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(); /** Loading services/core/java/com/android/server/UiModeManagerService.java +21 −23 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<>(); Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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; } Loading Loading @@ -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) { Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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) { Loading services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java +13 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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()); } Loading Loading @@ -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( Loading @@ -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( Loading Loading
core/java/android/app/IUiModeManager.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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(); Loading Loading @@ -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(); /** Loading
services/core/java/com/android/server/UiModeManagerService.java +21 −23 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<>(); Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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; } Loading Loading @@ -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) { Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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) { Loading
services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java +13 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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()); } Loading Loading @@ -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( Loading @@ -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( Loading