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

Commit 6fd5ba3a authored by Jay Aliomer's avatar Jay Aliomer Committed by Android (Google) Code Review
Browse files

Merge "DarkMode Tile affects all users"

parents 618cb1a6 f16e87a9
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -510,6 +510,9 @@ public class UiModeManager {
    }
    }


    /**
    /**
     * Activating night mode for the current user
     *
     * @return {@code true} if the change is successful
     * @hide
     * @hide
     */
     */
    public boolean setNightModeActivated(boolean active) {
    public boolean setNightModeActivated(boolean active) {
+3 −1
Original line number Original line Diff line number Diff line
@@ -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_MINUTE = "h:mm a";
    private static final String PATTERN_HOUR_NINUTE_24 = "HH:mm";
    private static final String PATTERN_HOUR_NINUTE_24 = "HH:mm";


    private final ColorDisplayManager mManager;
    private ColorDisplayManager mManager;
    private final LocationController mLocationController;
    private final LocationController mLocationController;
    private final NightDisplayListenerModule.Builder mNightDisplayListenerBuilder;
    private final NightDisplayListenerModule.Builder mNightDisplayListenerBuilder;
    private NightDisplayListener mListener;
    private NightDisplayListener mListener;
@@ -126,6 +126,8 @@ public class NightDisplayTile extends QSTileImpl<BooleanState> implements
            mListener.setCallback(null);
            mListener.setCallback(null);
        }
        }


        mManager = getHost().getUserContext().getSystemService(ColorDisplayManager.class);

        // Make a new controller for the new user.
        // Make a new controller for the new user.
        mListener = mNightDisplayListenerBuilder.setUser(newUserId).build();
        mListener = mNightDisplayListenerBuilder.setUser(newUserId).build();
        if (mIsListening) {
        if (mIsListening) {
+2 −3
Original line number Original line Diff line number Diff line
@@ -58,10 +58,9 @@ public class UiModeNightTile extends QSTileImpl<QSTile.BooleanState> implements
    public static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a");
    public static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a");
    private final Icon mIcon = ResourceIcon.get(
    private final Icon mIcon = ResourceIcon.get(
            com.android.internal.R.drawable.ic_qs_ui_mode_night);
            com.android.internal.R.drawable.ic_qs_ui_mode_night);
    private final UiModeManager mUiModeManager;
    private UiModeManager mUiModeManager;
    private final BatteryController mBatteryController;
    private final BatteryController mBatteryController;
    private final LocationController mLocationController;
    private final LocationController mLocationController;

    @Inject
    @Inject
    public UiModeNightTile(
    public UiModeNightTile(
            QSHost host,
            QSHost host,
@@ -78,7 +77,7 @@ public class UiModeNightTile extends QSTileImpl<QSTile.BooleanState> implements
        super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
        super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
                activityStarter, qsLogger);
                activityStarter, qsLogger);
        mBatteryController = batteryController;
        mBatteryController = batteryController;
        mUiModeManager = mContext.getSystemService(UiModeManager.class);
        mUiModeManager = host.getUserContext().getSystemService(UiModeManager.class);
        mLocationController = locationController;
        mLocationController = locationController;
        configurationController.observe(getLifecycle(), this);
        configurationController.observe(getLifecycle(), this);
        batteryController.observe(getLifecycle(), this);
        batteryController.observe(getLifecycle(), this);
+20 −4
Original line number Original line Diff line number Diff line
@@ -137,6 +137,7 @@ final class UiModeManagerService extends SystemService {
    int mCurUiMode = 0;
    int mCurUiMode = 0;
    private int mSetUiMode = 0;
    private int mSetUiMode = 0;
    private boolean mHoldingConfiguration = false;
    private boolean mHoldingConfiguration = false;
    private int mCurrentUser;


    private Configuration mConfiguration = new Configuration();
    private Configuration mConfiguration = new Configuration();
    boolean mSystemReady;
    boolean mSystemReady;
@@ -325,6 +326,7 @@ final class UiModeManagerService extends SystemService {


    @Override
    @Override
    public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) {
    public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) {
        mCurrentUser = to.getUserIdentifier();
        getContext().getContentResolver().unregisterContentObserver(mSetupWizardObserver);
        getContext().getContentResolver().unregisterContentObserver(mSetupWizardObserver);
        verifySetupWizardCompleted();
        verifySetupWizardCompleted();
    }
    }
@@ -727,16 +729,30 @@ final class UiModeManagerService extends SystemService {


        @Override
        @Override
        public boolean setNightModeActivated(boolean active) {
        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) {
            synchronized (mLock) {
                final int user = UserHandle.getCallingUserId();
                final long ident = Binder.clearCallingIdentity();
                final long ident = Binder.clearCallingIdentity();
                try {
                try {
                    if (mNightMode == MODE_NIGHT_AUTO || mNightMode == MODE_NIGHT_CUSTOM) {
                    if (mNightMode == MODE_NIGHT_AUTO || mNightMode == MODE_NIGHT_CUSTOM) {
                        unregisterScreenOffEventLocked();
                        unregisterScreenOffEventLocked();
                        mOverrideNightModeOff = !active;
                        mOverrideNightModeOff = !active;
                        mOverrideNightModeOn = active;
                        mOverrideNightModeOn = active;
                        mOverrideNightModeUser = user;
                        mOverrideNightModeUser = mCurrentUser;
                        persistNightModeOverrides(user);
                        persistNightModeOverrides(mCurrentUser);
                    } else if (mNightMode == UiModeManager.MODE_NIGHT_NO
                    } else if (mNightMode == UiModeManager.MODE_NIGHT_NO
                            && active) {
                            && active) {
                        mNightMode = UiModeManager.MODE_NIGHT_YES;
                        mNightMode = UiModeManager.MODE_NIGHT_YES;
@@ -746,7 +762,7 @@ final class UiModeManagerService extends SystemService {
                    }
                    }
                    updateConfigurationLocked();
                    updateConfigurationLocked();
                    applyConfigurationExternallyLocked();
                    applyConfigurationExternallyLocked();
                    persistNightMode(user);
                    persistNightMode(mCurrentUser);
                    return true;
                    return true;
                } finally {
                } finally {
                    Binder.restoreCallingIdentity(ident);
                    Binder.restoreCallingIdentity(ident);
+14 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.server;
package com.android.server;


import android.Manifest;
import android.app.AlarmManager;
import android.app.AlarmManager;
import android.app.IUiModeManager;
import android.app.IUiModeManager;
import android.content.BroadcastReceiver;
import android.content.BroadcastReceiver;
@@ -24,6 +25,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.Resources;
import android.os.Handler;
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.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;
@@ -229,6 +232,17 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
        assertFalse(isNightModeActivated());
        assertFalse(isNightModeActivated());
    }
    }


    @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
    @Test
    public void autoNightModeSwitch_batterySaverOn() throws RemoteException {
    public void autoNightModeSwitch_batterySaverOn() throws RemoteException {
        mService.setNightMode(MODE_NIGHT_NO);
        mService.setNightMode(MODE_NIGHT_NO);