From 842a3372910eac7797ca170c4912ca5a126a5c1b Mon Sep 17 00:00:00 2001 From: Geoffrey Boullanger Date: Thu, 21 Nov 2024 11:54:47 +0000 Subject: [PATCH 01/15] Clean-up after com.android.settings.flags.revamp_toggles rollout Flag: EXEMPT refactoring / flag clean-up Test: refactoring CL. Existing unit tests still pass. Bug: 296835792 Change-Id: Ib57ee270c8b5d540cb19997fe1863dd6d782cbe4 --- ...ettings_datetime_flag_declarations.aconfig | 9 -- res/xml/date_time_prefs.xml | 6 +- res/xml/date_time_prefs_revamped.xml | 104 ------------ .../AutoTimeFormatPreferenceController.java | 73 --------- .../AutoTimeZonePreferenceController.java | 23 ++- .../settings/datetime/DateTimeSettings.java | 7 +- ...TimeZoneDetectionPreferenceController.java | 15 +- .../TimeFormatPreferenceController.java | 15 +- ...utoTimeFormatPreferenceControllerTest.java | 152 ------------------ .../AutoTimeZonePreferenceControllerTest.java | 28 ---- ...ZoneDetectionPreferenceControllerTest.java | 10 +- .../TimeFormatPreferenceControllerTest.java | 18 --- 12 files changed, 21 insertions(+), 439 deletions(-) delete mode 100644 res/xml/date_time_prefs_revamped.xml delete mode 100644 src/com/android/settings/datetime/AutoTimeFormatPreferenceController.java delete mode 100644 tests/robotests/src/com/android/settings/datetime/AutoTimeFormatPreferenceControllerTest.java diff --git a/aconfig/settings_datetime_flag_declarations.aconfig b/aconfig/settings_datetime_flag_declarations.aconfig index 93d41d6d5cb..995124339db 100644 --- a/aconfig/settings_datetime_flag_declarations.aconfig +++ b/aconfig/settings_datetime_flag_declarations.aconfig @@ -8,12 +8,3 @@ flag { description: "Enable the time feedback feature, a button to launch feedback in Date & Time Settings" bug: "283239837" } - -flag { - name: "revamp_toggles" - # "location" is used by the Android System Time team for feature flags. - namespace: "location" - description: "Makes the use location toggle dependent on automatic time zone detection" - bug: "296835792" -} - diff --git a/res/xml/date_time_prefs.xml b/res/xml/date_time_prefs.xml index d8643be35f9..fe0fd7e2c52 100644 --- a/res/xml/date_time_prefs.xml +++ b/res/xml/date_time_prefs.xml @@ -1,5 +1,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/com/android/settings/datetime/AutoTimeFormatPreferenceController.java b/src/com/android/settings/datetime/AutoTimeFormatPreferenceController.java deleted file mode 100644 index 44e7cc63b5d..00000000000 --- a/src/com/android/settings/datetime/AutoTimeFormatPreferenceController.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2017 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.datetime; - -import android.content.Context; -import android.provider.Settings; -import android.provider.Settings.System; -import android.text.format.DateFormat; - -import com.android.settings.R; -import com.android.settings.core.TogglePreferenceController; - -import java.util.Locale; - -public class AutoTimeFormatPreferenceController extends TogglePreferenceController { - - public AutoTimeFormatPreferenceController(Context context, String preferenceKey) { - super(context, preferenceKey); - } - - @Override - public int getAvailabilityStatus() { - return AVAILABLE; - } - - @Override - public boolean isChecked() { - return isAutoTimeFormatSelection(mContext); - } - - @Override - public boolean setChecked(boolean isChecked) { - Boolean is24Hour; - if (isChecked) { - is24Hour = null; - } else { - is24Hour = is24HourLocale(mContext.getResources().getConfiguration().locale); - } - TimeFormatPreferenceController.update24HourFormat(mContext, is24Hour); - return true; - } - - @Override - public int getSliceHighlightMenuRes() { - return R.string.menu_key_system; - } - - boolean is24HourLocale(Locale locale) { - return DateFormat.is24HourLocale(locale); - } - - /** - * Returns if the system is currently configured to pick the time format automatically based on - * the locale. - */ - static boolean isAutoTimeFormatSelection(Context context) { - return Settings.System.getString(context.getContentResolver(), System.TIME_12_24) == null; - } -} diff --git a/src/com/android/settings/datetime/AutoTimeZonePreferenceController.java b/src/com/android/settings/datetime/AutoTimeZonePreferenceController.java index 3d8f8011dda..ecd416d1597 100644 --- a/src/com/android/settings/datetime/AutoTimeZonePreferenceController.java +++ b/src/com/android/settings/datetime/AutoTimeZonePreferenceController.java @@ -32,7 +32,6 @@ import androidx.preference.Preference; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; -import com.android.settings.flags.Flags; public class AutoTimeZonePreferenceController extends TogglePreferenceController { @@ -107,19 +106,17 @@ public class AutoTimeZonePreferenceController extends TogglePreferenceController TimeZoneConfiguration.Builder configuration = new TimeZoneConfiguration.Builder() .setAutoDetectionEnabled(isChecked); - if (Flags.revampToggles()) { - // "Use location for time zone" is only used if "Automatic time zone" is enabled. If - // the user toggles off automatic time zone, set the toggle off and disable the toggle. - int geoDetectionCapability = mTimeManager - .getTimeZoneCapabilitiesAndConfig() - .getCapabilities() - .getConfigureGeoDetectionEnabledCapability(); + // "Use location for time zone" is only used if "Automatic time zone" is enabled. If + // the user toggles off automatic time zone, set the toggle off and disable the toggle. + int geoDetectionCapability = mTimeManager + .getTimeZoneCapabilitiesAndConfig() + .getCapabilities() + .getConfigureGeoDetectionEnabledCapability(); - if (!isChecked - && (geoDetectionCapability == CAPABILITY_NOT_APPLICABLE - || geoDetectionCapability == CAPABILITY_POSSESSED)) { - configuration.setGeoDetectionEnabled(false); - } + if (!isChecked + && (geoDetectionCapability == CAPABILITY_NOT_APPLICABLE + || geoDetectionCapability == CAPABILITY_POSSESSED)) { + configuration.setGeoDetectionEnabled(false); } boolean result = mTimeManager.updateTimeZoneConfiguration(configuration.build()); diff --git a/src/com/android/settings/datetime/DateTimeSettings.java b/src/com/android/settings/datetime/DateTimeSettings.java index e5c13bfec18..f3c11d43ac3 100644 --- a/src/com/android/settings/datetime/DateTimeSettings.java +++ b/src/com/android/settings/datetime/DateTimeSettings.java @@ -23,7 +23,6 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; -import com.android.settings.flags.Flags; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; @@ -50,9 +49,6 @@ public class DateTimeSettings extends DashboardFragment implements @Override protected int getPreferenceScreenResId() { - if (Flags.revampToggles()) { - return R.xml.date_time_prefs_revamped; - } return R.xml.date_time_prefs; } @@ -123,6 +119,5 @@ public class DateTimeSettings extends DashboardFragment implements } public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider( - Flags.revampToggles() ? R.xml.date_time_prefs_revamped : R.xml.date_time_prefs); + new BaseSearchIndexProvider(R.xml.date_time_prefs); } diff --git a/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java b/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java index 52d49ac8b78..d475d9de819 100644 --- a/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java +++ b/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java @@ -32,7 +32,6 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.TogglePreferenceController; -import com.android.settings.flags.Flags; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -68,7 +67,7 @@ public class LocationTimeZoneDetectionPreferenceController // forceRefresh set to true as the location toggle may have been turned off by switching off // automatic time zone TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = - getTimeZoneCapabilitiesAndConfig(/*forceRefresh=*/ Flags.revampToggles()); + getTimeZoneCapabilitiesAndConfig(/*forceRefresh=*/ true); TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration(); return configuration.isGeoDetectionEnabled(); } @@ -137,11 +136,7 @@ public class LocationTimeZoneDetectionPreferenceController if (capability == CAPABILITY_NOT_SUPPORTED || capability == CAPABILITY_NOT_ALLOWED) { return UNSUPPORTED_ON_DEVICE; } else if (capability == CAPABILITY_NOT_APPLICABLE || capability == CAPABILITY_POSSESSED) { - if (Flags.revampToggles()) { - return isAutoTimeZoneEnabled() ? AVAILABLE : DISABLED_DEPENDENT_SETTING; - } else { - return AVAILABLE; - } + return isAutoTimeZoneEnabled() ? AVAILABLE : DISABLED_DEPENDENT_SETTING; } else { throw new IllegalStateException("Unknown capability=" + capability); } @@ -151,10 +146,8 @@ public class LocationTimeZoneDetectionPreferenceController public void updateState(Preference preference) { super.updateState(preference); - if (Flags.revampToggles()) { - // enable / disable the toggle based on automatic time zone being enabled or not - preference.setEnabled(isAutoTimeZoneEnabled()); - } + // enable / disable the toggle based on automatic time zone being enabled or not + preference.setEnabled(isAutoTimeZoneEnabled()); } @Override diff --git a/src/com/android/settings/datetime/TimeFormatPreferenceController.java b/src/com/android/settings/datetime/TimeFormatPreferenceController.java index 2dee76e9fbd..c400f4e9d1e 100644 --- a/src/com/android/settings/datetime/TimeFormatPreferenceController.java +++ b/src/com/android/settings/datetime/TimeFormatPreferenceController.java @@ -25,7 +25,6 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; -import com.android.settings.flags.Flags; import java.util.Calendar; import java.util.Date; @@ -73,11 +72,6 @@ public class TimeFormatPreferenceController extends TogglePreferenceController { if (mIsFromSUW) { return DISABLED_DEPENDENT_SETTING; } - if (!Flags.revampToggles()) { - if (AutoTimeFormatPreferenceController.isAutoTimeFormatSelection(mContext)) { - return DISABLED_DEPENDENT_SETTING; - } - } return AVAILABLE; } @@ -120,12 +114,12 @@ public class TimeFormatPreferenceController extends TogglePreferenceController { return DateFormat.is24HourFormat(mContext); } - static void update24HourFormat(Context context, Boolean is24Hour) { + private static void update24HourFormat(Context context, Boolean is24Hour) { set24Hour(context, is24Hour); timeUpdated(context, is24Hour); } - static void timeUpdated(Context context, Boolean is24Hour) { + private static void timeUpdated(Context context, Boolean is24Hour) { Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED); timeChanged.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); int timeFormatPreference; @@ -139,9 +133,8 @@ public class TimeFormatPreferenceController extends TogglePreferenceController { context.sendBroadcast(timeChanged); } - static void set24Hour(Context context, Boolean is24Hour) { - String value = is24Hour == null ? null : - is24Hour ? HOURS_24 : HOURS_12; + private static void set24Hour(Context context, boolean is24Hour) { + String value = is24Hour ? HOURS_24 : HOURS_12; Settings.System.putString(context.getContentResolver(), Settings.System.TIME_12_24, value); } diff --git a/tests/robotests/src/com/android/settings/datetime/AutoTimeFormatPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/AutoTimeFormatPreferenceControllerTest.java deleted file mode 100644 index f9b566e74d8..00000000000 --- a/tests/robotests/src/com/android/settings/datetime/AutoTimeFormatPreferenceControllerTest.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2017 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.datetime; - -import static com.google.common.truth.Truth.assertThat; - -import android.content.Context; -import android.content.Intent; -import android.provider.Settings; -import android.text.format.DateFormat; - -import androidx.preference.SwitchPreference; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.shadows.ShadowApplication; - -import java.util.List; -import java.util.Locale; - -@RunWith(RobolectricTestRunner.class) -public class AutoTimeFormatPreferenceControllerTest { - - @Mock - private UpdateTimeAndDateCallback mCallback; - - private ShadowApplication mApplication; - private Context mContext; - private SwitchPreference mPreference; - private TestAutoTimeFormatPreferenceController mController; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - mApplication = ShadowApplication.getInstance(); - mContext = RuntimeEnvironment.application; - mController = new TestAutoTimeFormatPreferenceController(mContext, "test_key"); - mPreference = new SwitchPreference(mContext); - mPreference.setKey("test_key"); - } - - @Test - public void updateState_24HourSet_shouldCheckPreference() { - Settings.System.putString(mContext.getContentResolver(), Settings.System.TIME_12_24, - TimeFormatPreferenceController.HOURS_24); - - mController.updateState(mPreference); - - assertThat(mPreference.isChecked()).isFalse(); - } - - @Test - public void updateState_12HourSet_shouldCheckPreference() { - Settings.System.putString(mContext.getContentResolver(), Settings.System.TIME_12_24, - TimeFormatPreferenceController.HOURS_12); - - mController.updateState(mPreference); - - assertThat(mPreference.isChecked()).isFalse(); - } - - @Test - public void updateState_autoSet_shouldNotCheckPreference() { - Settings.System.putString(mContext.getContentResolver(), Settings.System.TIME_12_24, null); - - mController.updateState(mPreference); - - assertThat(mPreference.isChecked()).isTrue(); - } - - @Test - public void updatePreference_autoSet_shouldSendIntent_12HourLocale() { - mController.setChecked(false); - - List intentsFired = mApplication.getBroadcastIntents(); - assertThat(intentsFired.size()).isEqualTo(1); - Intent intentFired = intentsFired.get(0); - assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED); - assertThat(intentFired.getIntExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, -1)) - .isEqualTo(Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR); - } - - @Test - public void updatePreference_autoSet_shouldSendIntent_24HourLocale() { - mController.setIs24HourLocale(true); - - mController.setChecked(false); - - List intentsFired = mApplication.getBroadcastIntents(); - assertThat(intentsFired.size()).isEqualTo(1); - Intent intentFired = intentsFired.get(0); - assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED); - assertThat(intentFired.getIntExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, -1)) - .isEqualTo(Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR); - } - - @Test - public void updatePreference_24HourSet_shouldSendIntent() { - mController.setIs24HourLocale(false); - - mController.setChecked(true); - - List intentsFired = mApplication.getBroadcastIntents(); - assertThat(intentsFired.size()).isEqualTo(1); - Intent intentFired = intentsFired.get(0); - assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED); - assertThat(intentFired.getIntExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, -1)) - .isEqualTo(Intent.EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT); - } - - /** - * Extend class under test to change {@link #is24HourLocale} to not call - * {@link DateFormat#is24HourLocale(Locale)} because that's not available in roboelectric. - */ - private static class TestAutoTimeFormatPreferenceController - extends AutoTimeFormatPreferenceController { - - private boolean is24HourLocale = false; - - TestAutoTimeFormatPreferenceController(Context context, String preferenceKey) { - super(context, preferenceKey); - } - - void setIs24HourLocale(boolean value) { - is24HourLocale = value; - } - - @Override - boolean is24HourLocale(Locale locale) { - return is24HourLocale; - } - } -} diff --git a/tests/robotests/src/com/android/settings/datetime/AutoTimeZonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/AutoTimeZonePreferenceControllerTest.java index 7bf8d52543e..2961935d4b1 100644 --- a/tests/robotests/src/com/android/settings/datetime/AutoTimeZonePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/datetime/AutoTimeZonePreferenceControllerTest.java @@ -40,17 +40,12 @@ import android.app.time.TimeZoneConfiguration; import android.app.time.TimeZoneDetectorStatus; import android.content.Context; import android.os.UserHandle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; -import android.platform.test.flag.junit.SetFlagsRule; import androidx.preference.Preference; import com.android.settings.R; -import com.android.settings.flags.Flags; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -62,9 +57,6 @@ import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) public class AutoTimeZonePreferenceControllerTest { - @Rule - public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - @Mock private UpdateTimeAndDateCallback mCallback; private Context mContext; @@ -247,7 +239,6 @@ public class AutoTimeZonePreferenceControllerTest { } @Test - @EnableFlags({Flags.FLAG_REVAMP_TOGGLES}) public void toggleOff_revampFlagOn_shouldToggleOffUseLocation() { TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = createCapabilitiesAndConfig( /* autoSupported= */ true, @@ -266,25 +257,6 @@ public class AutoTimeZonePreferenceControllerTest { verify(mTimeManager).updateTimeZoneConfiguration(configuration); } - @Test - @DisableFlags({Flags.FLAG_REVAMP_TOGGLES}) - public void toggleOff_revampFlagOff_shouldToggleOffUseLocation() { - TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = createCapabilitiesAndConfig( - /* autoSupported= */ true, - /* autoEnabled= */ true, - /* telephonySupported= */ true, - /* locationSupported= */ true); - when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig); - - mController.setChecked(false); - - TimeZoneConfiguration configuration = new TimeZoneConfiguration.Builder() - .setAutoDetectionEnabled(false) - .build(); - - verify(mTimeManager).updateTimeZoneConfiguration(configuration); - } - private static TimeZoneCapabilitiesAndConfig createCapabilitiesAndConfig( boolean autoSupported, boolean autoEnabled, boolean telephonySupported) { return createCapabilitiesAndConfig(autoSupported, autoEnabled, telephonySupported, false); diff --git a/tests/robotests/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceControllerTest.java index 40794d217ee..2f232574760 100644 --- a/tests/robotests/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceControllerTest.java @@ -45,17 +45,13 @@ import android.app.time.TimeZoneConfiguration; import android.app.time.TimeZoneDetectorStatus; import android.content.Context; import android.os.UserHandle; -import android.platform.test.annotations.EnableFlags; -import android.platform.test.flag.junit.SetFlagsRule; import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.core.InstrumentedPreferenceFragment; -import com.android.settings.flags.Flags; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; @@ -71,9 +67,6 @@ import org.robolectric.annotation.Config; }) public class LocationTimeZoneDetectionPreferenceControllerTest { - @Rule - public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - @Mock private TimeManager mTimeManager; private Context mContext; @@ -131,8 +124,7 @@ public class LocationTimeZoneDetectionPreferenceControllerTest { } @Test - @EnableFlags({Flags.FLAG_REVAMP_TOGGLES}) - public void flagRevampTogglesOn_toggleOff_automaticTimeZone_disablesLocationToggle() { + public void toggleOff_automaticTimeZone_disablesLocationToggle() { TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = createTimeZoneCapabilitiesAndConfig(/* useLocationEnabled= */ true, CAPABILITY_POSSESSED, /* setAutoDetectionEnabled= */ false); diff --git a/tests/robotests/src/com/android/settings/datetime/TimeFormatPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/TimeFormatPreferenceControllerTest.java index c5aac843018..a34192255a2 100644 --- a/tests/robotests/src/com/android/settings/datetime/TimeFormatPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/datetime/TimeFormatPreferenceControllerTest.java @@ -23,16 +23,11 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.content.Intent; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import androidx.preference.SwitchPreference; -import com.android.settings.flags.Flags; - import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -46,9 +41,6 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class TimeFormatPreferenceControllerTest { - @Rule - public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - @Mock private UpdateTimeAndDateCallback mCallback; @@ -104,16 +96,6 @@ public class TimeFormatPreferenceControllerTest { assertThat(mPreference.isChecked()).isFalse(); } - @Test - @DisableFlags({Flags.FLAG_REVAMP_TOGGLES}) - public void updateState_autoSet_shouldNotEnablePreference() { - Settings.System.putString(mContext.getContentResolver(), Settings.System.TIME_12_24, null); - - mController.updateState(mPreference); - - assertThat(mPreference.isEnabled()).isFalse(); - } - @Test public void updatePreference_12HourSet_shouldSendIntent() { mController.setChecked(false); From 2e10dc109fa2136c2763c51139f0f74ba9300ec1 Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Fri, 13 Dec 2024 00:06:05 +0000 Subject: [PATCH 02/15] fix(ReduceBrightColorsPreferenceController) Different feature configs This change updates the tests for ReduceBrightColorsPreferenceController to account for different combinations of feature flags and configurations, specifically related to the "Even Dimmer" flag and the availability of Reduce Bright Colors. The updated tests ensure that the preference controller correctly determines its availability based on these factors, improving test coverage and reliability. This addresses inconsistencies between the code and test cases, ensuring accurate behavior across various device configurations. Bug: 383076111 Test: atest ReduceBrightColorsPreferenceControllerTest Flag: com.android.server.display.feature.flags.even_dimmer Change-Id: Iec53b416ec69a74f1f353f684358f265b022456f --- ...lorsIntensityPreferenceControllerTest.java | 107 +++++++++++++++++- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java index c3ccf34767c..96d9583a9f7 100644 --- a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java @@ -24,20 +24,29 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.internal.R; +import com.android.server.display.feature.flags.Flags; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +/** Tests for {@link ReduceBrightColorsIntensityPreferenceController} */ @RunWith(AndroidJUnit4.class) public class ReduceBrightColorsIntensityPreferenceControllerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private Context mContext; private Resources mResources; private ReduceBrightColorsIntensityPreferenceController mPreferenceController; @@ -52,27 +61,119 @@ public class ReduceBrightColorsIntensityPreferenceControllerTest { } @Test - public void isAvailable_configuredRbcAvailable_enabledRbc_shouldReturnTrue() { + @DisableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOffAndDisabled_RbcOnAndAvailable_returnTrue() { + doReturn(false).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1); doReturn(true).when(mResources).getBoolean( R.bool.config_reduceBrightColorsAvailable); + assertThat(mPreferenceController.isAvailable()).isTrue(); } + @Test - public void isAvailable_configuredRbcAvailable_disabledRbc_shouldReturnTrue() { + @DisableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOffAndDisabled_RbcOffAndAvailable_returnTrue() { + doReturn(false).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 0); doReturn(true).when(mResources).getBoolean( R.bool.config_reduceBrightColorsAvailable); + assertThat(mPreferenceController.isAvailable()).isTrue(); } + @Test - public void isAvailable_configuredRbcUnavailable_enabledRbc_shouldReturnFalse() { + @DisableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOffAndDisabled_RbcOnAndUnavailable_returnFalse() { + doReturn(false).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1); doReturn(false).when(mResources).getBoolean( R.bool.config_reduceBrightColorsAvailable); + + assertThat(mPreferenceController.isAvailable()).isFalse(); + } + + @Test + @EnableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOnAndDisabled_RbcOnAndAvailable_returnTrue() { + doReturn(false).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1); + doReturn(true).when(mResources).getBoolean( + R.bool.config_reduceBrightColorsAvailable); + + assertThat(mPreferenceController.isAvailable()).isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOnAndDisabled_RbcOffAndAvailable_returnTrue() { + doReturn(false).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 0); + doReturn(true).when(mResources).getBoolean( + R.bool.config_reduceBrightColorsAvailable); + + assertThat(mPreferenceController.isAvailable()).isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOnAndDisabled_RbcOnAndUnavailable_returnFalse() { + doReturn(false).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1); + doReturn(false).when(mResources).getBoolean( + R.bool.config_reduceBrightColorsAvailable); + + assertThat(mPreferenceController.isAvailable()).isFalse(); + } + + @Test + @EnableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOnAndEnabled_RbcOnAndAvailable_returnFalse() { + doReturn(true).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1); + doReturn(true).when(mResources).getBoolean( + R.bool.config_reduceBrightColorsAvailable); + + assertThat(mPreferenceController.isAvailable()).isFalse(); + } + + @Test + @EnableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOnAndEnabled_RbcOffAndAvailable_returnFalse() { + doReturn(true).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 0); + doReturn(true).when(mResources).getBoolean( + R.bool.config_reduceBrightColorsAvailable); + + assertThat(mPreferenceController.isAvailable()).isFalse(); + } + + @Test + @EnableFlags(Flags.FLAG_EVEN_DIMMER) + public void isAvailable_whenEvenDimmerOnAndEnabled_RbcOnAndUnavailable_returnFalse() { + doReturn(true).when(mResources).getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1); + doReturn(false).when(mResources).getBoolean( + R.bool.config_reduceBrightColorsAvailable); + assertThat(mPreferenceController.isAvailable()).isFalse(); } From 224c16db50cbfaa227d0e286922ca765516dfabb Mon Sep 17 00:00:00 2001 From: Yuchen Date: Fri, 13 Dec 2024 02:47:51 +0000 Subject: [PATCH 03/15] [Expressive design] Rename ComposeMainSwitchPreference to ComposeGroupSectionPreference. Bug: 349681531 Flag: EXEMPT migration Test: visual Change-Id: I5cf44a951894d56f0a7c5d2794442bfcdebb05d1 --- res/xml/mobile_network_settings.xml | 2 +- src/com/android/settings/spa/preference/ComposePreference.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml index a1a2276ee14..8c948ff11da 100644 --- a/res/xml/mobile_network_settings.xml +++ b/res/xml/mobile_network_settings.xml @@ -18,7 +18,7 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="mobile_network_pref_screen"> - diff --git a/src/com/android/settings/spa/preference/ComposePreference.kt b/src/com/android/settings/spa/preference/ComposePreference.kt index 91b2d8ac81a..57aa3866390 100644 --- a/src/com/android/settings/spa/preference/ComposePreference.kt +++ b/src/com/android/settings/spa/preference/ComposePreference.kt @@ -28,7 +28,7 @@ import com.android.settings.R import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.widget.GroupSectionDividerMixin -open class ComposeMainSwitchPreference @JvmOverloads constructor( +open class ComposeGroupSectionPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, From 250f5cade552f49436b229c92ee8d07b39ccc945 Mon Sep 17 00:00:00 2001 From: Wei-Hong Hsu Date: Mon, 16 Dec 2024 05:52:31 +0000 Subject: [PATCH 04/15] nfc: allow the nfc quick toggle title to be searchable allow the nfc quick toggle title to be searchable Bug: 374853887 Test: search NFC in the settings search. Change-Id: I1115b1705b91eb9f40acbef83ed92b9aee11dd3d --- res/xml/connected_devices_advanced.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/connected_devices_advanced.xml b/res/xml/connected_devices_advanced.xml index 779555b20c0..f491055904b 100644 --- a/res/xml/connected_devices_advanced.xml +++ b/res/xml/connected_devices_advanced.xml @@ -42,7 +42,7 @@ android:order="-7" android:title="@string/nfc_quick_toggle_title" settings:controller="com.android.settings.connecteddevice.NfcAndPaymentFragmentController" - settings:searchable="false" + settings:searchable="true" settings:useAdminDisabledSummary="true" settings:userRestriction="no_near_field_communication_radio" /> From f70abd26807d3f8e9344f48dd7413eef349c069b Mon Sep 17 00:00:00 2001 From: danielwbhuang Date: Thu, 12 Dec 2024 20:56:13 +0800 Subject: [PATCH 05/15] Create language and region settings page 1. Use flag to control the UI migration 2. Create language_and_region_settings.xml for new UI migration. Bug: 379962955 Flag: com.android.settings.flags.regional_preferences_api_enabled Test: check hsv and atest LanguagePreferenceControllerTest Change-Id: If8d2303a2a3061231e69d1a45ad432c061da3545 --- res/values/strings.xml | 2 + res/xml/language_and_region_settings.xml | 127 +++++++++++++++++ res/xml/language_settings.xml | 73 ---------- res/xml/system_dashboard_fragment.xml | 9 ++ ...DefaultVoiceInputPreferenceController.java | 7 +- ...LanguageAndRegionPreferenceController.java | 44 ++++++ .../language/LanguageAndRegionSettings.java | 129 ++++++++++++++++++ .../LanguagePreferenceController.java | 5 + .../settings/language/LanguageSettings.java | 4 + .../MeasurementSystemItemFragment.java | 2 +- .../LanguagePreferenceControllerTest.java | 7 + 11 files changed, 334 insertions(+), 75 deletions(-) create mode 100644 res/xml/language_and_region_settings.xml create mode 100644 src/com/android/settings/language/LanguageAndRegionPreferenceController.java create mode 100644 src/com/android/settings/language/LanguageAndRegionSettings.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 883147a1783..dc81ccf51d9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4514,6 +4514,8 @@ Languages & input Languages + + Language & region Keyboard diff --git a/res/xml/language_and_region_settings.xml b/res/xml/language_and_region_settings.xml new file mode 100644 index 00000000000..5626f2206e8 --- /dev/null +++ b/res/xml/language_and_region_settings.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml index 44a195c51f0..eccbbc178ca 100644 --- a/res/xml/language_settings.xml +++ b/res/xml/language_settings.xml @@ -49,72 +49,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -136,11 +70,4 @@ android:fragment="com.android.settings.tts.TextToSpeechSettings" settings:searchable="false"/> - - diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml index 83cdf64fc00..97650eec1a8 100644 --- a/res/xml/system_dashboard_fragment.xml +++ b/res/xml/system_dashboard_fragment.xml @@ -29,6 +29,15 @@ android:fragment="com.android.settings.language.LanguageSettings" settings:controller="com.android.settings.language.LanguagePreferenceController"/> + + createPreferenceControllers(Context context) { + return buildPreferenceControllers(context, getSettingsLifecycle()); + } + + private static List buildPreferenceControllers( + @NonNull Context context, @Nullable Lifecycle lifecycle) { + final List controllers = new ArrayList<>(); + + final DefaultVoiceInputPreferenceController defaultVoiceInputPreferenceController = + new DefaultVoiceInputPreferenceController(context, lifecycle); + final TtsPreferenceController ttsPreferenceController = + new TtsPreferenceController(context, KEY_TEXT_TO_SPEECH); + final OnDeviceRecognitionPreferenceController onDeviceRecognitionPreferenceController = + new OnDeviceRecognitionPreferenceController(context, KEY_ON_DEVICE_RECOGNITION); + + controllers.add(defaultVoiceInputPreferenceController); + controllers.add(ttsPreferenceController); + List speechCategoryChildren = new ArrayList<>( + List.of(defaultVoiceInputPreferenceController, ttsPreferenceController)); + + if (onDeviceRecognitionPreferenceController.isAvailable()) { + controllers.add(onDeviceRecognitionPreferenceController); + speechCategoryChildren.add(onDeviceRecognitionPreferenceController); + } + + controllers.add(new PreferenceCategoryController(context, KEY_SPEECH_CATEGORY) + .setChildren(speechCategoryChildren)); + + return controllers; + } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.language_and_region_settings) { + + @Override + @NonNull + public List createPreferenceControllers( + @NonNull Context context) { + return buildPreferenceControllers(context, null); + } + + @Override + protected boolean isPageSearchEnabled(Context context) { + if (Flags.regionalPreferencesApiEnabled()) { + return true; + } + return false; + } + }; +} diff --git a/src/com/android/settings/language/LanguagePreferenceController.java b/src/com/android/settings/language/LanguagePreferenceController.java index 84624a2bf30..90aaec42d44 100644 --- a/src/com/android/settings/language/LanguagePreferenceController.java +++ b/src/com/android/settings/language/LanguagePreferenceController.java @@ -22,6 +22,7 @@ import android.content.pm.PackageManager; import com.android.settings.Settings; import com.android.settings.core.BasePreferenceController; +import com.android.settings.flags.Flags; /** * This is a display controller for new language activity entry. @@ -34,6 +35,10 @@ public class LanguagePreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { + if (Flags.regionalPreferencesApiEnabled()) { + setActivityEnabled(mContext, Settings.LanguageSettingsActivity.class, false); + return CONDITIONALLY_UNAVAILABLE; + } setActivityEnabled(mContext, Settings.LanguageSettingsActivity.class, true); return AVAILABLE; } diff --git a/src/com/android/settings/language/LanguageSettings.java b/src/com/android/settings/language/LanguageSettings.java index d992ff27bc9..58df05307f0 100644 --- a/src/com/android/settings/language/LanguageSettings.java +++ b/src/com/android/settings/language/LanguageSettings.java @@ -25,6 +25,7 @@ import androidx.annotation.Nullable; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.flags.Flags; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; @@ -116,6 +117,9 @@ public class LanguageSettings extends DashboardFragment { } @Override protected boolean isPageSearchEnabled(Context context) { + if (Flags.regionalPreferencesApiEnabled()) { + return false; + } return true; } }; diff --git a/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java b/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java index 9f15cf4ab36..231a34e6afd 100644 --- a/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java +++ b/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java @@ -63,7 +63,7 @@ public class MeasurementSystemItemFragment extends DashboardFragment { new BaseSearchIndexProvider(R.xml.regional_preferences_measurement_system) { @Override protected boolean isPageSearchEnabled(Context context) { - if (Flags.regionalPreferencesApiEnabled()) { + if (!Flags.regionalPreferencesApiEnabled()) { return false; } return true; diff --git a/tests/unit/src/com/android/settings/language/LanguagePreferenceControllerTest.java b/tests/unit/src/com/android/settings/language/LanguagePreferenceControllerTest.java index 656fa272ce2..2209355e966 100644 --- a/tests/unit/src/com/android/settings/language/LanguagePreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/language/LanguagePreferenceControllerTest.java @@ -21,18 +21,24 @@ import static org.junit.Assert.assertTrue; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.core.app.ApplicationProvider; import com.android.settings.Settings; +import com.android.settings.flags.Flags; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; public class LanguagePreferenceControllerTest { private Context mContext; private LanguagePreferenceController mController; + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + @Before public void setup() { mContext = ApplicationProvider.getApplicationContext(); @@ -40,6 +46,7 @@ public class LanguagePreferenceControllerTest { } @Test + @DisableFlags(Flags.FLAG_REGIONAL_PREFERENCES_API_ENABLED) public void getAvailabilityStatus_featureFlagOff_LanguageSettingsActivitydisabled() { mController.getAvailabilityStatus(); From 3f2448cfd6952e93c1ac0be3e08f9f18bc51535f Mon Sep 17 00:00:00 2001 From: Yuchen Date: Mon, 16 Dec 2024 07:28:59 +0000 Subject: [PATCH 06/15] [Expressive design] Update ApnPreference. Migrate to TwoTargetPreference. screenshot: https://hsv.googleplex.com/4840366858567680 Bug: 349681531 Flag: EXEMPT migration Test: visual Change-Id: Ia88f9f5f7f5388a7e66189e0b7a0be641d05f140 --- res/layout/apn_preference_layout.xml | 76 ----------------- res/values/attrs.xml | 2 - res/values/styles_preference.xml | 5 -- res/values/styles_preference_expressive.xml | 1 - .../settings/network/apn/ApnPreference.java | 85 +++++++------------ 5 files changed, 33 insertions(+), 136 deletions(-) delete mode 100644 res/layout/apn_preference_layout.xml diff --git a/res/layout/apn_preference_layout.xml b/res/layout/apn_preference_layout.xml deleted file mode 100644 index 9b6efe78e8f..00000000000 --- a/res/layout/apn_preference_layout.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 200253acce6..87c3ce93eea 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -50,8 +50,6 @@ - - diff --git a/res/values/styles_preference.xml b/res/values/styles_preference.xml index ec0a747832f..c7638d32c97 100644 --- a/res/values/styles_preference.xml +++ b/res/values/styles_preference.xml @@ -20,7 +20,6 @@ - - diff --git a/res/values/styles_preference_expressive.xml b/res/values/styles_preference_expressive.xml index a6fe2f18068..278fe0083ba 100644 --- a/res/values/styles_preference_expressive.xml +++ b/res/values/styles_preference_expressive.xml @@ -20,7 +20,6 @@