Merge "Setting to change sysui theme"
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 6d8fe08..37462f9 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1096,6 +1096,20 @@
         <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>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e0e1a30..70ff0c5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9857,12 +9857,21 @@
     </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] -->
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index b34fec0..ec8a197 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -132,9 +132,16 @@
 
     <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
index 0000000..3816f88
--- /dev/null
+++ b/src/com/android/settings/display/SystemUiThemePreferenceController.java
@@ -0,0 +1,72 @@
+/*
+ * 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.util.FeatureFlagUtils;
+
+import com.android.settings.core.BasePreferenceController;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+/**
+ * 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
index 0000000..a2e669f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/SystemUiThemePreferenceControllerTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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 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;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+
+@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