summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jay Aliomer <aaliomer@google.com> 2020-05-29 16:15:22 -0400
committer Jay Aliomer <aaliomer@google.com> 2020-08-05 19:37:28 -0400
commitf16e87a992d7d6c1d367770bd569707a29cb15b4 (patch)
tree77b172781ccf2f938009d2101e6e16bb40f6395e
parent512a6b3089563fd4e3ae34aac128d70afae7fd8f (diff)
DarkMode Tile affects all users
When setNightModeActivated is called, the change affects the current logged in user Test: manual Bug: 156437555 Change-Id: I7786d9dde10f7547f5dd9fb00661fb89fde9f05c
-rw-r--r--core/java/android/app/UiModeManager.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java5
-rw-r--r--services/core/java/com/android/server/UiModeManagerService.java24
-rw-r--r--services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java14
5 files changed, 42 insertions, 8 deletions
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index 7c6eff143724..06d1b74abc86 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -510,6 +510,9 @@ public class UiModeManager {
}
/**
+ * Activating night mode for the current user
+ *
+ * @return {@code true} if the change is successful
* @hide
*/
public boolean setNightModeActivated(boolean active) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
index 3264429a1723..d8548decc5f4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
@@ -67,7 +67,7 @@ public class NightDisplayTile extends QSTileImpl<BooleanState> implements
private static final String PATTERN_HOUR_MINUTE = "h:mm a";
private static final String PATTERN_HOUR_NINUTE_24 = "HH:mm";
- private final ColorDisplayManager mManager;
+ private ColorDisplayManager mManager;
private final LocationController mLocationController;
private final NightDisplayListenerModule.Builder mNightDisplayListenerBuilder;
private NightDisplayListener mListener;
@@ -126,6 +126,8 @@ public class NightDisplayTile extends QSTileImpl<BooleanState> implements
mListener.setCallback(null);
}
+ mManager = getHost().getUserContext().getSystemService(ColorDisplayManager.class);
+
// Make a new controller for the new user.
mListener = mNightDisplayListenerBuilder.setUser(newUserId).build();
if (mIsListening) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java
index 07b841ffb6f7..78975a4798ce 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java
@@ -58,10 +58,9 @@ public class UiModeNightTile extends QSTileImpl<QSTile.BooleanState> implements
public static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a");
private final Icon mIcon = ResourceIcon.get(
com.android.internal.R.drawable.ic_qs_ui_mode_night);
- private final UiModeManager mUiModeManager;
+ private UiModeManager mUiModeManager;
private final BatteryController mBatteryController;
private final LocationController mLocationController;
-
@Inject
public UiModeNightTile(
QSHost host,
@@ -78,7 +77,7 @@ public class UiModeNightTile extends QSTileImpl<QSTile.BooleanState> implements
super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
activityStarter, qsLogger);
mBatteryController = batteryController;
- mUiModeManager = mContext.getSystemService(UiModeManager.class);
+ mUiModeManager = host.getUserContext().getSystemService(UiModeManager.class);
mLocationController = locationController;
configurationController.observe(getLifecycle(), this);
batteryController.observe(getLifecycle(), this);
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index df9dee89f5a2..6dbb1e922f60 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -137,6 +137,7 @@ final class UiModeManagerService extends SystemService {
int mCurUiMode = 0;
private int mSetUiMode = 0;
private boolean mHoldingConfiguration = false;
+ private int mCurrentUser;
private Configuration mConfiguration = new Configuration();
boolean mSystemReady;
@@ -325,6 +326,7 @@ final class UiModeManagerService extends SystemService {
@Override
public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) {
+ mCurrentUser = to.getUserIdentifier();
getContext().getContentResolver().unregisterContentObserver(mSetupWizardObserver);
verifySetupWizardCompleted();
}
@@ -727,16 +729,30 @@ final class UiModeManagerService extends SystemService {
@Override
public boolean setNightModeActivated(boolean active) {
+ if (isNightModeLocked() && (getContext().checkCallingOrSelfPermission(
+ android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
+ != PackageManager.PERMISSION_GRANTED)) {
+ Slog.e(TAG, "Night mode locked, requires MODIFY_DAY_NIGHT_MODE permission");
+ return false;
+ }
+ final int user = Binder.getCallingUserHandle().getIdentifier();
+ if (user != mCurrentUser && getContext().checkCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS)
+ != PackageManager.PERMISSION_GRANTED) {
+ Slog.e(TAG, "Target user is not current user,"
+ + " INTERACT_ACROSS_USERS permission is required");
+ return false;
+
+ }
synchronized (mLock) {
- final int user = UserHandle.getCallingUserId();
final long ident = Binder.clearCallingIdentity();
try {
if (mNightMode == MODE_NIGHT_AUTO || mNightMode == MODE_NIGHT_CUSTOM) {
unregisterScreenOffEventLocked();
mOverrideNightModeOff = !active;
mOverrideNightModeOn = active;
- mOverrideNightModeUser = user;
- persistNightModeOverrides(user);
+ mOverrideNightModeUser = mCurrentUser;
+ persistNightModeOverrides(mCurrentUser);
} else if (mNightMode == UiModeManager.MODE_NIGHT_NO
&& active) {
mNightMode = UiModeManager.MODE_NIGHT_YES;
@@ -746,7 +762,7 @@ final class UiModeManagerService extends SystemService {
}
updateConfigurationLocked();
applyConfigurationExternallyLocked();
- persistNightMode(user);
+ persistNightMode(mCurrentUser);
return true;
} finally {
Binder.restoreCallingIdentity(ident);
diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
index 1d75967756c3..88b1d191dc4d 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
@@ -16,6 +16,7 @@
package com.android.server;
+import android.Manifest;
import android.app.AlarmManager;
import android.app.IUiModeManager;
import android.content.BroadcastReceiver;
@@ -24,6 +25,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Handler;
@@ -67,6 +69,7 @@ import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -230,6 +233,17 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void setNightModeActivated_permissiontoChangeOtherUsers() throws RemoteException {
+ SystemService.TargetUser user = mock(SystemService.TargetUser.class);
+ doReturn(9).when(user).getUserIdentifier();
+ mUiManagerService.onUserSwitching(user, user);
+ when(mContext.checkCallingOrSelfPermission(
+ eq(Manifest.permission.INTERACT_ACROSS_USERS)))
+ .thenReturn(PackageManager.PERMISSION_DENIED);
+ assertFalse(mService.setNightModeActivated(true));
+ }
+
+ @Test
public void autoNightModeSwitch_batterySaverOn() throws RemoteException {
mService.setNightMode(MODE_NIGHT_NO);
when(mTwilightState.isNight()).thenReturn(false);