From 9aa9199f08b49bf4dfd1675db6cc774c178b7216 Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Fri, 20 Dec 2024 03:13:01 +0000 Subject: [PATCH 1/2] feat(EDT): Migrate entry into Display Settings The EDT toggle will be an subsetting in the DarkTheme settings page - When the Dark Theme main toggle is on, we check the EDT setting to decide applying normal DarkTheme or EDT now. - The EDT preference is disabled when DarkTheme is off Bug: 368721320 Flag: android.view.accessibility.force_invert_color Test: atest ToggleForceInvertPreferenceControllerTest DarkModeSettingsFragmentTest Change-Id: I64e47f92b14ee24a91f469cb55c7bb1285f05c62 --- res/values/strings.xml | 4 +- res/xml/accessibility_color_and_motion.xml | 8 -- res/xml/dark_mode_settings.xml | 44 +++++---- .../accessibility/ColorAndMotionFragment.java | 7 -- .../ColorAndMotionFragmentTest.java | 19 ---- ...leForceInvertPreferenceControllerTest.java | 5 +- .../DarkModeSettingsFragmentTest.java | 99 +++++++++++++++++++ 7 files changed, 129 insertions(+), 57 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/display/darkmode/DarkModeSettingsFragmentTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 730c258601c..11f4bb49cef 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5398,9 +5398,9 @@ Make the mouse pointer more noticeable - Make all apps dark + Make more apps dark - Applies to apps without their own dark theme. Some apps may have display issues, like inverted colors. + Automatically convert light theme apps to dark theme Remove animations diff --git a/res/xml/accessibility_color_and_motion.xml b/res/xml/accessibility_color_and_motion.xml index ffcdbddf7fe..9cc8f8b9bc7 100644 --- a/res/xml/accessibility_color_and_motion.xml +++ b/res/xml/accessibility_color_and_motion.xml @@ -51,14 +51,6 @@ settings:controller="com.android.settings.display.DarkUIPreferenceController" settings:searchable="false"/> - - - + - + - + + + + + + niks = ColorAndMotionFragment.SEARCH_INDEX_DATA_PROVIDER - .getNonIndexableKeys(mContext); - final List keys = - XmlTestUtils.getKeysFromPreferenceXml(mContext, - R.xml.accessibility_color_and_motion); - - assertThat(niks).doesNotContain(ColorAndMotionFragment.TOGGLE_FORCE_INVERT); - assertThat(keys).containsAtLeastElementsIn(niks); - } - - @Test - @RequiresFlagsDisabled(FLAG_FORCE_INVERT_COLOR) public void getNonIndexableKeys_existInXmlLayout() { final List niks = ColorAndMotionFragment.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(mContext); @@ -94,7 +76,6 @@ public class ColorAndMotionFragmentTest { XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.accessibility_color_and_motion); - assertThat(niks).contains(ColorAndMotionFragment.TOGGLE_FORCE_INVERT); assertThat(keys).containsAtLeastElementsIn(niks); } } diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleForceInvertPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleForceInvertPreferenceControllerTest.java index d8197ef9a52..e4fd2c8b8a3 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleForceInvertPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleForceInvertPreferenceControllerTest.java @@ -52,10 +52,7 @@ public class ToggleForceInvertPreferenceControllerTest { @Before public void setUp() { - mController = new ToggleForceInvertPreferenceController( - mContext, - ColorAndMotionFragment.TOGGLE_FORCE_INVERT - ); + mController = new ToggleForceInvertPreferenceController(mContext, "toggle_force_invert"); } @Test diff --git a/tests/robotests/src/com/android/settings/display/darkmode/DarkModeSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/display/darkmode/DarkModeSettingsFragmentTest.java new file mode 100644 index 00000000000..4bd1daa5bdf --- /dev/null +++ b/tests/robotests/src/com/android/settings/display/darkmode/DarkModeSettingsFragmentTest.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2024 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.darkmode; + +import static android.view.accessibility.Flags.FLAG_FORCE_INVERT_COLOR; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.platform.test.annotations.RequiresFlagsDisabled; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; + +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.R; +import com.android.settings.testutils.XmlTestUtils; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.util.List; + +/** Tests for {@link DarkModeSettingsFragment}. */ +@RunWith(RobolectricTestRunner.class) +public class DarkModeSettingsFragmentTest { + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + + private final Context mContext = ApplicationProvider.getApplicationContext(); + private DarkModeSettingsFragment mFragment; + + @Before + public void setUp() { + mFragment = new DarkModeSettingsFragment(); + } + + @Test + public void getMetricsCategory_returnsCorrectCategory() { + assertThat(mFragment.getMetricsCategory()).isEqualTo( + SettingsEnums.DARK_UI_SETTINGS); + } + + @Test + public void getPreferenceScreenResId_returnsCorrectXml() { + assertThat(mFragment.getPreferenceScreenResId()).isEqualTo( + R.xml.dark_mode_settings); + } + + @Test + public void getLogTag_returnsCorrectTag() { + assertThat(mFragment.getLogTag()).isEqualTo("DarkModeSettingsFrag"); + } + + @Test + @RequiresFlagsEnabled(FLAG_FORCE_INVERT_COLOR) + public void getNonIndexableKeys_forceInvertEnabled_existInXmlLayout() { + final List niks = DarkModeSettingsFragment.SEARCH_INDEX_DATA_PROVIDER + .getNonIndexableKeys(mContext); + final List keys = + XmlTestUtils.getKeysFromPreferenceXml(mContext, + R.xml.dark_mode_settings); + + assertThat(niks).doesNotContain("toggle_force_invert"); + assertThat(keys).containsAtLeastElementsIn(niks); + } + + @Test + @RequiresFlagsDisabled(FLAG_FORCE_INVERT_COLOR) + public void getNonIndexableKeys_existInXmlLayout() { + final List niks = DarkModeSettingsFragment.SEARCH_INDEX_DATA_PROVIDER + .getNonIndexableKeys(mContext); + final List keys = + XmlTestUtils.getKeysFromPreferenceXml(mContext, + R.xml.dark_mode_settings); + + assertThat(niks).contains("toggle_force_invert"); + assertThat(keys).containsAtLeastElementsIn(niks); + } +} From dfb3c5b881d2df089106de188b8855cfd0cd8081 Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Mon, 23 Dec 2024 00:06:30 +0000 Subject: [PATCH 2/2] feat(EDT): Update the preference interaction and visiblity logic The EDT toggle will be an subsetting in the DarkTheme settings page - When the Dark Theme main toggle is on, we check the EDT setting to decide applying normal DarkTheme or EDT now. - The EDT preference is disabled when DarkTheme is off Bug: 368721320 Flag: android.view.accessibility.force_invert_color Test: atest ToggleForceInvertPreferenceControllerTest Change-Id: I97841c5b2f03c8c0fb37e0be309d15f312bfedbd --- ...ToggleForceInvertPreferenceController.java | 28 +++++++++++------- ...leForceInvertPreferenceControllerTest.java | 29 +++++++++++++++++++ 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/accessibility/ToggleForceInvertPreferenceController.java b/src/com/android/settings/accessibility/ToggleForceInvertPreferenceController.java index 3f2cc130ffe..be738e31efa 100644 --- a/src/com/android/settings/accessibility/ToggleForceInvertPreferenceController.java +++ b/src/com/android/settings/accessibility/ToggleForceInvertPreferenceController.java @@ -16,11 +16,16 @@ package com.android.settings.accessibility; +import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; +import static com.android.settings.accessibility.AccessibilityUtil.State.ON; + import android.content.Context; +import android.content.res.Configuration; import android.provider.Settings; import android.view.accessibility.Flags; -import androidx.annotation.VisibleForTesting; +import androidx.annotation.NonNull; +import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; @@ -28,27 +33,28 @@ import com.android.settings.core.TogglePreferenceController; /** A toggle preference controller for force invert (force dark). */ public class ToggleForceInvertPreferenceController extends TogglePreferenceController { - public static final String SETTINGS_KEY = - Settings.Secure.ACCESSIBILITY_FORCE_INVERT_COLOR_ENABLED; - - @VisibleForTesting - static final int ON = 1; - @VisibleForTesting - static final int OFF = 0; - public ToggleForceInvertPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); } @Override public boolean isChecked() { - return Settings.Secure.getInt(mContext.getContentResolver(), SETTINGS_KEY, OFF) != OFF; + return Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_FORCE_INVERT_COLOR_ENABLED, OFF) != OFF; } @Override public boolean setChecked(boolean isChecked) { return Settings.Secure.putInt(mContext.getContentResolver(), - SETTINGS_KEY, isChecked ? ON : OFF); + Settings.Secure.ACCESSIBILITY_FORCE_INVERT_COLOR_ENABLED, isChecked ? ON : OFF); + } + + @Override + public void updateState(@NonNull Preference preference) { + super.updateState(preference); + final boolean isDarkModeActivated = (mContext.getResources().getConfiguration().uiMode + & Configuration.UI_MODE_NIGHT_YES) != 0; + preference.setEnabled(isDarkModeActivated); } @Override diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleForceInvertPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleForceInvertPreferenceControllerTest.java index e4fd2c8b8a3..a2b259f60e2 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleForceInvertPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleForceInvertPreferenceControllerTest.java @@ -23,13 +23,18 @@ import static com.android.settings.accessibility.AccessibilityUtil.State.ON; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + import android.content.Context; +import android.content.res.Configuration; import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.provider.Settings; +import androidx.preference.Preference; import androidx.test.core.app.ApplicationProvider; import com.android.settings.core.BasePreferenceController; @@ -69,6 +74,30 @@ public class ToggleForceInvertPreferenceControllerTest { .isEqualTo(BasePreferenceController.AVAILABLE); } + @Test + public void updateState_darkModeOn_preferenceEnabled() { + Configuration config = mContext.getResources().getConfiguration(); + config.uiMode = Configuration.UI_MODE_NIGHT_YES; + mContext.getResources().updateConfiguration(config, null); + + Preference preference = mock(Preference.class); + mController.updateState(preference); + + verify(preference).setEnabled(true); + } + + @Test + public void updateState_darkModeOff_preferenceDisabled() { + Configuration config = mContext.getResources().getConfiguration(); + config.uiMode = Configuration.UI_MODE_NIGHT_NO; + mContext.getResources().updateConfiguration(config, null); + + Preference preference = mock(Preference.class); + mController.updateState(preference); + + verify(preference).setEnabled(false); + } + @Test public void settingOff_reflectsCorrectValue() { setEnabled(false);