From fd6a3aa5167deb40888c4794948cb32cf592cfae Mon Sep 17 00:00:00 2001 From: Jason Chang Date: Tue, 14 May 2024 08:58:16 +0000 Subject: [PATCH 1/8] Remove redundant marginStart for FaceSettings button To set button's marginStart to zero to align layout. Flag: NONE Bug: 331945001 Test: manual build and check UI visually in Fold/Unfold and rotate state Change-Id: I967d9ac1af963c6dcdac631a4fba9631a8d5662c (cherry picked from commit a547a145dcee05f6b261aafe385ba5d0ea09ccdb) --- res/layout/face_enroll_button.xml | 1 + res/layout/face_remove_button.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/res/layout/face_enroll_button.xml b/res/layout/face_enroll_button.xml index 62666503492..73fbd77b7d1 100644 --- a/res/layout/face_enroll_button.xml +++ b/res/layout/face_enroll_button.xml @@ -27,6 +27,7 @@ style="@style/SudGlifButton.Primary" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginStart="0dp" android:layout_gravity="start" android:text="@string/security_settings_face_settings_enroll"/> diff --git a/res/layout/face_remove_button.xml b/res/layout/face_remove_button.xml index 2c2497ab1c5..f281961b8ee 100644 --- a/res/layout/face_remove_button.xml +++ b/res/layout/face_remove_button.xml @@ -27,6 +27,7 @@ style="@style/SudGlifButton.Primary" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginStart="0dp" android:layout_gravity="start" android:text="@string/security_settings_face_settings_remove_face_model"/> From a6a4480736cfbf0abe6fcd4651a4a278688c079d Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Wed, 15 May 2024 07:52:18 +0000 Subject: [PATCH 2/8] Fix SettingsHomepageActivityTest failed Fixes: 340439758 Test: atest SettingsHomepageActivityTest Change-Id: I8f6fbb91f92982abd3b1ebadff763270537b9c3e --- res/layout/settings_homepage_container_v2.xml | 2 +- .../android/settings/homepage/SettingsHomepageActivity.java | 4 ++-- .../settings/homepage/SettingsHomepageActivityTest.java | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/res/layout/settings_homepage_container_v2.xml b/res/layout/settings_homepage_container_v2.xml index 73b8f21cebf..55fb1dac57f 100644 --- a/res/layout/settings_homepage_container_v2.xml +++ b/res/layout/settings_homepage_container_v2.xml @@ -35,7 +35,7 @@ android:orientation="vertical"> Date: Wed, 15 May 2024 12:06:50 +0000 Subject: [PATCH 3/8] Show sim onboarding for user when insert psim When the user inserts the psim, showing the sim onboarding for the user to setup the sim switching or the default data subscription. Bug: 336488573 Test: verify UI Change-Id: I1faab0a3166efab3f1fd82d6a69ab4d33b624556 --- .../sim/receivers/SimSlotChangeHandler.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/sim/receivers/SimSlotChangeHandler.java b/src/com/android/settings/sim/receivers/SimSlotChangeHandler.java index be40f2961a6..8f934d7e887 100644 --- a/src/com/android/settings/sim/receivers/SimSlotChangeHandler.java +++ b/src/com/android/settings/sim/receivers/SimSlotChangeHandler.java @@ -108,19 +108,18 @@ public class SimSlotChangeHandler { setRemovableSimSlotState(mContext, currentRemovableSlotState); if (mTelMgr.getActiveModemCount() > 1) { - if (!Flags.isDualSimOnboardingEnabled() && !isMultipleEnabledProfilesSupported()) { - Log.d(TAG, "The device is already in DSDS mode and no MEP. Do nothing."); - return; - } if (!isRemovableSimInserted) { Log.d(TAG, "Removable Sim is not inserted in DSDS mode. Do nothing."); return; } - boolean isDdsInvalidForNewUi = Flags.isDualSimOnboardingEnabled() - && SubscriptionManager.getDefaultDataSubscriptionId() - == SubscriptionManager.INVALID_SUBSCRIPTION_ID; - if (isDdsInvalidForNewUi) { - handleRemovableSimInsertWhenDsdsAndNoDds(); + + if (Flags.isDualSimOnboardingEnabled()) { + // ForNewUi, when the user inserts the psim, showing the sim onboarding for the user + // to setup the sim switching or the default data subscription. + handleRemovableSimInsertWhenDsds(); + } else if (!isMultipleEnabledProfilesSupported()) { + Log.d(TAG, "The device is already in DSDS mode and no MEP. Do nothing."); + return; } else if (isMultipleEnabledProfilesSupported()) { handleRemovableSimInsertUnderDsdsMep(removableSlotInfo); return; @@ -259,13 +258,13 @@ public class SimSlotChangeHandler { startChooseSimActivity(false); } - private void handleRemovableSimInsertWhenDsdsAndNoDds() { + private void handleRemovableSimInsertWhenDsds() { List subscriptionInfos = getAvailableRemovableSubscription(); if (subscriptionInfos.isEmpty()) { Log.e(TAG, "Unable to find the removable subscriptionInfo. Do nothing."); return; } - Log.d(TAG, "isDdsInvalidForNewUi and getAvailableRemovableSubscription:" + Log.d(TAG, "ForNewUi and getAvailableRemovableSubscription:" + subscriptionInfos); startSimConfirmDialogActivity(subscriptionInfos.get(0).getSubscriptionId()); } From 07b7679319b832409a76710b0358023b37bf2e60 Mon Sep 17 00:00:00 2001 From: Jerry Shi Date: Tue, 14 May 2024 17:15:00 -0700 Subject: [PATCH 4/8] Properly handle the autofill provider names, making sure place holder name is properly filtered out. Bug: 337040395 Test: locally built and tested Change-Id: I081064c6103f79fe966a36d0eea854ee9893bce3 --- ...CredentialManagerPreferenceController.java | 36 +++++++++++++------ .../credentials/DefaultCombinedPicker.java | 8 ++--- .../DefaultCombinedPreferenceController.java | 15 +++++--- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java index 1adbbaf5963..f07241a2fe4 100644 --- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java +++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java @@ -521,16 +521,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl // Get the selected autofill provider. If it is the placeholder then replace it with an // empty string. String selectedAutofillProvider = - DefaultCombinedPicker.getSelectedAutofillProvider(mContext, getUser()); - String credentialAutofillService = ""; - if (android.service.autofill.Flags.autofillCredmanDevIntegration()) { - credentialAutofillService = getCredentialAutofillService(mContext, TAG); - } - if (TextUtils.equals(selectedAutofillProvider, credentialAutofillService) - || TextUtils.equals( - selectedAutofillProvider, AUTOFILL_CREDMAN_ONLY_PROVIDER_PLACEHOLDER)) { - selectedAutofillProvider = ""; - } + getSelectedAutofillProvider(mContext, getUser(), TAG); // Get the list of combined providers. List providers = @@ -695,6 +686,31 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl return ""; } + /** Gets the selected autofill provider name. This will filter out place holder names. **/ + public static @Nullable String getSelectedAutofillProvider( + Context context, int userId, String tag) { + String providerName = Settings.Secure.getStringForUser( + context.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE, userId); + + if (TextUtils.isEmpty(providerName)) { + return providerName; + } + + if (providerName.equals(AUTOFILL_CREDMAN_ONLY_PROVIDER_PLACEHOLDER)) { + return ""; + } + + String credentialAutofillService = ""; + if (android.service.autofill.Flags.autofillCredmanDevIntegration()) { + credentialAutofillService = getCredentialAutofillService(context, tag); + } + if (providerName.equals(credentialAutofillService)) { + return ""; + } + + return providerName; + } + private CombiPreference addProviderPreference( @NonNull Context prefContext, @NonNull CharSequence title, diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java index 8bc0bca627b..f4224114a6c 100644 --- a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java +++ b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java @@ -275,15 +275,13 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment { CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN)); } - final String selectedAutofillProvider = getSelectedAutofillProvider(context, userId); + final String selectedAutofillProvider = + CredentialManagerPreferenceController + .getSelectedAutofillProvider(context, userId, TAG); return CombinedProviderInfo.buildMergedList( autofillProviders, credManProviders, selectedAutofillProvider); } - public static String getSelectedAutofillProvider(Context context, int userId) { - return Settings.Secure.getStringForUser( - context.getContentResolver(), AUTOFILL_SETTING, userId); - } protected List getCandidates() { final Context context = getContext(); diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java index 57cd1d2d8da..33d9067eec5 100644 --- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java +++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java @@ -183,16 +183,15 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon final List autofillProviders = AutofillServiceInfo.getAvailableServices(mContext, userId); final String selectedAutofillProvider = - Settings.Secure.getStringForUser( - mContext.getContentResolver(), - DefaultCombinedPicker.AUTOFILL_SETTING, - userId); + CredentialManagerPreferenceController + .getSelectedAutofillProvider(mContext, userId, TAG); final List credManProviders = new ArrayList<>(); if (mCredentialManager != null) { credManProviders.addAll( mCredentialManager.getCredentialProviderServices( - userId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)); + userId, + CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN)); } return CombinedProviderInfo.buildMergedList( @@ -226,6 +225,12 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon return; } + // Clean the autofill provider settings + Settings.Secure.putStringForUser( + mContext.getContentResolver(), + DefaultCombinedPicker.AUTOFILL_SETTING, null, getUser()); + + // Clean the credman provider settings. mCredentialManager.setEnabledProviders( List.of(), // empty primary provider. List.of(), // empty enabled providers. From 668fef47cdc380839717c4d1f8744680a92e9699 Mon Sep 17 00:00:00 2001 From: Jay Sullivan Date: Wed, 15 May 2024 17:57:07 +0000 Subject: [PATCH 5/8] Revert "UX updates in Settings for unrestricting permissions." This reverts commit ff6c0b3fcb5d0311403d800a9b83850a36617706. Reason for revert: b/340458649 Change-Id: I9fd32f11a9650431ed56c10434e82a766f74f400 --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 909580d8192..e71fcf4d7b4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4077,7 +4077,7 @@ Uninstall updates - Allow restricted permissions + Allow restricted settings Some activities you\u2019ve selected open in this app by default. From 4bf537a815367cc49f9651d664ceb2e60c8ff0a0 Mon Sep 17 00:00:00 2001 From: Isaac Chai Date: Fri, 12 Apr 2024 17:38:43 +0000 Subject: [PATCH 6/8] Color correction saturation level settings Adding settings UI for color saturation level change, guarded by feature flag. Test: Locally tested + unit tests added Bug: 322829049 Flag: com.android.server.accessibility.enable_color_correction_saturation Change-Id: Ifa816647b16534ab6da770584d3de0628734aed5 --- res/values/strings.xml | 2 + res/xml/accessibility_daltonizer_settings.xml | 6 + ...SaturationSeekbarPreferenceController.java | 97 +++++++++ .../ToggleDaltonizerPreferenceFragment.java | 6 +- ...rationSeekbarPreferenceControllerTest.java | 197 ++++++++++++++++++ 5 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index a11c96c7f07..a65911c0f70 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5371,6 +5371,8 @@ Blue-yellow Grayscale + + Intensity Green weak, deuteranomaly diff --git a/res/xml/accessibility_daltonizer_settings.xml b/res/xml/accessibility_daltonizer_settings.xml index 91b163bf68c..1f770306890 100644 --- a/res/xml/accessibility_daltonizer_settings.xml +++ b/res/xml/accessibility_daltonizer_settings.xml @@ -51,4 +51,10 @@ android:persistent="false" android:title="@string/daltonizer_mode_grayscale_title" /> + diff --git a/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceController.java b/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceController.java new file mode 100644 index 00000000000..7dcd6612ac4 --- /dev/null +++ b/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceController.java @@ -0,0 +1,97 @@ +/* + * 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.accessibility; + +import android.content.ContentResolver; +import android.content.Context; +import android.provider.Settings; + +import androidx.preference.PreferenceScreen; + +import com.android.server.accessibility.Flags; +import com.android.settings.core.SliderPreferenceController; +import com.android.settings.widget.SeekBarPreference; + +/** + * The controller of the seekbar preference for the saturation level of color correction. + */ +public class DaltonizerSaturationSeekbarPreferenceController extends SliderPreferenceController { + + private static final int DEFAULT_SATURATION_LEVEL = 7; + private static final int SATURATION_MAX = 10; + private static final int SATURATION_MIN = 0; + + private int mSliderPosition; + private final ContentResolver mContentResolver; + + public DaltonizerSaturationSeekbarPreferenceController(Context context, + String preferenceKey) { + super(context, preferenceKey); + mContentResolver = context.getContentResolver(); + mSliderPosition = Settings.Secure.getInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + DEFAULT_SATURATION_LEVEL); + setSliderPosition(mSliderPosition); + // TODO: Observer color correction on/off and enable/disable based on secure settings. + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + SeekBarPreference preference = screen.findPreference(getPreferenceKey()); + preference.setMax(getMax()); + preference.setMin(getMin()); + preference.setProgress(mSliderPosition); + preference.setContinuousUpdates(true); + } + + @Override + public int getAvailabilityStatus() { + if (Flags.enableColorCorrectionSaturation()) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; + } + + @Override + public int getSliderPosition() { + return mSliderPosition; + } + + @Override + public boolean setSliderPosition(int position) { + if (position < getMin() || position > getMax()) { + return false; + } + mSliderPosition = position; + Settings.Secure.putInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + mSliderPosition); + return true; + } + + @Override + public int getMax() { + return SATURATION_MAX; + } + + @Override + public int getMin() { + return SATURATION_MIN; + } +} diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java index bc34e01ee8d..0cfa756778e 100644 --- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java @@ -62,6 +62,9 @@ public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceF static final String KEY_TRITANOMEALY = "daltonizer_mode_tritanomaly"; @VisibleForTesting static final String KEY_GRAYSCALE = "daltonizer_mode_grayscale"; + @VisibleForTesting + static final String KEY_SATURATION = "daltonizer_saturation"; + private static final List sControllers = new ArrayList<>(); private static List buildPreferenceControllers(Context context, @@ -79,7 +82,6 @@ public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceF return sControllers; } - @Override protected void registerKeysToObserverCallback( AccessibilitySettingsContentObserver contentObserver) { @@ -138,6 +140,8 @@ public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceF lists.add(KEY_TOP_INTRO_PREFERENCE); lists.add(KEY_PREVIEW); lists.add(KEY_USE_SERVICE_PREFERENCE); + // Putting saturation level close to the preview so users can see what is changing. + lists.add(KEY_SATURATION); lists.add(KEY_DEUTERANOMALY); lists.add(KEY_PROTANOMALY); lists.add(KEY_TRITANOMEALY); diff --git a/tests/robotests/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceControllerTest.java new file mode 100644 index 00000000000..98ed4422dc8 --- /dev/null +++ b/tests/robotests/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceControllerTest.java @@ -0,0 +1,197 @@ +/* + * 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.accessibility; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.ContentResolver; +import android.content.Context; +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.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; + +import com.android.server.accessibility.Flags; +import com.android.settings.widget.SeekBarPreference; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link DaltonizerSaturationSeekbarPreferenceController}. */ +@RunWith(RobolectricTestRunner.class) +public class DaltonizerSaturationSeekbarPreferenceControllerTest { + + private ContentResolver mContentResolver; + private DaltonizerSaturationSeekbarPreferenceController mController; + + private int mOriginalSaturationLevel = -1; + + private PreferenceScreen mScreen; + + @Mock + private SeekBarPreference mPreference; + + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + Context context = ApplicationProvider.getApplicationContext(); + mContentResolver = context.getContentResolver(); + mOriginalSaturationLevel = Settings.Secure.getInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + 7); + + mScreen = spy(new PreferenceScreen(context, /* attrs= */ null)); + when(mScreen.findPreference(ToggleDaltonizerPreferenceFragment.KEY_SATURATION)) + .thenReturn(mPreference); + + mController = new DaltonizerSaturationSeekbarPreferenceController( + context, + ToggleDaltonizerPreferenceFragment.KEY_SATURATION); + } + + @After + public void cleanup() { + Settings.Secure.putInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + mOriginalSaturationLevel); + } + + + @Test + @DisableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void getAvailabilityStatus_flagDisabled_unavailable() { + assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void getAvailabilityStatus_flagEnabled_available() { + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void constructor_defaultValuesMatch() { + assertThat(mController.getSliderPosition()).isEqualTo(7); + assertThat(mController.getMax()).isEqualTo(10); + assertThat(mController.getMin()).isEqualTo(0); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void displayPreference_enabled_visible() { + mController.displayPreference(mScreen); + + verify(mPreference).setMax(eq(10)); + verify(mPreference).setMin(eq(0)); + verify(mPreference).setProgress(eq(7)); + verify(mPreference).setContinuousUpdates(eq(true)); + verify(mPreference).setOnPreferenceChangeListener(eq(mController)); + verify(mPreference).setVisible(eq(true)); + } + + @Test + @DisableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void displayPreference_disabled_notVisible() { + mController.displayPreference(mScreen); + + verify(mPreference).setMax(eq(10)); + verify(mPreference).setMin(eq(0)); + verify(mPreference).setProgress(eq(7)); + verify(mPreference).setContinuousUpdates(eq(true)); + verify(mPreference, never()).setOnPreferenceChangeListener(any()); + verify(mPreference).setVisible(eq(false)); + } + + @Test + public void setSliderPosition_inRange_secureSettingsUpdated() { + var isSliderSet = mController.setSliderPosition(9); + + assertThat(isSliderSet).isTrue(); + assertThat(Settings.Secure.getInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + 7)).isEqualTo(9); + } + + @Test + public void setSliderPosition_min_secureSettingsUpdated() { + var isSliderSet = mController.setSliderPosition(0); + + assertThat(isSliderSet).isTrue(); + assertThat(Settings.Secure.getInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + 7)).isEqualTo(0); + } + + @Test + public void setSliderPosition_max_secureSettingsUpdated() { + var isSliderSet = mController.setSliderPosition(10); + + assertThat(isSliderSet).isTrue(); + assertThat(Settings.Secure.getInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + 7)).isEqualTo(10); + } + + @Test + public void setSliderPosition_tooLarge_secureSettingsNotUpdated() { + var isSliderSet = mController.setSliderPosition(11); + + assertThat(isSliderSet).isFalse(); + assertThat(Settings.Secure.getInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + 7)).isEqualTo(7); + } + + @Test + public void setSliderPosition_tooSmall_secureSettingsNotUpdated() { + var isSliderSet = mController.setSliderPosition(-1); + + assertThat(isSliderSet).isFalse(); + assertThat(Settings.Secure.getInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, + 7)).isEqualTo(7); + } +} From 84263096be5ac7f69c97d4e41bad7cc6c68fb785 Mon Sep 17 00:00:00 2001 From: Zoey Chen Date: Thu, 16 May 2024 01:41:33 +0000 Subject: [PATCH 7/8] Revert "[ToA] Do not use spy context" This reverts commit 2fe1e08b435dda7df6b2d2a55b8f54cc0a19e141. Reason for revert: fail Change-Id: I182b5a0a34800e3e3ad2e80f4b931233f201c51d --- .../localepicker/TermsOfAddressFeminineControllerTest.java | 6 +++++- .../localepicker/TermsOfAddressMasculineControllerTest.java | 6 +++++- .../localepicker/TermsOfAddressNeutralControllerTest.java | 6 +++++- .../TermsOfAddressNotSpecifiedControllerTest.java | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java index 215e58f6dc8..246fad62af9 100644 --- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java +++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java @@ -18,6 +18,8 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; + import android.app.GrammaticalInflectionManager; import android.content.Context; import android.content.res.Configuration; @@ -32,6 +34,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.widget.TickButtonPreference; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; @@ -59,7 +62,7 @@ public class TermsOfAddressFeminineControllerTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mContext = ApplicationProvider.getApplicationContext(); + mContext = spy(ApplicationProvider.getApplicationContext()); if (Looper.myLooper() == null) { Looper.prepare(); @@ -90,6 +93,7 @@ public class TermsOfAddressFeminineControllerTest { } @Test + @Ignore("b/339543490") public void displayPreference_setGrammaticalGenderIsFeminine_FeminineIsSelected() { TickButtonPreference selectedPreference = (TickButtonPreference) mPreferenceScreen.getPreference(2); diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java index b4c88937d8e..f5ed3959b76 100644 --- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java +++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java @@ -18,6 +18,8 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; + import android.app.GrammaticalInflectionManager; import android.content.Context; import android.content.res.Configuration; @@ -32,6 +34,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.widget.TickButtonPreference; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; @@ -59,7 +62,7 @@ public class TermsOfAddressMasculineControllerTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mContext = ApplicationProvider.getApplicationContext(); + mContext = spy(ApplicationProvider.getApplicationContext()); if (Looper.myLooper() == null) { Looper.prepare(); @@ -90,6 +93,7 @@ public class TermsOfAddressMasculineControllerTest { } @Test + @Ignore("b/339543490") public void displayPreference_setGrammaticalGenderIsMasculine_MasculineIsSelected() { TickButtonPreference selectedPreference = (TickButtonPreference) mPreferenceScreen.getPreference(3); diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java index 76aed0ac9ac..0e53198188e 100644 --- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java +++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java @@ -18,6 +18,8 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; + import android.app.GrammaticalInflectionManager; import android.content.Context; import android.content.res.Configuration; @@ -32,6 +34,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.widget.TickButtonPreference; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; @@ -59,7 +62,7 @@ public class TermsOfAddressNeutralControllerTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mContext = ApplicationProvider.getApplicationContext(); + mContext = spy(ApplicationProvider.getApplicationContext()); if (Looper.myLooper() == null) { Looper.prepare(); @@ -90,6 +93,7 @@ public class TermsOfAddressNeutralControllerTest { } @Test + @Ignore("b/339543490") public void displayPreference_setGrammaticalGenderIsNotSpecified_NeutralIsSelected() { TickButtonPreference selectedPreference = (TickButtonPreference) mPreferenceScreen.getPreference(4); diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java index 0f51b7dfff9..96bac08dde1 100644 --- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java +++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java @@ -18,6 +18,8 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; + import android.app.GrammaticalInflectionManager; import android.content.Context; import android.content.res.Configuration; @@ -32,6 +34,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.widget.TickButtonPreference; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; @@ -59,7 +62,7 @@ public class TermsOfAddressNotSpecifiedControllerTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mContext = ApplicationProvider.getApplicationContext(); + mContext = spy(ApplicationProvider.getApplicationContext()); if (Looper.myLooper() == null) { Looper.prepare(); @@ -90,6 +93,7 @@ public class TermsOfAddressNotSpecifiedControllerTest { } @Test + @Ignore("b/339543490") public void displayPreference_setGrammaticalGenderIsNotSpecified_NotSpecifiedIsSelected() { TickButtonPreference selectedPreference = (TickButtonPreference) mPreferenceScreen.getPreference(1); From 81c42fa72d9394e24c58374a6e8d0a20c9c3b7b4 Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Thu, 16 May 2024 12:14:55 +0800 Subject: [PATCH 8/8] Disable `Touch & Hold` action of the spinner in battery usage page. Bug: 317149732 Test: Manual Change-Id: I852ec6ecbf2063d95b511e4f0f52ce591d05fda6 --- .../settings/fuelgauge/batteryusage/SpinnerPreference.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java b/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java index 2bcc7bfd51f..886d00de67e 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java +++ b/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java @@ -60,6 +60,7 @@ public class SpinnerPreference extends Preference { mSpinner = (Spinner) view.findViewById(R.id.spinner); mSpinner.setAdapter(new SpinnerAdapter(getContext(), mItems)); mSpinner.setSelection(mSavedSpinnerPosition); + mSpinner.setLongClickable(false); if (mOnItemSelectedListener != null) { mSpinner.setOnItemSelectedListener(mOnItemSelectedListener); }