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

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

Merge "Refine the DarkModeScheduleSelectorController"

parents b2226765 7f086c0e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -102,9 +102,9 @@

    <!-- Dark theme scheduling preferences  [CHAR LIMIT=NONE] -->
    <string-array name="dark_ui_scheduler_preference_titles">
        <!-- 1: None -->
        <!-- 0: None -->
        <item>@string/dark_ui_auto_mode_never</item>
        <!-- 2: Auto -->
        <!-- 1: Auto -->
        <item>@string/dark_ui_auto_mode_auto</item>
    </string-array>

+19 −14
Original line number Diff line number Diff line
@@ -18,9 +18,11 @@ import android.app.UiModeManager;
import android.content.Context;
import android.content.res.Configuration;
import android.os.PowerManager;

import androidx.preference.DropDownPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;

@@ -33,7 +35,7 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
    private final UiModeManager mUiModeManager;
    private PowerManager mPowerManager;
    private DropDownPreference mPreference;
    private String mCurrentMode;
    private int mCurrentMode;

    public DarkModeScheduleSelectorController(Context context, String key) {
        super(context, key);
@@ -44,8 +46,8 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);

        mPreference = screen.findPreference(getPreferenceKey());
        init();
    }

    @Override
@@ -53,32 +55,35 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
        return BasePreferenceController.AVAILABLE;
    }

    @Override
    public final void updateState(Preference preference) {
    private void init() {
        final boolean batterySaver = mPowerManager.isPowerSaveMode();
        mPreference.setEnabled(!batterySaver);
        mCurrentMode =
                mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO
                ? mContext.getString(R.string.dark_ui_auto_mode_auto)
                : mContext.getString(R.string.dark_ui_auto_mode_never);
        mPreference.setValue(mCurrentMode);
        mCurrentMode = getCurrentMode();
        mPreference.setValueIndex(mCurrentMode);
    }

    private int getCurrentMode() {
        final int resId = mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO
                ? R.string.dark_ui_auto_mode_auto : R.string.dark_ui_auto_mode_never;
        return mPreference.findIndexOfValue(mContext.getString(resId));
    }

    @Override
    public final boolean onPreferenceChange(Preference preference, Object newValue) {
        String newMode = (String) newValue;
        final int newMode = mPreference.findIndexOfValue((String) newValue);
        if (newMode == mCurrentMode) {
            return false;
        }
        mCurrentMode = newMode;
        if (mCurrentMode == mContext.getString(R.string.dark_ui_auto_mode_never)) {
        if (mCurrentMode == mPreference.findIndexOfValue(
                mContext.getString(R.string.dark_ui_auto_mode_never))) {
            boolean active = (mContext.getResources().getConfiguration().uiMode
                    & Configuration.UI_MODE_NIGHT_YES) != 0;
            int mode = active ? UiModeManager.MODE_NIGHT_YES
                    : UiModeManager.MODE_NIGHT_NO;
            mUiModeManager.setNightMode(mode);

        } else if (mCurrentMode ==
                mContext.getString(R.string.dark_ui_auto_mode_auto)) {
        } else if (mCurrentMode == mPreference.findIndexOfValue(
                mContext.getString(R.string.dark_ui_auto_mode_auto))) {
            mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_AUTO);
        }
        return true;
+23 −15
Original line number Diff line number Diff line
@@ -14,11 +14,27 @@

package com.android.settings.display.darkmode;

import static junit.framework.TestCase.assertFalse;

import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.UiModeManager;
import android.content.Context;
import android.os.PowerManager;

import androidx.preference.DropDownPreference;
import androidx.preference.PreferenceScreen;

import com.android.settings.R;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -26,16 +42,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import com.android.settings.R;

import static junit.framework.TestCase.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(RobolectricTestRunner.class)
public class DarkModeScheduleSelectorControllerTest {
@@ -60,6 +66,11 @@ public class DarkModeScheduleSelectorControllerTest {
        when(mContext.getString(R.string.dark_ui_auto_mode_never)).thenReturn("never");
        when(mContext.getString(R.string.dark_ui_auto_mode_auto)).thenReturn("auto");
        mPreference = spy(new DropDownPreference(mContext));
        mPreference.setEntryValues(new CharSequence[]{
                mContext.getString(R.string.dark_ui_auto_mode_never),
                mContext.getString(R.string.dark_ui_auto_mode_auto)
        });
        doNothing().when(mPreference).setValueIndex(anyInt());
        when(mScreen.findPreference(anyString())).thenReturn(mPreference);
        when(mUiService.setNightModeActivated(anyBoolean())).thenReturn(true);
        mController = new DarkModeScheduleSelectorController(mContext, mPreferenceKey);
@@ -81,23 +92,20 @@ public class DarkModeScheduleSelectorControllerTest {
    public void nightMode_updateStateNone_dropDownValueChangedToNone() {
        when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
        mController.displayPreference(mScreen);
        mController.updateState(mPreference);
        verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_never));
        verify(mPreference).setValueIndex(0);
    }

    @Test
    public void nightMode_updateStateNone_dropDownValueChangedToAuto() {
        when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_AUTO);
        mController.displayPreference(mScreen);
        mController.updateState(mPreference);
        verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_auto));
        verify(mPreference).setValueIndex(1);
    }

    @Test
    public void batterySaver_dropDown_disabledSelector() {
        when(mPM.isPowerSaveMode()).thenReturn(true);
        mController.displayPreference(mScreen);
        mController.updateState(mPreference);
        verify(mPreference).setEnabled(eq(false));
    }
}