Merge "Setting to control UI mode"

This commit is contained in:
TreeHugger Robot
2018-02-23 04:24:54 +00:00
committed by Android (Google) Code Review
6 changed files with 220 additions and 0 deletions

View File

@@ -1079,4 +1079,18 @@
<item>2</item>
</string-array>
<!-- Titles for ui dark mode preference. -->
<string-array name="dark_ui_mode_entries" >
<item>Automatic (based on time of day)</item>
<item>Always on</item>
<item>Always off</item>
</string-array>
<!-- Values for ui dark mode preference. -->
<string-array name="dark_ui_mode_values" translatable="false" >
<item>auto</item>
<item>yes</item>
<item>no</item>
</string-array>
</resources>

View File

@@ -8887,6 +8887,12 @@
<!-- [CHAR LIMIT=60] Name of dev option called "System UI demo mode" -->
<string name="demo_mode">System UI demo mode</string>
<!-- [CHAR LIMIT=60] Name of dev option that changes the UI Mode -->
<string name="dark_ui_mode">Night mode</string>
<!-- [CHAR LIMIT=60] Name of dev option that changes the color of the UI -->
<string name="dark_ui_mode_title">Set Night mode</string>
<!-- [CHAR LIMIT=60] Name of dev option to enable extra quick settings tiles -->
<string name="quick_settings_developer_tiles">Quick settings developer tiles</string>

View File

@@ -112,6 +112,13 @@
<intent android:action="com.android.settings.action.DEMO_MODE" />
</Preference>
<ListPreference
android:key="dark_ui_mode"
android:title="@string/dark_ui_mode"
android:dialogTitle="@string/dark_ui_mode_title"
android:entries="@array/dark_ui_mode_entries"
android:entryValues="@array/dark_ui_mode_values" />
<Preference
android:key="quick_settings_tiles"
android:title="@string/quick_settings_developer_tiles"

View File

@@ -0,0 +1,107 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.settings.development;
import android.app.UiModeManager;
import android.content.Context;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
public class DarkUIPreferenceController extends
DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
PreferenceControllerMixin {
private static final String DARK_UI_KEY = "dark_ui_mode";
private final UiModeManager mUiModeManager;
public DarkUIPreferenceController(Context context) {
this(context, context.getSystemService(UiModeManager.class));
}
@VisibleForTesting
DarkUIPreferenceController(Context context, UiModeManager uiModeManager) {
super(context);
mUiModeManager = uiModeManager;
}
@Override
public String getPreferenceKey() {
return DARK_UI_KEY;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
mUiModeManager.setNightMode(modeToInt((String) newValue));
updateSummary(preference);
return true;
}
@Override
public void updateState(Preference preference) {
updateSummary(preference);
}
private void updateSummary(Preference preference) {
int mode = mUiModeManager.getNightMode();
((ListPreference) preference).setValue(modeToString(mode));
preference.setSummary(modeToDescription(mode));
}
private String modeToDescription(int mode) {
String[] values = mContext.getResources().getStringArray(R.array.dark_ui_mode_entries);
switch (mode) {
case UiModeManager.MODE_NIGHT_AUTO:
return values[0];
case UiModeManager.MODE_NIGHT_YES:
return values[1];
case UiModeManager.MODE_NIGHT_NO:
default:
return values[2];
}
}
private String modeToString(int mode) {
switch (mode) {
case UiModeManager.MODE_NIGHT_AUTO:
return "auto";
case UiModeManager.MODE_NIGHT_YES:
return "yes";
case UiModeManager.MODE_NIGHT_NO:
default:
return "no";
}
}
private int modeToInt(String mode) {
switch (mode) {
case "auto":
return UiModeManager.MODE_NIGHT_AUTO;
case "yes":
return UiModeManager.MODE_NIGHT_YES;
case "no":
default:
return UiModeManager.MODE_NIGHT_NO;
}
}
}

View File

@@ -375,6 +375,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
controllers.add(new LocalBackupPasswordPreferenceController(context));
controllers.add(new StayAwakePreferenceController(context, lifecycle));
controllers.add(new HdcpCheckingPreferenceController(context));
controllers.add(new DarkUIPreferenceController(context));
controllers.add(new BluetoothSnoopLogPreferenceController(context));
controllers.add(new OemUnlockPreferenceController(context, activity, fragment));
controllers.add(new FileEncryptionPreferenceController(context));

View File

@@ -0,0 +1,85 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.settings.development;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.UiModeManager;
import android.content.Context;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH,
sdk = TestConfig.SDK_VERSION)
public class DarkUIPreferenceControllerTest {
private Context mContext;
@Mock
private ListPreference mPreference;
@Mock
private PreferenceScreen mPreferenceScreen;
@Mock
private UiModeManager mUiModeManager;
private DarkUIPreferenceController mController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mController = new DarkUIPreferenceController(mContext, mUiModeManager);
when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
mPreference);
mController.displayPreference(mPreferenceScreen);
}
@Test
public void onPreferenceChanged_setAuto() {
mController.onPreferenceChange(mPreference, "auto");
verify(mUiModeManager).setNightMode(eq(UiModeManager.MODE_NIGHT_AUTO));
}
@Test
public void onPreferenceChanged_setNightMode() {
mController.onPreferenceChange(mPreference, "yes");
verify(mUiModeManager).setNightMode(eq(UiModeManager.MODE_NIGHT_YES));
}
@Test
public void onPreferenceChanged_setDayMode() {
mController.onPreferenceChange(mPreference, "no");
verify(mUiModeManager).setNightMode(eq(UiModeManager.MODE_NIGHT_NO));
}
public int getCurrentMode() {
final UiModeManager uiModeManager = mContext.getSystemService(UiModeManager.class);
return uiModeManager.getNightMode();
}
}