Merge "Refine the DarkModeScheduleSelectorController"

This commit is contained in:
Jay Aliomer
2019-12-17 17:26:19 +00:00
committed by Android (Google) Code Review
3 changed files with 44 additions and 31 deletions

View File

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

View File

@@ -18,9 +18,11 @@ import android.app.UiModeManager;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.PowerManager; import android.os.PowerManager;
import androidx.preference.DropDownPreference; import androidx.preference.DropDownPreference;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
@@ -33,7 +35,7 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
private final UiModeManager mUiModeManager; private final UiModeManager mUiModeManager;
private PowerManager mPowerManager; private PowerManager mPowerManager;
private DropDownPreference mPreference; private DropDownPreference mPreference;
private String mCurrentMode; private int mCurrentMode;
public DarkModeScheduleSelectorController(Context context, String key) { public DarkModeScheduleSelectorController(Context context, String key) {
super(context, key); super(context, key);
@@ -44,8 +46,8 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey()); mPreference = screen.findPreference(getPreferenceKey());
init();
} }
@Override @Override
@@ -53,32 +55,35 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
return BasePreferenceController.AVAILABLE; return BasePreferenceController.AVAILABLE;
} }
@Override private void init() {
public final void updateState(Preference preference) {
final boolean batterySaver = mPowerManager.isPowerSaveMode(); final boolean batterySaver = mPowerManager.isPowerSaveMode();
mPreference.setEnabled(!batterySaver); mPreference.setEnabled(!batterySaver);
mCurrentMode = mCurrentMode = getCurrentMode();
mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO mPreference.setValueIndex(mCurrentMode);
? mContext.getString(R.string.dark_ui_auto_mode_auto)
: mContext.getString(R.string.dark_ui_auto_mode_never);
mPreference.setValue(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 @Override
public final boolean onPreferenceChange(Preference preference, Object newValue) { public final boolean onPreferenceChange(Preference preference, Object newValue) {
String newMode = (String) newValue; final int newMode = mPreference.findIndexOfValue((String) newValue);
if (newMode == mCurrentMode) { if (newMode == mCurrentMode) {
return false; return false;
} }
mCurrentMode = newMode; 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 boolean active = (mContext.getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_YES) != 0; & Configuration.UI_MODE_NIGHT_YES) != 0;
int mode = active ? UiModeManager.MODE_NIGHT_YES int mode = active ? UiModeManager.MODE_NIGHT_YES
: UiModeManager.MODE_NIGHT_NO; : UiModeManager.MODE_NIGHT_NO;
mUiModeManager.setNightMode(mode); mUiModeManager.setNightMode(mode);
} else if (mCurrentMode == mPreference.findIndexOfValue(
} else if (mCurrentMode == mContext.getString(R.string.dark_ui_auto_mode_auto))) {
mContext.getString(R.string.dark_ui_auto_mode_auto)) {
mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_AUTO); mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_AUTO);
} }
return true; return true;

View File

@@ -14,11 +14,27 @@
package com.android.settings.display.darkmode; 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.app.UiModeManager;
import android.content.Context; import android.content.Context;
import android.os.PowerManager; import android.os.PowerManager;
import androidx.preference.DropDownPreference; import androidx.preference.DropDownPreference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -26,16 +42,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; 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) @RunWith(RobolectricTestRunner.class)
public class DarkModeScheduleSelectorControllerTest { 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_never)).thenReturn("never");
when(mContext.getString(R.string.dark_ui_auto_mode_auto)).thenReturn("auto"); when(mContext.getString(R.string.dark_ui_auto_mode_auto)).thenReturn("auto");
mPreference = spy(new DropDownPreference(mContext)); 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(mScreen.findPreference(anyString())).thenReturn(mPreference);
when(mUiService.setNightModeActivated(anyBoolean())).thenReturn(true); when(mUiService.setNightModeActivated(anyBoolean())).thenReturn(true);
mController = new DarkModeScheduleSelectorController(mContext, mPreferenceKey); mController = new DarkModeScheduleSelectorController(mContext, mPreferenceKey);
@@ -81,23 +92,20 @@ public class DarkModeScheduleSelectorControllerTest {
public void nightMode_updateStateNone_dropDownValueChangedToNone() { public void nightMode_updateStateNone_dropDownValueChangedToNone() {
when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES); when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mController.updateState(mPreference); verify(mPreference).setValueIndex(0);
verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_never));
} }
@Test @Test
public void nightMode_updateStateNone_dropDownValueChangedToAuto() { public void nightMode_updateStateNone_dropDownValueChangedToAuto() {
when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_AUTO); when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_AUTO);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mController.updateState(mPreference); verify(mPreference).setValueIndex(1);
verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_auto));
} }
@Test @Test
public void batterySaver_dropDown_disabledSelector() { public void batterySaver_dropDown_disabledSelector() {
when(mPM.isPowerSaveMode()).thenReturn(true); when(mPM.isPowerSaveMode()).thenReturn(true);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mController.updateState(mPreference);
verify(mPreference).setEnabled(eq(false)); verify(mPreference).setEnabled(eq(false));
} }
} }