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

Commit 74fde3ea authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Setting to change sysui theme

Users now can manually pick if they want light or dark QS
and launcher

Change-Id: Ic0a43bc5e8777c39bfe5c0bbc606bf6be20f7168
Fixes: 63903361
Test: make RunSettingsRoboTests ROBOTEST_FILTER=SystemUiThemePreferenceControllerTest
Test: manual
parent 9ae99272
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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>
+10 −1
Original line number Diff line number Diff line
@@ -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] -->
+8 −1
Original line number Diff line number Diff line
@@ -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"
+72 −0
Original line number Diff line number Diff line
/*
 * 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];
    }
}
+89 −0
Original line number Diff line number Diff line
/*
 * 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