OSDN Git Service

Setting to change sysui theme
authorLucas Dupin <dupin@google.com>
Tue, 22 May 2018 21:27:40 +0000 (14:27 -0700)
committerLucas Dupin <dupin@google.com>
Wed, 23 May 2018 21:51:32 +0000 (21:51 +0000)
Users now can manually pick if they want light or dark QS
and launcher

Change-Id: Iaabdb32d9af6a293dfbd5ba6dea3da1d38a13ad3
Merged-In: Ic0a43bc5e8777c39bfe5c0bbc606bf6be20f7168
Fixes: 63903361
Test: make RunSettingsRoboTests ROBOTEST_FILTER=SystemUiThemePreferenceControllerTest
Test: manual

res/values/arrays.xml
res/values/strings.xml
res/xml/display_settings.xml
src/com/android/settings/display/SystemUiThemePreferenceController.java [new file with mode: 0644]
tests/robotests/src/com/android/settings/display/SystemUiThemePreferenceControllerTest.java [new file with mode: 0644]

index 3c272fc..5f39738 100644 (file)
         <item>no</item>
     </string-array>
 
+    <!-- Titles for SystemUI theme preference. -->
+    <string-array name="systemui_theme_entries" >
+        <item>@string/systemui_theme_wallpaper</item>
+        <item>@string/systemui_theme_light</item>
+        <item>@string/systemui_theme_dark</item>
+    </string-array>
+
+    <!-- Values for SystemUI theme preference. -->
+    <string-array name="systemui_theme_values" translatable="false" >
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+    </string-array>
+
     <string-array name="gesture_prevent_ringing_entries" translatable="false">
         <item>@string/prevent_ringing_option_vibrate</item>
         <item>@string/prevent_ringing_option_mute</item>
index 3870fb6..7603f12 100644 (file)
     </string>
 
     <!-- Name of setting for switching device theme [CHAR LIMIT=60] -->
-    <string name="device_theme">Device theme</string>
+    <string name="color_theme">Color theme</string>
     <!-- Name of default device theme [CHAR LIMIT=60] -->
     <string name="default_theme">Default</string>
     <!-- Temporary reboot string, will be removed -->
     <string name="change_theme_reboot" translatable="false">Changing the theme requires a restart.</string>
 
+    <!-- Name of setting for switching the SystemUI theme [CHAR LIMIT=60] -->
+    <string name="device_theme">Device theme</string>
+    <!-- When SystemUI theme is chosen based on the wallpaper color [CHAR LIMIT=60] -->
+    <string name="systemui_theme_wallpaper">Automatic (based on wallpaper)</string>
+    <!-- When SystemUI theme is light [CHAR LIMIT=60] -->
+    <string name="systemui_theme_light">Light</string>
+    <!-- When SystemUI theme is dark [CHAR LIMIT=60] -->
+    <string name="systemui_theme_dark">Dark</string>
+
     <!-- Switch label to show operator name in the status bar [CHAR LIMIT=60] -->
     <string name="show_operator_name_title">Network name</string>
     <!-- Switch summary to show operator name in the status bar [CHAR LIMIT=NONE] -->
index 90198ae..c75b90c 100644 (file)
 
     <ListPreference
         android:key="theme"
-        android:title="@string/device_theme"
+        android:title="@string/color_theme"
         android:summary="@string/summary_placeholder" />
 
+    <ListPreference
+        android:key="systemui_theme"
+        android:title="@string/device_theme"
+        android:entries="@array/systemui_theme_entries"
+        android:entryValues="@array/systemui_theme_values"
+        settings:controller="com.android.settings.display.SystemUiThemePreferenceController" />
+
     <Preference
         android:key="vr_display_pref"
         android:title="@string/display_vr_pref_title"
diff --git a/src/com/android/settings/display/SystemUiThemePreferenceController.java b/src/com/android/settings/display/SystemUiThemePreferenceController.java
new file mode 100644 (file)
index 0000000..3cdc85c
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * 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.display;
+
+import static android.provider.Settings.Secure.THEME_MODE;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.util.FeatureFlagUtils;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+/**
+ * Setting where user can pick if SystemUI will be light, dark or try to match
+ * the wallpaper colors.
+ */
+public class SystemUiThemePreferenceController extends BasePreferenceController
+        implements Preference.OnPreferenceChangeListener {
+
+    private ListPreference mSystemUiThemePref;
+
+    public SystemUiThemePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        boolean enabled = FeatureFlagUtils.isEnabled(mContext, "settings_systemui_theme");
+        return enabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mSystemUiThemePref = (ListPreference) screen.findPreference(getPreferenceKey());
+        int value = Settings.Secure.getInt(mContext.getContentResolver(), THEME_MODE, 0);
+        mSystemUiThemePref.setValue(Integer.toString(value));
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        int value = Integer.parseInt((String) newValue);
+        Settings.Secure.putInt(mContext.getContentResolver(), THEME_MODE, value);
+        refreshSummary(preference);
+        return true;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        int value = Settings.Secure.getInt(mContext.getContentResolver(), THEME_MODE, 0);
+        int index = mSystemUiThemePref.findIndexOfValue(Integer.toString(value));
+        return mSystemUiThemePref.getEntries()[index];
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/display/SystemUiThemePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/SystemUiThemePreferenceControllerTest.java
new file mode 100644 (file)
index 0000000..83fb3eb
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * 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.display;
+
+import static android.provider.Settings.Secure.THEME_MODE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+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;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class SystemUiThemePreferenceControllerTest {
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+    @Mock
+    private ListPreference mListPreference;
+    private Context mContext;
+    private SystemUiThemePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        when(mPreferenceScreen.findPreference(anyString())).thenReturn(mListPreference);
+        CharSequence[] entries = mContext.getResources().getStringArray(
+                R.array.systemui_theme_entries);
+        when(mListPreference.getEntries()).thenReturn(entries);
+        mController = spy(new SystemUiThemePreferenceController(mContext, "systemui_theme"));
+    }
+
+    @Test
+    public void displayPreference_readsSetting() {
+        Settings.Secure.putInt(mContext.getContentResolver(), THEME_MODE, 2);
+        mController.displayPreference(mPreferenceScreen);
+        verify(mListPreference).setValue(eq("2"));
+    }
+
+    @Test
+    public void onPreferenceChange_writesSetting() {
+        Settings.Secure.putInt(mContext.getContentResolver(), THEME_MODE, 2);
+        mController.displayPreference(mPreferenceScreen);
+        mController.onPreferenceChange(mListPreference, "0");
+        int value = Settings.Secure.getInt(mContext.getContentResolver(), THEME_MODE, 2);
+        assertThat(value).isEqualTo(0);
+    }
+
+    @Test
+    public void onPreferenceChange_updatesSummary() {
+        mController.displayPreference(mPreferenceScreen);
+        mController.onPreferenceChange(mListPreference, "0");
+        verify(mController).getSummary();
+    }
+
+}
\ No newline at end of file