diff --git a/aconfig/Android.bp b/aconfig/Android.bp index 6d62dcf9397..cdc84353b3b 100644 --- a/aconfig/Android.bp +++ b/aconfig/Android.bp @@ -6,7 +6,7 @@ package { aconfig_declarations { name: "aconfig_settings_flags", package: "com.android.settings.flags", - container: "system", + container: "system_ext", srcs: [ "*.aconfig", "catalyst/*.aconfig", @@ -21,7 +21,7 @@ java_aconfig_library { aconfig_declarations { name: "factory_reset_flags", package: "com.android.settings.factory_reset", - container: "system", + container: "system_ext", srcs: ["factory_reset/*.aconfig"], } @@ -33,7 +33,7 @@ java_aconfig_library { aconfig_declarations { name: "media_drm_flags", package: "com.android.settings.media_drm", - container: "system", + container: "system_ext", srcs: ["media_drm/*.aconfig"], } @@ -45,7 +45,7 @@ java_aconfig_library { aconfig_declarations { name: "accessibility_flags", package: "com.android.settings.accessibility", - container: "system", + container: "system_ext", srcs: ["accessibility/*.aconfig"], } @@ -57,7 +57,7 @@ java_aconfig_library { aconfig_declarations { name: "development_settings_flags", package: "com.android.settings.development", - container: "system", + container: "system_ext", srcs: [ "development/**/*.aconfig", ], @@ -71,7 +71,7 @@ java_aconfig_library { aconfig_declarations { name: "keyboard_flags", package: "com.android.settings.keyboard", - container: "system", + container: "system_ext", srcs: ["keyboard/*.aconfig"], } diff --git a/aconfig/accessibility/accessibility_flags.aconfig b/aconfig/accessibility/accessibility_flags.aconfig index f7ef9d5af46..2e98766dfe0 100644 --- a/aconfig/accessibility/accessibility_flags.aconfig +++ b/aconfig/accessibility/accessibility_flags.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.accessibility" -container: "system" +container: "system_ext" # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors. diff --git a/aconfig/catalyst/about_phone.aconfig b/aconfig/catalyst/about_phone.aconfig index 8ecde46eae5..d0564de2e58 100644 --- a/aconfig/catalyst/about_phone.aconfig +++ b/aconfig/catalyst/about_phone.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_legal_information" diff --git a/aconfig/catalyst/accessibility.aconfig b/aconfig/catalyst/accessibility.aconfig index 783706709a1..fe0d7a5347b 100644 --- a/aconfig/catalyst/accessibility.aconfig +++ b/aconfig/catalyst/accessibility.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_accessibility_color_and_motion" diff --git a/aconfig/catalyst/battery.aconfig b/aconfig/catalyst/battery.aconfig index cec40f3746b..7c152d9175c 100644 --- a/aconfig/catalyst/battery.aconfig +++ b/aconfig/catalyst/battery.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_power_usage_summary_screen" diff --git a/aconfig/catalyst/connected_devices.aconfig b/aconfig/catalyst/connected_devices.aconfig index 7a335fa4675..5b7a70bdbf0 100644 --- a/aconfig/catalyst/connected_devices.aconfig +++ b/aconfig/catalyst/connected_devices.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_bluetooth_switchbar_screen" diff --git a/aconfig/catalyst/display.aconfig b/aconfig/catalyst/display.aconfig index 9485e70fc1d..11c1d3a592c 100644 --- a/aconfig/catalyst/display.aconfig +++ b/aconfig/catalyst/display.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_display_settings_screen" diff --git a/aconfig/catalyst/location.aconfig b/aconfig/catalyst/location.aconfig index c656bf3ea58..24f2c538d8a 100644 --- a/aconfig/catalyst/location.aconfig +++ b/aconfig/catalyst/location.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_location_settings" diff --git a/aconfig/catalyst/lockscreen.aconfig b/aconfig/catalyst/lockscreen.aconfig index 9a84f66af15..280171af32d 100644 --- a/aconfig/catalyst/lockscreen.aconfig +++ b/aconfig/catalyst/lockscreen.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_lockscreen_from_display_settings" diff --git a/aconfig/catalyst/network_and_internet.aconfig b/aconfig/catalyst/network_and_internet.aconfig index aa26ce42be6..e39b182bdee 100644 --- a/aconfig/catalyst/network_and_internet.aconfig +++ b/aconfig/catalyst/network_and_internet.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_network_provider_and_internet_screen" diff --git a/aconfig/catalyst/sound_screen.aconfig b/aconfig/catalyst/sound_screen.aconfig index ac7f8bc1b80..1eacc3a7b3e 100644 --- a/aconfig/catalyst/sound_screen.aconfig +++ b/aconfig/catalyst/sound_screen.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_sound_screen" diff --git a/aconfig/catalyst/system.aconfig b/aconfig/catalyst/system.aconfig index f87ff44a909..4cd1cd90bae 100644 --- a/aconfig/catalyst/system.aconfig +++ b/aconfig/catalyst/system.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "catalyst_language_setting" diff --git a/aconfig/development/settings_core_flag_declarations.aconfig b/aconfig/development/settings_core_flag_declarations.aconfig index b73b0268009..45768f461dc 100644 --- a/aconfig/development/settings_core_flag_declarations.aconfig +++ b/aconfig/development/settings_core_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.development" -container: "system" +container: "system_ext" flag { name: "deprecate_list_activity" diff --git a/aconfig/factory_reset/factory_reset_flag_declarations.aconfig b/aconfig/factory_reset/factory_reset_flag_declarations.aconfig index 7feebf54dcc..dc7d8d4e42a 100644 --- a/aconfig/factory_reset/factory_reset_flag_declarations.aconfig +++ b/aconfig/factory_reset/factory_reset_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.factory_reset" -container: "system" +container: "system_ext" flag { name: "enable_factory_reset_wizard" diff --git a/aconfig/keyboard/settings_keyboard_layout_picker_features.aconfig b/aconfig/keyboard/settings_keyboard_layout_picker_features.aconfig index 18684ab7344..79e9ddc27c9 100644 --- a/aconfig/keyboard/settings_keyboard_layout_picker_features.aconfig +++ b/aconfig/keyboard/settings_keyboard_layout_picker_features.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.keyboard" -container: "system" +container: "system_ext" flag { name: "keyboard_layout_picker_activity_enabled" diff --git a/aconfig/keyboard/settings_physical_keyboard_a11y_features.aconfig b/aconfig/keyboard/settings_physical_keyboard_a11y_features.aconfig index 00c0b183759..ca5cb8d7739 100644 --- a/aconfig/keyboard/settings_physical_keyboard_a11y_features.aconfig +++ b/aconfig/keyboard/settings_physical_keyboard_a11y_features.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.keyboard" -container: "system" +container: "system_ext" flag { name: "keyboard_and_touchpad_a11y_new_page_enabled" diff --git a/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig b/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig index 3969b2919de..10579ebd3dd 100644 --- a/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig +++ b/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.media_drm" -container: "system" +container: "system_ext" flag { name: "force_l3_enabled" diff --git a/aconfig/settings_accessibility_flag_declarations_legacy.aconfig b/aconfig/settings_accessibility_flag_declarations_legacy.aconfig index 6e02bfe20eb..d0e5850ddc3 100644 --- a/aconfig/settings_accessibility_flag_declarations_legacy.aconfig +++ b/aconfig/settings_accessibility_flag_declarations_legacy.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" # NOTE: Don't add new accessibility flags here, since the package name doesn't follow # the best practice for setting's feature flag go/settings-trunk-stable diff --git a/aconfig/settings_biometrics_framework_flag_declarations.aconfig b/aconfig/settings_biometrics_framework_flag_declarations.aconfig index 820786eec68..e81c68e6aa0 100644 --- a/aconfig/settings_biometrics_framework_flag_declarations.aconfig +++ b/aconfig/settings_biometrics_framework_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "biometric_settings_provider" diff --git a/aconfig/settings_biometrics_integration_declarations.aconfig b/aconfig/settings_biometrics_integration_declarations.aconfig index cc756c6d587..48bf293fa1b 100644 --- a/aconfig/settings_biometrics_integration_declarations.aconfig +++ b/aconfig/settings_biometrics_integration_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "sfps_enroll_refinement" diff --git a/aconfig/settings_bluetooth_declarations.aconfig b/aconfig/settings_bluetooth_declarations.aconfig index 1c3554e9233..7aa989bb0d3 100644 --- a/aconfig/settings_bluetooth_declarations.aconfig +++ b/aconfig/settings_bluetooth_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "enable_offload_bluetooth_operations_to_background_thread" diff --git a/aconfig/settings_connecteddevice_flag_declarations.aconfig b/aconfig/settings_connecteddevice_flag_declarations.aconfig index eede0931b97..f10c019a459 100644 --- a/aconfig/settings_connecteddevice_flag_declarations.aconfig +++ b/aconfig/settings_connecteddevice_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "rotation_connected_display_setting" diff --git a/aconfig/settings_contacts_default_account_flag_declarations.aconfig b/aconfig/settings_contacts_default_account_flag_declarations.aconfig index eb877af4ad9..621714d9830 100644 --- a/aconfig/settings_contacts_default_account_flag_declarations.aconfig +++ b/aconfig/settings_contacts_default_account_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "enable_contacts_default_account_in_settings" diff --git a/aconfig/settings_datetime_flag_declarations.aconfig b/aconfig/settings_datetime_flag_declarations.aconfig index 995124339db..305a55dff1e 100644 --- a/aconfig/settings_datetime_flag_declarations.aconfig +++ b/aconfig/settings_datetime_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "datetime_feedback" diff --git a/aconfig/settings_development_flag_declarations.aconfig b/aconfig/settings_development_flag_declarations.aconfig index f2452e55ec0..cdce6e7437c 100644 --- a/aconfig/settings_development_flag_declarations.aconfig +++ b/aconfig/settings_development_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors. diff --git a/aconfig/settings_device_diagnostics_declarations.aconfig b/aconfig/settings_device_diagnostics_declarations.aconfig index 7423f2bc00a..90a12dbb9ab 100644 --- a/aconfig/settings_device_diagnostics_declarations.aconfig +++ b/aconfig/settings_device_diagnostics_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "enable_device_diagnostics_in_settings" diff --git a/aconfig/settings_display_flag_declarations.aconfig b/aconfig/settings_display_flag_declarations.aconfig index 9fe587b0162..52b9603e051 100644 --- a/aconfig/settings_display_flag_declarations.aconfig +++ b/aconfig/settings_display_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "protect_screen_timeout_with_auth" diff --git a/aconfig/settings_experience_flag_declarations.aconfig b/aconfig/settings_experience_flag_declarations.aconfig index ae3af2441cc..2d32ffaa2c7 100644 --- a/aconfig/settings_experience_flag_declarations.aconfig +++ b/aconfig/settings_experience_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "new_apn_page_enabled" diff --git a/aconfig/settings_flag_declarations.aconfig b/aconfig/settings_flag_declarations.aconfig index b57a69d9469..2971d22b5de 100644 --- a/aconfig/settings_flag_declarations.aconfig +++ b/aconfig/settings_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "show_factory_reset_cancel_button" diff --git a/aconfig/settings_globalintl_flag_declarations.aconfig b/aconfig/settings_globalintl_flag_declarations.aconfig index 6cfd140b66f..2e3aab560b3 100644 --- a/aconfig/settings_globalintl_flag_declarations.aconfig +++ b/aconfig/settings_globalintl_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "terms_of_address_enabled" diff --git a/aconfig/settings_notification_flag_declarations.aconfig b/aconfig/settings_notification_flag_declarations.aconfig index bdb65738827..f2ef4287f41 100644 --- a/aconfig/settings_notification_flag_declarations.aconfig +++ b/aconfig/settings_notification_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "dedupe_dnd_settings_channels" diff --git a/aconfig/settings_onboarding_experience_flag_declarations.aconfig b/aconfig/settings_onboarding_experience_flag_declarations.aconfig index 8d58d40a66c..830c1017741 100644 --- a/aconfig/settings_onboarding_experience_flag_declarations.aconfig +++ b/aconfig/settings_onboarding_experience_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "enable_sound_backup" diff --git a/aconfig/settings_perform_backup_tasks_flag_declarations.aconfig b/aconfig/settings_perform_backup_tasks_flag_declarations.aconfig index 86bae9d84ad..dcb876b52f7 100644 --- a/aconfig/settings_perform_backup_tasks_flag_declarations.aconfig +++ b/aconfig/settings_perform_backup_tasks_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "enable_perform_backup_tasks_in_settings" diff --git a/aconfig/settings_security_flag_declarations.aconfig b/aconfig/settings_security_flag_declarations.aconfig index 3684212f87c..e27f835aea8 100644 --- a/aconfig/settings_security_flag_declarations.aconfig +++ b/aconfig/settings_security_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "protect_lock_after_timeout_with_auth" diff --git a/aconfig/settings_telephony_flag_declarations.aconfig b/aconfig/settings_telephony_flag_declarations.aconfig index 5919e535b8c..3543e60c002 100644 --- a/aconfig/settings_telephony_flag_declarations.aconfig +++ b/aconfig/settings_telephony_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "remove_key_hide_enable_2g" diff --git a/aconfig/settings_threadnetwork_flag_declarations.aconfig b/aconfig/settings_threadnetwork_flag_declarations.aconfig index e5448a91eb4..99664678137 100644 --- a/aconfig/settings_threadnetwork_flag_declarations.aconfig +++ b/aconfig/settings_threadnetwork_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "thread_settings_enabled" diff --git a/aconfig/settings_voice_activation_apps_flag_declarations.aconfig b/aconfig/settings_voice_activation_apps_flag_declarations.aconfig index d72e67fb687..9ca3525b1e5 100644 --- a/aconfig/settings_voice_activation_apps_flag_declarations.aconfig +++ b/aconfig/settings_voice_activation_apps_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" flag { name: "enable_voice_activation_apps_in_settings" diff --git a/aconfig/settings_wifi_flag_declarations.aconfig b/aconfig/settings_wifi_flag_declarations.aconfig index 67ed9437a9a..cb8007f2e93 100644 --- a/aconfig/settings_wifi_flag_declarations.aconfig +++ b/aconfig/settings_wifi_flag_declarations.aconfig @@ -1,5 +1,5 @@ package: "com.android.settings.flags" -container: "system" +container: "system_ext" # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors. diff --git a/res/values/strings.xml b/res/values/strings.xml index 3ac0a600d94..ce2e3985b4e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5521,10 +5521,6 @@ screen magnification on app transitions Power button ends call - - Large mouse pointer - - Make the mouse pointer more noticeable Make more apps dark diff --git a/res/xml/accessibility_color_and_motion.xml b/res/xml/accessibility_color_and_motion.xml index 9cc8f8b9bc7..1c27aaa5b81 100644 --- a/res/xml/accessibility_color_and_motion.xml +++ b/res/xml/accessibility_color_and_motion.xml @@ -58,13 +58,6 @@ android:title="@string/accessibility_disable_animations" settings:controller="com.android.settings.accessibility.DisableAnimationsPreferenceController"/> - - - + + + + + + + + + + + + + + + + + + + + + android:key="lock_settings_footer" + android:selectable="false" + settings:searchable="false"/> diff --git a/src/com/android/settings/Metrics.kt b/src/com/android/settings/Metrics.kt index 0d5ea56aff3..8dde9d5a60f 100644 --- a/src/com/android/settings/Metrics.kt +++ b/src/com/android/settings/Metrics.kt @@ -19,9 +19,9 @@ package com.android.settings import android.content.Context import com.android.settings.overlay.FeatureFactory import com.android.settingslib.core.instrumentation.MetricsFeatureProvider -import com.android.settingslib.metadata.PreferenceUiActionMetricsLogger import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceScreenMetadata +import com.android.settingslib.metadata.PreferenceUiActionMetricsLogger /** Provides metrics for preference action. */ interface PreferenceActionMetricsProvider { diff --git a/src/com/android/settings/SettingsService.kt b/src/com/android/settings/SettingsService.kt index 1783a7d423e..b7c6220bd23 100644 --- a/src/com/android/settings/SettingsService.kt +++ b/src/com/android/settings/SettingsService.kt @@ -16,11 +16,9 @@ package com.android.settings -import android.app.Application import android.content.Intent import com.android.settings.flags.Flags -import com.android.settingslib.graph.PreferenceGetterRequest -import com.android.settingslib.graph.PreferenceSetterRequest +import com.android.settings.metrics.SettingsRemoteOpMetricsLogger import com.android.settingslib.ipc.ApiPermissionChecker import com.android.settingslib.service.PreferenceService @@ -28,32 +26,11 @@ import com.android.settingslib.service.PreferenceService class SettingsService : PreferenceService( graphPermissionChecker = ApiPermissionChecker.alwaysAllow(), - setterPermissionChecker = SetterPermissionChecker(), - getterPermissionChecker = GetterPermissionChecker(), + setterPermissionChecker = ApiPermissionChecker.alwaysAllow(), + getterPermissionChecker = ApiPermissionChecker.alwaysAllow(), + metricsLogger = SettingsRemoteOpMetricsLogger(), ) { override fun onBind(intent: Intent) = if (Flags.catalystService()) super.onBind(intent) else null } - -/** Permission checker for external setter API. */ -private class SetterPermissionChecker : ApiPermissionChecker { - - override fun hasPermission( - application: Application, - callingPid: Int, - callingUid: Int, - request: PreferenceSetterRequest, - ) = true -} - -/** Permission checker for external getter API. */ -private class GetterPermissionChecker : ApiPermissionChecker { - - override fun hasPermission( - application: Application, - callingPid: Int, - callingUid: Int, - request: PreferenceGetterRequest, - ) = true -} diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java index 04c4702de43..f3e5e6234f2 100644 --- a/src/com/android/settings/accessibility/AccessibilityUtil.java +++ b/src/com/android/settings/accessibility/AccessibilityUtil.java @@ -218,22 +218,6 @@ public final class AccessibilityUtil { return shortcutTypes; } - /** - * Converts {@link UserShortcutType} to key in Settings. - * - * @param shortcutType The shortcut type. - * @return Mapping key in Settings. - * - * @deprecated use - * {@link ShortcutUtils#convertToKey(int)} instead. - * - * (TODO 367414968: finish removal.) - */ - @Deprecated - static String convertKeyFromSettings(@UserShortcutType int shortcutType) { - return ShortcutUtils.convertToKey(shortcutType); - } - /** * Gets the width of the screen. * diff --git a/src/com/android/settings/accessibility/ColorAndMotionFragment.java b/src/com/android/settings/accessibility/ColorAndMotionFragment.java index daf2b5eb4c7..d487d755201 100644 --- a/src/com/android/settings/accessibility/ColorAndMotionFragment.java +++ b/src/com/android/settings/accessibility/ColorAndMotionFragment.java @@ -48,11 +48,9 @@ public class ColorAndMotionFragment extends DashboardFragment { // Preferences private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN = "daltonizer_preference"; - private static final String TOGGLE_LARGE_POINTER_ICON = "toggle_large_pointer_icon"; private Preference mDisplayDaltonizerPreferenceScreen; private TwoStatePreference mToggleDisableAnimationsPreference; - private TwoStatePreference mToggleLargePointerIconPreference; private AccessibilitySettingsContentObserver mSettingsContentObserver; private final List mShortcutFeatureKeys = new ArrayList<>(); @@ -116,9 +114,6 @@ public class ColorAndMotionFragment extends DashboardFragment { // Disable animation. mToggleDisableAnimationsPreference = findPreference(RemoveAnimationsPreference.KEY); - - // Large pointer icon. - mToggleLargePointerIconPreference = findPreference(TOGGLE_LARGE_POINTER_ICON); } /** @@ -134,10 +129,8 @@ public class ColorAndMotionFragment extends DashboardFragment { // hardware-accelerated color transform. getPreferenceScreen().removePreference(mDisplayDaltonizerPreferenceScreen); getPreferenceScreen().removePreference(mToggleDisableAnimationsPreference); - getPreferenceScreen().removePreference(mToggleLargePointerIconPreference); experimentalCategory.addPreference(mDisplayDaltonizerPreferenceScreen); experimentalCategory.addPreference(mToggleDisableAnimationsPreference); - experimentalCategory.addPreference(mToggleLargePointerIconPreference); } } diff --git a/src/com/android/settings/accessibility/LargePointerIconPreferenceController.java b/src/com/android/settings/accessibility/LargePointerIconPreferenceController.java deleted file mode 100644 index 0f1d44d81d5..00000000000 --- a/src/com/android/settings/accessibility/LargePointerIconPreferenceController.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2019 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.Context; -import android.provider.Settings; - -import androidx.annotation.VisibleForTesting; - -import com.android.settings.R; -import com.android.settings.core.TogglePreferenceController; - -public class LargePointerIconPreferenceController extends TogglePreferenceController { - - @VisibleForTesting - static final int ON = 1; - @VisibleForTesting - static final int OFF = 0; - - public LargePointerIconPreferenceController(Context context, String preferenceKey) { - super(context, preferenceKey); - } - - @Override - public boolean isChecked() { - return Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, OFF) != OFF; - } - - @Override - public boolean setChecked(boolean isChecked) { - return Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, isChecked ? ON : OFF); - } - - @Override - public int getAvailabilityStatus() { - return android.view.flags.Flags.enableVectorCursorA11ySettings() ? CONDITIONALLY_UNAVAILABLE - : AVAILABLE; - } - - @Override - public int getSliceHighlightMenuRes() { - return R.string.menu_key_accessibility; - } -} diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java index f729cc7a2cc..013fdeeb215 100644 --- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java +++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java @@ -41,7 +41,6 @@ import androidx.annotation.Nullable; import androidx.preference.Preference; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import java.util.ArrayList; import java.util.List; @@ -116,24 +115,6 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature return mTileComponentName; } - @Override - CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { - final ComponentName componentName = getTileComponentName(); - if (componentName == null) { - return null; - } - - final CharSequence tileName = loadTileLabel(getPrefContext(), componentName); - if (tileName == null) { - return null; - } - - final int titleResId = type == QuickSettingsTooltipType.GUIDE_TO_EDIT - ? R.string.accessibility_service_qs_tooltip_content - : R.string.accessibility_service_auto_added_qs_tooltip_content; - return getString(titleResId, tileName); - } - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Do not call super. We don't want to see the "Help & feedback" option on this page so as diff --git a/src/com/android/settings/accessibility/TextReadingDisplaySizePreference.kt b/src/com/android/settings/accessibility/TextReadingDisplaySizePreference.kt new file mode 100644 index 00000000000..139ea42c401 --- /dev/null +++ b/src/com/android/settings/accessibility/TextReadingDisplaySizePreference.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2025 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.Context +import com.android.settings.R +import com.android.settingslib.metadata.PreferenceMetadata +import com.android.settingslib.preference.PreferenceBinding + +internal class TextReadingDisplaySizePreference : PreferenceMetadata, PreferenceBinding { + + override val key: String + get() = KEY + + override val title: Int + get() = R.string.screen_zoom_title + + override val summary: Int + get() = R.string.screen_zoom_short_summary + + override val keywords: Int + get() = R.string.keywords_display_size + + override fun createWidget(context: Context) = + AccessibilitySeekBarPreference(context, /* attrs= */ null).apply { + setIconStart(R.drawable.ic_remove_24dp) + setIconStartContentDescription(R.string.screen_zoom_make_smaller_desc) + setIconEnd(R.drawable.ic_add_24dp) + setIconEndContentDescription(R.string.screen_zoom_make_larger_desc) + } + + companion object { + const val KEY = "display_size" + } +} diff --git a/src/com/android/settings/accessibility/TextReadingFontSizePreference.kt b/src/com/android/settings/accessibility/TextReadingFontSizePreference.kt new file mode 100644 index 00000000000..1436088bd20 --- /dev/null +++ b/src/com/android/settings/accessibility/TextReadingFontSizePreference.kt @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2025 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.Context +import android.provider.Settings.System.FONT_SCALE +import com.android.settings.R +import com.android.settingslib.metadata.PreferenceMetadata +import com.android.settingslib.preference.PreferenceBinding + +internal class TextReadingFontSizePreference : PreferenceMetadata, PreferenceBinding { + + override val key: String + get() = KEY + + override val title: Int + get() = R.string.title_font_size + + override val summary: Int + get() = R.string.short_summary_font_size + + override val keywords: Int + get() = R.string.keywords_font_size + + override fun createWidget(context: Context) = + AccessibilitySeekBarPreference(context, /* attrs= */ null).apply { + setIconStart(R.drawable.ic_remove_24dp) + setIconStartContentDescription(R.string.font_size_make_smaller_desc) + setIconEnd(R.drawable.ic_add_24dp) + setIconEndContentDescription(R.string.font_size_make_larger_desc) + } + + companion object { + const val KEY = FONT_SCALE + } +} diff --git a/src/com/android/settings/accessibility/TextReadingPreview.kt b/src/com/android/settings/accessibility/TextReadingPreview.kt new file mode 100644 index 00000000000..97b3d4897f2 --- /dev/null +++ b/src/com/android/settings/accessibility/TextReadingPreview.kt @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2025 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.Context +import com.android.settingslib.metadata.PreferenceMetadata +import com.android.settingslib.preference.PreferenceBinding + +internal class TextReadingPreview : PreferenceMetadata, PreferenceBinding { + override val key: String + get() = KEY + + override fun createWidget(context: Context) = + TextReadingPreviewPreference(context).apply { isSelectable = false } + + companion object { + const val KEY = "preview" + } +} diff --git a/src/com/android/settings/accessibility/TextReadingScreen.kt b/src/com/android/settings/accessibility/TextReadingScreen.kt index 02272786b6d..401c0c58fef 100644 --- a/src/com/android/settings/accessibility/TextReadingScreen.kt +++ b/src/com/android/settings/accessibility/TextReadingScreen.kt @@ -18,11 +18,10 @@ package com.android.settings.accessibility import android.content.Context import com.android.settings.R import com.android.settings.flags.Flags -import com.android.settingslib.metadata.ProvidePreferenceScreen import com.android.settingslib.metadata.preferenceHierarchy import com.android.settingslib.preference.PreferenceScreenCreator -@ProvidePreferenceScreen(TextReadingScreen.KEY) +// @ProvidePreferenceScreen(TextReadingScreen.KEY) class TextReadingScreen : PreferenceScreenCreator { override val key: String get() = KEY @@ -34,9 +33,12 @@ class TextReadingScreen : PreferenceScreenCreator { override fun fragmentClass() = TextReadingPreferenceFragment::class.java - override fun hasCompleteHierarchy() = false - - override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) {} + override fun getPreferenceHierarchy(context: Context) = + preferenceHierarchy(context, this) { + +TextReadingPreview() + +TextReadingFontSizePreference() + +TextReadingDisplaySizePreference() + } companion object { const val KEY = "text_reading_screen" diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index a2a8cf3b164..06bcdb7c2eb 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -48,7 +48,6 @@ import androidx.annotation.Nullable; import com.android.internal.accessibility.common.ShortcutConstants; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; import com.android.settingslib.accessibility.AccessibilityUtils; @@ -245,24 +244,6 @@ public class ToggleAccessibilityServicePreferenceFragment extends return mTileComponentName; } - @Override - CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { - final ComponentName componentName = getTileComponentName(); - if (componentName == null) { - return null; - } - - final CharSequence tileName = loadTileLabel(getPrefContext(), componentName); - if (tileName == null) { - return null; - } - - final int titleResId = type == QuickSettingsTooltipType.GUIDE_TO_EDIT - ? R.string.accessibility_service_qs_tooltip_content - : R.string.accessibility_service_auto_added_qs_tooltip_content; - return getString(titleResId, tileName); - } - @Override protected void updateSwitchBarToggleSwitch() { final boolean checked = isAccessibilityServiceEnabled(); diff --git a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java index b779f9d2d6a..b8f31b1d618 100644 --- a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java @@ -36,7 +36,6 @@ import android.view.ViewGroup; import androidx.annotation.VisibleForTesting; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.search.SearchIndexable; @@ -179,13 +178,6 @@ public class ToggleColorInversionPreferenceFragment extends ToggleFeaturePrefere return COLOR_INVERSION_TILE_COMPONENT_NAME; } - @Override - CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { - return getText(type == QuickSettingsTooltipType.GUIDE_TO_EDIT - ? R.string.accessibility_color_inversion_qs_tooltip_content - : R.string.accessibility_color_inversion_auto_added_qs_tooltip_content); - } - @Override protected void updateSwitchBarToggleSwitch() { final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java index fe51e69845b..42906c16345 100644 --- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java @@ -35,7 +35,6 @@ import android.view.ViewGroup; import androidx.annotation.VisibleForTesting; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.search.SearchIndexable; @@ -194,13 +193,6 @@ public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceF return DALTONIZER_TILE_COMPONENT_NAME; } - @Override - CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { - return getText(type == QuickSettingsTooltipType.GUIDE_TO_EDIT - ? R.string.accessibility_color_correction_qs_tooltip_content - : R.string.accessibility_color_correction_auto_added_qs_tooltip_content); - } - @Override protected void updateSwitchBarToggleSwitch() { final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index 91f8c4f5c22..7c34283a5f7 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -59,7 +59,6 @@ import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.util.ShortcutUtils; import com.android.settings.R; import com.android.settings.SettingsActivity; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.flags.Flags; @@ -274,14 +273,6 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment /** Returns the accessibility tile component name. */ abstract ComponentName getTileComponentName(); - /** Returns the accessibility tile component name. - * - * @deprecated unused, as this class no longer displays tile tooltips. - * - * (TODO 367414968: finish removal.)*/ - @Deprecated - abstract CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type); - protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) { final CharSequence title = getString(R.string.accessibility_service_primary_switch_title, mFeatureName); diff --git a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java index ff14021108d..dc63828da3e 100644 --- a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java @@ -37,7 +37,6 @@ import androidx.preference.PreferenceCategory; import androidx.preference.TwoStatePreference; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.SeekBarPreference; import com.android.settings.widget.SettingsMainSwitchPreference; @@ -181,13 +180,6 @@ public class ToggleReduceBrightColorsPreferenceFragment extends ToggleFeaturePre return REDUCE_BRIGHT_COLORS_TILE_SERVICE_COMPONENT_NAME; } - @Override - CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { - return getText(type == QuickSettingsTooltipType.GUIDE_TO_EDIT - ? R.string.accessibility_reduce_bright_colors_qs_tooltip_content - : R.string.accessibility_reduce_bright_colors_auto_added_qs_tooltip_content); - } - @Override protected void updateSwitchBarToggleSwitch() { final boolean checked = mColorDisplayManager.isReduceBrightColorsActivated(); diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 0d0c7fa7b02..5ecdf6770af 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -19,12 +19,6 @@ package com.android.settings.accessibility; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.DEFAULT; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TRIPLETAP; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP; import static com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums; import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; import static com.android.settings.accessibility.AccessibilityUtil.State.ON; @@ -39,7 +33,6 @@ import android.content.pm.PackageManager; import android.icu.text.MessageFormat; import android.net.Uri; import android.os.Bundle; -import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings; import android.text.TextUtils; @@ -55,13 +48,11 @@ import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.SwitchPreferenceCompat; -import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; import com.android.internal.accessibility.util.ShortcutUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.server.accessibility.Flags; import com.android.settings.DialogCreatable; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; @@ -498,7 +489,8 @@ public class ToggleScreenMagnificationPreferenceFragment extends @Override int getUserShortcutTypes() { - return getUserShortcutTypeFromSettings(getPrefContext()); + return ShortcutUtils.getEnabledShortcutTypes( + getPrefContext(), MAGNIFICATION_CONTROLLER_NAME); } @Override @@ -506,11 +498,6 @@ public class ToggleScreenMagnificationPreferenceFragment extends return null; } - @Override - CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { - return null; - } - @Override protected void onPreferenceToggled(String preferenceKey, boolean enabled) { if (enabled && TextUtils.equals( @@ -529,11 +516,12 @@ public class ToggleScreenMagnificationPreferenceFragment extends @Override public void onToggleClicked(ShortcutPreference preference) { final int shortcutTypes = getUserPreferredShortcutTypes(); + getPrefContext().getSystemService(AccessibilityManager.class).enableShortcutsForTargets( + preference.isChecked(), shortcutTypes, + Set.of(MAGNIFICATION_CONTROLLER_NAME), getPrefContext().getUserId() + ); if (preference.isChecked()) { - optInAllMagnificationValuesToSettings(getPrefContext(), shortcutTypes); showDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL); - } else { - optOutAllMagnificationValuesFromSettings(getPrefContext(), shortcutTypes); } mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); } @@ -550,7 +538,8 @@ public class ToggleScreenMagnificationPreferenceFragment extends @Override protected void updateShortcutPreferenceData() { - final int shortcutTypes = getUserShortcutTypeFromSettings(getPrefContext()); + final int shortcutTypes = ShortcutUtils.getEnabledShortcutTypes( + getPrefContext(), MAGNIFICATION_CONTROLLER_NAME); if (shortcutTypes != DEFAULT) { final PreferredShortcut shortcut = new PreferredShortcut( MAGNIFICATION_CONTROLLER_NAME, shortcutTypes); @@ -583,174 +572,10 @@ public class ToggleScreenMagnificationPreferenceFragment extends @Override protected void updateShortcutPreference() { - final int shortcutTypes = getUserPreferredShortcutTypes(); - mShortcutPreference.setChecked( - hasMagnificationValuesInSettings(getPrefContext(), shortcutTypes)); + mShortcutPreference.setChecked(getUserShortcutTypes() != DEFAULT); mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); } - @VisibleForTesting - static void optInAllMagnificationValuesToSettings(Context context, int shortcutTypes) { - if ((shortcutTypes & SOFTWARE) == SOFTWARE) { - optInMagnificationValueToSettings(context, SOFTWARE); - } - if (((shortcutTypes & HARDWARE) == HARDWARE)) { - optInMagnificationValueToSettings(context, HARDWARE); - } - if (((shortcutTypes & TRIPLETAP) == TRIPLETAP)) { - optInMagnificationValueToSettings(context, TRIPLETAP); - } - if (((shortcutTypes & GESTURE) == GESTURE)) { - optInMagnificationValueToSettings(context, GESTURE); - } - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if (((shortcutTypes & TWOFINGER_DOUBLETAP) - == TWOFINGER_DOUBLETAP)) { - optInMagnificationValueToSettings(context, TWOFINGER_DOUBLETAP); - } - } - if (((shortcutTypes & QUICK_SETTINGS) - == QUICK_SETTINGS)) { - optInMagnificationValueToSettings(context, QUICK_SETTINGS); - } - } - - /** - * @deprecated use - * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. - * - * (TODO 367414968: finish removal.) - */ - @Deprecated - private static void optInMagnificationValueToSettings( - Context context, @UserShortcutType int shortcutType) { - AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets( - /* enable= */ true, - shortcutType, - Set.of(MAGNIFICATION_CONTROLLER_NAME), - UserHandle.myUserId() - ); - } - } - - @VisibleForTesting - static void optOutAllMagnificationValuesFromSettings(Context context, - int shortcutTypes) { - if ((shortcutTypes & SOFTWARE) == SOFTWARE) { - optOutMagnificationValueFromSettings(context, SOFTWARE); - } - if (((shortcutTypes & HARDWARE) == HARDWARE)) { - optOutMagnificationValueFromSettings(context, HARDWARE); - } - if (((shortcutTypes & TRIPLETAP) == TRIPLETAP)) { - optOutMagnificationValueFromSettings(context, TRIPLETAP); - } - if (((shortcutTypes & GESTURE) == GESTURE)) { - optOutMagnificationValueFromSettings(context, GESTURE); - } - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if (((shortcutTypes & TWOFINGER_DOUBLETAP) - == TWOFINGER_DOUBLETAP)) { - optOutMagnificationValueFromSettings(context, TWOFINGER_DOUBLETAP); - } - } - if (((shortcutTypes & QUICK_SETTINGS) - == QUICK_SETTINGS)) { - optOutMagnificationValueFromSettings(context, QUICK_SETTINGS); - } - } - - /** - * @deprecated use - * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. - * - * (TODO 367414968: finish removal.) - */ - @Deprecated - private static void optOutMagnificationValueFromSettings(Context context, - @UserShortcutType int shortcutType) { - AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets( - /* enable= */ false, - shortcutType, - Set.of(MAGNIFICATION_CONTROLLER_NAME), - UserHandle.myUserId() - ); - } - } - - @VisibleForTesting - static boolean hasMagnificationValuesInSettings(Context context, int shortcutTypes) { - for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) { - if ((shortcutTypes & shortcutType) == 0) { - continue; - } - if (((shortcutType & TWOFINGER_DOUBLETAP) - == TWOFINGER_DOUBLETAP) - && !Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - continue; - } - if (hasMagnificationValueInSettings(context, shortcutType)) { - return true; - } - } - - return false; - } - - private static boolean hasMagnificationValueInSettings(Context context, - @UserShortcutType int shortcutType) { - if (shortcutType == TRIPLETAP) { - return Settings.Secure.getInt(context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF) == ON; - } - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if (shortcutType == TWOFINGER_DOUBLETAP) { - return Settings.Secure.getInt(context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED, - OFF) == ON; - } - } - - final String targetKey = AccessibilityUtil.convertKeyFromSettings(shortcutType); - final String targetString = Settings.Secure.getString(context.getContentResolver(), - targetKey); - - if (TextUtils.isEmpty(targetString)) { - return false; - } - - sStringColonSplitter.setString(targetString); - while (sStringColonSplitter.hasNext()) { - final String name = sStringColonSplitter.next(); - if (MAGNIFICATION_CONTROLLER_NAME.equals(name)) { - return true; - } - } - return false; - } - - /** - * @deprecated use - * {@link ShortcutUtils#getEnabledShortcutTypes(Context, String)} instead. - * - * (TODO 367414968: finish removal.) - */ - @Deprecated - private static int getUserShortcutTypeFromSettings(Context context) { - int shortcutTypes = DEFAULT; - for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) { - if (hasMagnificationValueInSettings(context, shortcutType)) { - shortcutTypes |= shortcutType; - } - } - - return shortcutTypes; - } - /** * Gets the service summary of magnification. * @@ -758,7 +583,8 @@ public class ToggleScreenMagnificationPreferenceFragment extends */ public static CharSequence getServiceSummary(Context context) { // Get the user shortcut type from settings provider. - final int userShortcutType = getUserShortcutTypeFromSettings(context); + final int userShortcutType = ShortcutUtils.getEnabledShortcutTypes( + context, MAGNIFICATION_CONTROLLER_NAME); final CharSequence featureState = (userShortcutType != DEFAULT) ? context.getText(R.string.accessibility_summary_shortcut_enabled) @@ -822,7 +648,8 @@ public class ToggleScreenMagnificationPreferenceFragment extends // mention magnification so it may confuse users who search a term // like "Keep on". // So we hide it if the user has no magnification shortcut enabled. - || getUserShortcutTypeFromSettings(context) == DEFAULT) { + || ShortcutUtils.getEnabledShortcutTypes( + context, MAGNIFICATION_CONTROLLER_NAME) == DEFAULT) { niks.add(MagnificationAlwaysOnPreferenceController.PREF_KEY); } if (!isOneFingerPanningSupported()) { diff --git a/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java b/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java index afb5acf272c..70e8141cf50 100644 --- a/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java +++ b/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java @@ -113,13 +113,7 @@ public abstract class ShortcutOptionPreferenceController extends BasePreferenceC /** * Enable or disable the shortcut for the given accessibility features. - * - * @deprecated use - * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. - * - * (TODO 367414968: finish removal.) */ - @Deprecated protected void enableShortcutForTargets(boolean enable) { Set shortcutTargets = getShortcutTargets(); @ShortcutConstants.UserShortcutType int shortcutType = getShortcutType(); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 9bd7b319e7f..e200530accb 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -681,15 +681,10 @@ public class FingerprintSettings extends SubSettings { return false; } - private boolean isUltrasnoicUdfps() { - mFingerprintManager = Utils.getFingerprintManagerOrNull(getActivity()); - if (mFingerprintManager != null) { - mSensorProperties = mFingerprintManager.getSensorPropertiesInternal(); - for (FingerprintSensorPropertiesInternal prop : mSensorProperties) { - if (prop.isUltrasonicUdfps()) { - return true; - } - } + private boolean isScreenOffUnlcokSupported() { + if (isUdfps()) { + return getContext().getResources().getBoolean( + com.android.internal.R.bool.config_screen_off_udfps_enabled); } return false; } @@ -736,7 +731,7 @@ public class FingerprintSettings extends SubSettings { // This needs to be after setting ids, otherwise // |mRequireScreenOnToAuthPreferenceController.isChecked| is always checking the primary // user instead of the user with |mUserId|. - if (isSfps() || (screenOffUnlockUdfps() && isUltrasnoicUdfps())) { + if (isSfps() || (screenOffUnlockUdfps() && isScreenOffUnlcokSupported())) { scrollToPreference(fpPrefKey); addFingerprintUnlockCategory(); } @@ -836,7 +831,7 @@ public class FingerprintSettings extends SubSettings { restToUnlockPreference.getOnPreferenceChangeListener()); } setupFingerprintUnlockCategoryPreferencesForScreenOnToAuth(); - } else if (screenOffUnlockUdfps() && isUltrasnoicUdfps()) { + } else if (screenOffUnlockUdfps() && isScreenOffUnlcokSupported()) { setupFingerprintUnlockCategoryPreferencesForScreenOffUnlock(); } setupExtFingerprintPreferences(); @@ -905,7 +900,7 @@ public class FingerprintSettings extends SubSettings { private void updatePreferencesAfterFingerprintRemoved() { updateAddPreference(); - if (isSfps() || (screenOffUnlockUdfps() && isUltrasnoicUdfps())) { + if (isSfps() || (screenOffUnlockUdfps() && isScreenOffUnlcokSupported())) { updateFingerprintUnlockCategoryVisibility(); } updatePreferences(); @@ -1181,7 +1176,7 @@ public class FingerprintSettings extends SubSettings { } } - } else if (screenOffUnlockUdfps() && isUltrasnoicUdfps()) { + } else if (screenOffUnlockUdfps() && isScreenOffUnlcokSupported()) { for (AbstractPreferenceController controller : controllers) { if (controller.getPreferenceKey() == KEY_FINGERPRINT_UNLOCK_CATEGORY) { mFingerprintUnlockCategoryPreferenceController = diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsScreenOffUnlockUdfpsPreferenceController.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsScreenOffUnlockUdfpsPreferenceController.java index 5c32d90ba7e..b09c6382ebf 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsScreenOffUnlockUdfpsPreferenceController.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsScreenOffUnlockUdfpsPreferenceController.java @@ -59,7 +59,7 @@ public class FingerprintSettingsScreenOffUnlockUdfpsPreferenceController return false; } final boolean defEnabled = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_screen_off_udfps_enabled); + com.android.internal.R.bool.config_screen_off_udfps_default_on); final int value = Settings.Secure.getIntForUser( mContext.getContentResolver(), Settings.Secure.SCREEN_OFF_UNLOCK_UDFPS_ENABLED, diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java index ab0ed45d5e9..d0962be5d8b 100644 --- a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java @@ -91,6 +91,7 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont private static final String ESTIMATE_READY = "estimate_ready"; private static final String DATABASE_ID = "id"; private static final String DATABASE_BLUETOOTH = "Bluetooth"; + private static final String TAG_BATT = "BATT"; private static final long TIME_OF_HOUR = TimeUnit.SECONDS.toMillis(3600); private static final long TIME_OF_MINUTE = TimeUnit.SECONDS.toMillis(60); private static final int LEFT_DEVICE_ID = 1; @@ -268,6 +269,30 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont BluetoothDevice.METADATA_MAIN_BATTERY) != BluetoothUtils.META_INT_ERROR); }); + Supplier isBattEnabled = + Suppliers.memoize( + () -> + Boolean.valueOf( + BluetoothUtils.getFastPairCustomizedField( + mCachedDevice.getDevice(), TAG_BATT))); + Supplier leftBatteryLevel = + Suppliers.memoize( + () -> + BluetoothUtils.getIntMetaData( + mCachedDevice.getDevice(), + BluetoothDevice.METADATA_UNTETHERED_LEFT_BATTERY)); + Supplier rightBatteryLevel = + Suppliers.memoize( + () -> + BluetoothUtils.getIntMetaData( + mCachedDevice.getDevice(), + BluetoothDevice.METADATA_UNTETHERED_RIGHT_BATTERY)); + Supplier caseBatteryLevel = + Suppliers.memoize( + () -> + BluetoothUtils.getIntMetaData( + mCachedDevice.getDevice(), + BluetoothDevice.METADATA_UNTETHERED_CASE_BATTERY)); preloadAndRun( List.of(deviceName, disconnected, isUntetheredHeadset, summaryText), () -> { @@ -277,7 +302,16 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont final TextView summary = mLayoutPreference.findViewById(R.id.entity_header_summary); - if (disconnected.get()) { + final boolean isBatteryLevelAvailable = + Flags.enableBatteryLevelDisplay() + && isBattEnabled.get() + && (leftBatteryLevel.get() > BluetoothUtils.META_INT_ERROR + || rightBatteryLevel.get() + > BluetoothUtils.META_INT_ERROR + || caseBatteryLevel.get() + > BluetoothUtils.META_INT_ERROR); + + if (disconnected.get() && !isBatteryLevelAvailable) { summary.setText(summaryText.get()); updateDisconnectLayout(); return; diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java index ffbb13e9808..a1ba3c9cfef 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java @@ -78,8 +78,6 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro private static final String TAG = "AudioSharingDevicePrefController"; private static final String KEY = "audio_sharing_device_list"; - private static final String KEY_AUDIO_SHARING_SETTINGS = - "connected_device_audio_sharing_settings"; @Nullable private final LocalBluetoothManager mBtManager; @Nullable private final CachedBluetoothDeviceManager mDeviceManager; @@ -89,7 +87,6 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro private final Executor mExecutor; private final MetricsFeatureProvider mMetricsFeatureProvider; @Nullable private PreferenceGroup mPreferenceGroup; - @Nullable private Preference mAudioSharingSettingsPreference; @Nullable private BluetoothDeviceUpdater mBluetoothDeviceUpdater; @Nullable private DashboardFragment mFragment; @Nullable private AudioSharingDialogHandler mDialogHandler; @@ -280,13 +277,8 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro super.displayPreference(screen); mPreferenceGroup = screen.findPreference(KEY); if (mPreferenceGroup != null) { - mAudioSharingSettingsPreference = - mPreferenceGroup.findPreference(KEY_AUDIO_SHARING_SETTINGS); mPreferenceGroup.setVisible(false); } - if (mAudioSharingSettingsPreference != null) { - mAudioSharingSettingsPreference.setVisible(false); - } if (isAvailable()) { if (mBluetoothDeviceUpdater != null) { @@ -320,11 +312,8 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro @Override public void onDeviceAdded(Preference preference) { if (mPreferenceGroup != null) { - if (mPreferenceGroup.getPreferenceCount() == 1) { + if (mPreferenceGroup.getPreferenceCount() == 0) { mPreferenceGroup.setVisible(true); - if (mAudioSharingSettingsPreference != null) { - mAudioSharingSettingsPreference.setVisible(true); - } } mPreferenceGroup.addPreference(preference); } @@ -334,11 +323,8 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro public void onDeviceRemoved(Preference preference) { if (mPreferenceGroup != null) { mPreferenceGroup.removePreference(preference); - if (mPreferenceGroup.getPreferenceCount() == 1) { + if (mPreferenceGroup.getPreferenceCount() == 0) { mPreferenceGroup.setVisible(false); - if (mAudioSharingSettingsPreference != null) { - mAudioSharingSettingsPreference.setVisible(false); - } } } } diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceController.java index f3effbdf617..e034d36d168 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceController.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceController.java @@ -45,6 +45,9 @@ import java.util.concurrent.Executors; public class AudioSharingPreferenceController extends BasePreferenceController implements DefaultLifecycleObserver, BluetoothCallback { private static final String TAG = "AudioSharingPreferenceController"; + private static final String CONNECTED_DEVICES_PREF_KEY = + "connected_device_audio_sharing_settings"; + private static final String CONNECTION_PREFERENCES_PREF_KEY = "audio_sharing_settings"; @Nullable private final LocalBluetoothManager mBtManager; @Nullable private final BluetoothEventManager mEventManager; @@ -57,7 +60,7 @@ public class AudioSharingPreferenceController extends BasePreferenceController new BluetoothLeBroadcast.Callback() { @Override public void onBroadcastStarted(int reason, int broadcastId) { - refreshSummary(); + refreshPreference(); } @Override @@ -69,7 +72,7 @@ public class AudioSharingPreferenceController extends BasePreferenceController @Override public void onBroadcastStopped(int reason, int broadcastId) { - refreshSummary(); + refreshPreference(); } @Override @@ -111,6 +114,7 @@ public class AudioSharingPreferenceController extends BasePreferenceController } mEventManager.registerCallback(this); mBroadcast.registerServiceCallBack(mExecutor, mBroadcastCallback); + updateVisibility(); } @Override @@ -131,6 +135,13 @@ public class AudioSharingPreferenceController extends BasePreferenceController public void displayPreference(@NonNull PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); + // super.displayPreference set the visibility based on isAvailable() + // immediately set the preference invisible on Connected devices page to avoid the audio + // sharing entrance being shown before updateVisibility(need binder call) take effects. + if (mPreference != null && CONNECTED_DEVICES_PREF_KEY.equals(getPreferenceKey())) { + mPreference.setVisible(false); + } + updateVisibility(); } @Override @@ -141,14 +152,51 @@ public class AudioSharingPreferenceController extends BasePreferenceController @Override public CharSequence getSummary() { - return BluetoothUtils.isBroadcasting(mBtManager) - ? mContext.getString(R.string.audio_sharing_summary_on) - : mContext.getString(R.string.audio_sharing_summary_off); + return switch (getPreferenceKey()) { + case CONNECTION_PREFERENCES_PREF_KEY -> BluetoothUtils.isBroadcasting(mBtManager) + ? mContext.getString(R.string.audio_sharing_summary_on) + : mContext.getString(R.string.audio_sharing_summary_off); + default -> ""; + }; } @Override public void onBluetoothStateChanged(@AdapterState int bluetoothState) { - refreshSummary(); + refreshPreference(); + } + + private void refreshPreference() { + switch (getPreferenceKey()) { + // Audio sharing entrance on Connected devices page has no summary, but its visibility + // will change based on audio sharing state + case CONNECTED_DEVICES_PREF_KEY -> updateVisibility(); + // Audio sharing entrance on Connection preferences page always show up, but its summary + // will change based on audio sharing state + case CONNECTION_PREFERENCES_PREF_KEY -> refreshSummary(); + } + } + + private void updateVisibility() { + if (mPreference == null) { + return; + } + switch (getPreferenceKey()) { + case CONNECTED_DEVICES_PREF_KEY -> { + var unused = + ThreadUtils.postOnBackgroundThread( + () -> { + boolean visible = BluetoothUtils.isBroadcasting(mBtManager); + AudioSharingUtils.postOnMainThread( + mContext, + () -> { + // Check nullability to pass NullAway check + if (mPreference != null) { + mPreference.setVisible(visible); + } + }); + }); + } + } } private void refreshSummary() { diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java index 7ca3256b849..44921153ce6 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java @@ -128,6 +128,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController // join the audio sharing, we will wait for the process complete for this list of sinks and then // popup audio sharing dialog with options to pair new device. private CopyOnWriteArrayList mSinksToWaitFor = new CopyOnWriteArrayList<>(); + private AtomicBoolean mStartingSharing = new AtomicBoolean(false); private AtomicBoolean mStoppingSharing = new AtomicBoolean(false); @VisibleForTesting @@ -160,6 +161,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController @Override public void onBroadcastStartFailed(int reason) { Log.d(TAG, "onBroadcastStartFailed(), reason = " + reason); + mStartingSharing.compareAndSet(true, false); updateSwitch(); showErrorDialog(); mMetricsFeatureProvider.action( @@ -177,16 +179,8 @@ public class AudioSharingSwitchBarController extends BasePreferenceController + broadcastId + ", metadata = " + metadata.getBroadcastName()); - if (mAssistant == null - || mAssistant.getAllConnectedDevices().stream() - .anyMatch( - device -> BluetoothUtils - .hasActiveLocalBroadcastSourceForBtDevice( - device, mBtManager))) { - Log.d( - TAG, - "Skip handleOnBroadcastReady: null assistant or " - + "sink has active local source."); + if (!mStartingSharing.compareAndSet(true, false)) { + Log.d(TAG, "Skip handleOnBroadcastReady, not in starting process"); return; } handleOnBroadcastReady(); @@ -213,6 +207,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController @Override public void onBroadcastStopFailed(int reason) { Log.d(TAG, "onBroadcastStopFailed(), reason = " + reason); + mStoppingSharing.compareAndSet(true, false); updateSwitch(); mMetricsFeatureProvider.action( mContext, @@ -565,6 +560,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController mDeviceItemsForSharing.remove(0); } if (mBroadcast != null) { + mStartingSharing.set(true); mBroadcast.startPrivateBroadcast(); mSinksInAdding.clear(); AudioSharingUtils.postOnMainThread(mContext, @@ -583,7 +579,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController int broadcastId = mBroadcast.getLatestBroadcastId(); if (broadcastId != -1) { mBroadcast.stopBroadcast(broadcastId); - mStoppingSharing.compareAndSet(false, true); + mStoppingSharing.set(true); mSinksInAdding.clear(); mSinksToWaitFor.clear(); } diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index d163bda8d9f..9acdfaa9ba8 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -403,10 +403,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment * Displays resource based tiles. */ private void displayResourceTiles() { - final int resId = getPreferenceScreenResId(); - if (resId <= 0) { - return; - } PreferenceScreen screen; PreferenceScreenCreator preferenceScreenCreator = getPreferenceScreenCreator(); if (preferenceScreenCreator != null) { @@ -416,6 +412,10 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment } setPreferenceScreen(screen); } else { + final int resId = getPreferenceScreenResId(); + if (resId <= 0) { + return; + } addPreferencesFromResource(resId); screen = getPreferenceScreen(); } diff --git a/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java b/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java index ebd3f887b5e..6069c43fd16 100644 --- a/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java +++ b/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java @@ -111,7 +111,7 @@ public class LocalePickerWithRegionActivity extends SettingsBaseActivity @Override public void onLocaleSelected(LocaleStore.LocaleInfo locale) { if (Flags.regionalPreferencesApiEnabled()) { - if (sameLanguageAndScript(locale.getLocale(), Locale.getDefault())) { + if (sameLanguageAndScript(locale.getLocale(), LocaleList.getDefault().get(0))) { Bundle args = new Bundle(); args.putInt(ARG_DIALOG_TYPE, DIALOG_CHANGE_LOCALE_REGION); args.putSerializable(ARG_TARGET_LOCALE, locale); diff --git a/src/com/android/settings/metrics/SettingsRemoteOpMetricsLogger.kt b/src/com/android/settings/metrics/SettingsRemoteOpMetricsLogger.kt new file mode 100644 index 00000000000..8653ef9ff0e --- /dev/null +++ b/src/com/android/settings/metrics/SettingsRemoteOpMetricsLogger.kt @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2025 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.metrics + +import android.app.settings.SettingsEnums +import android.content.Context +import com.android.settings.PreferenceActionMetricsProvider +import com.android.settings.core.instrumentation.SettingsStatsLog +import com.android.settingslib.graph.PreferenceGetterErrorCode +import com.android.settingslib.graph.PreferenceSetterResult +import com.android.settingslib.metadata.PreferenceCoordinate +import com.android.settingslib.metadata.PreferenceMetadata +import com.android.settingslib.metadata.PreferenceRemoteOpMetricsLogger +import com.android.settingslib.metadata.PreferenceScreenMetadata + +/** Metrics logger for settings remote operations. */ +class SettingsRemoteOpMetricsLogger : PreferenceRemoteOpMetricsLogger { + + override fun logGetterApi( + context: Context, + callingUid: Int, + preferenceCoordinate: PreferenceCoordinate, + screen: PreferenceScreenMetadata?, + preference: PreferenceMetadata?, + errorCode: Int, + latencyMs: Long, + ) = + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__TYPE__ACTION_READ.log( + context, + callingUid, + preferenceCoordinate, + preference, + errorCode, + latencyMs, + Int::convertGetterErrorCode, + ) + + override fun logSetterApi( + context: Context, + callingUid: Int, + preferenceCoordinate: PreferenceCoordinate, + screen: PreferenceScreenMetadata?, + preference: PreferenceMetadata?, + errorCode: Int, + latencyMs: Long, + ) = + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__TYPE__ACTION_WRITE.log( + context, + callingUid, + preferenceCoordinate, + preference, + errorCode, + latencyMs, + Int::convertSetterErrorCode, + ) + + private fun Int.log( + context: Context, + callingUid: Int, + preferenceCoordinate: PreferenceCoordinate, + preference: PreferenceMetadata?, + errorCode: Int, + latencyMs: Long, + errorCodeToMetricsResult: (Int) -> Int, + ) { + if (preference is PreferenceActionMetricsProvider) { + SettingsStatsLog.write( + SettingsStatsLog.SETTINGS_EXTAPI_REPORTED, + context.packageNameOfUid(callingUid), + "", + this, + errorCodeToMetricsResult(errorCode), + latencyMs, + preference.preferenceActionMetrics, + ) + } else { + SettingsStatsLog.write( + SettingsStatsLog.SETTINGS_EXTAPI_REPORTED, + context.packageNameOfUid(callingUid), + preferenceCoordinate.settingsId, + this, + errorCodeToMetricsResult(errorCode), + latencyMs, + SettingsEnums.ACTION_UNKNOWN, + ) + } + } + + override fun logGraphApi(context: Context, callingUid: Int, success: Boolean, latencyMs: Long) { + val result = + if (success) { + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_OK + } else { + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_INTERNAL_ERROR + } + SettingsStatsLog.write( + SettingsStatsLog.SETTINGS_EXTAPI_REPORTED, + context.packageNameOfUid(callingUid), + "", + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__TYPE__ACTION_GET_METADATA, + result, + latencyMs, + SettingsEnums.ACTION_UNKNOWN, + ) + } +} + +private fun Context.packageNameOfUid(uid: Int) = packageManager.getNameForUid(uid) ?: "" + +private val PreferenceCoordinate.settingsId: String + get() = "$screenKey/$key" + +private fun Int.convertGetterErrorCode() = + when (this) { + PreferenceGetterErrorCode.OK -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_OK + PreferenceGetterErrorCode.NOT_FOUND -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_UNSUPPORTED + PreferenceGetterErrorCode.DISALLOW -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_DISALLOW + else -> SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_INTERNAL_ERROR + } + +private fun Int.convertSetterErrorCode() = + when (this) { + PreferenceSetterResult.OK -> SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_OK + PreferenceSetterResult.UNSUPPORTED -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_UNSUPPORTED + PreferenceSetterResult.DISABLED -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_DISABLED + PreferenceSetterResult.RESTRICTED -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_RESTRICTED + PreferenceSetterResult.UNAVAILABLE -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_UNAVAILABLE + PreferenceSetterResult.REQUIRE_APP_PERMISSION -> + SettingsStatsLog + .SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_REQUIRE_APP_PERMISSION + PreferenceSetterResult.REQUIRE_USER_AGREEMENT -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_REQUIRE_USER_CONSENT + PreferenceSetterResult.DISALLOW -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_DISALLOW + PreferenceSetterResult.INVALID_REQUEST -> + SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_INVALID_REQUEST + else -> SettingsStatsLog.SETTINGS_EXT_API_REPORTED__RESULT__RESULT_FAILURE_INTERNAL_ERROR + } diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index ef6a9ad7559..22b1310b4a3 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -71,6 +71,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.internal.widget.LockPatternUtils; @@ -87,13 +88,22 @@ import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.IdentityCheckBiometricErrorDialog; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.flags.Flags; import com.android.settings.safetycenter.LockScreenSafetySource; import com.android.settings.search.SearchFeatureProvider; +import com.android.settings.security.screenlock.AutoPinConfirmPreferenceController; +import com.android.settings.security.screenlock.LockAfterTimeoutPreferenceController; +import com.android.settings.security.screenlock.PatternVisiblePreferenceController; +import com.android.settings.security.screenlock.PinPrivacyPreferenceController; +import com.android.settings.security.screenlock.PowerButtonInstantLockPreferenceController; import com.android.settingslib.RestrictedPreference; +import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.widget.FooterPreference; import com.google.android.setupcompat.util.WizardManagerHelper; +import java.util.ArrayList; + /** * Activity class that provides a generic implementation for displaying options to choose a lock * type, either for setting up a new lock or updating an existing lock. @@ -131,6 +141,8 @@ public class ChooseLockGeneric extends SettingsActivity { private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation"; public static final String HIDE_INSECURE_OPTIONS = "hide_insecure_options"; public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog"; + + public static final String KEY_LOCK_SETTINGS = "unlock_settings"; public static final String KEY_LOCK_SETTINGS_FOOTER ="lock_settings_footer"; /** @@ -214,6 +226,9 @@ public class ChooseLockGeneric extends SettingsActivity { private boolean mWaitingForBiometricEnrollment = false; private boolean mEnrollFingerPrintOnly = false; + private final ArrayList mUnlockSettingsControllers = + new ArrayList<>(); + @Override public int getMetricsCategory() { return SettingsEnums.CHOOSE_LOCK_GENERIC; @@ -652,6 +667,12 @@ public class ChooseLockGeneric extends SettingsActivity { footer.setVisible(false); } + if (Flags.biometricsOnboardingEducation() + && !WizardManagerHelper.isAnySetupWizard(getIntent())) { + buildUnlockSettingsPreferenceControllers(); + setUpUnlockSettingsPreference(); + } + // Used for testing purposes findPreference(ScreenLockType.NONE.preferenceKey).setViewId(R.id.lock_none); findPreference(KEY_SKIP_FINGERPRINT).setViewId(R.id.lock_none); @@ -661,6 +682,37 @@ public class ChooseLockGeneric extends SettingsActivity { findPreference(ScreenLockType.PASSWORD.preferenceKey).setViewId(R.id.lock_password); } + private void buildUnlockSettingsPreferenceControllers() { + mUnlockSettingsControllers.add(new PatternVisiblePreferenceController( + getContext(), mUserId, mLockPatternUtils)); + mUnlockSettingsControllers.add(new PinPrivacyPreferenceController( + getContext(), mUserId, mLockPatternUtils)); + mUnlockSettingsControllers.add(new PowerButtonInstantLockPreferenceController( + getContext(), mUserId, mLockPatternUtils)); + mUnlockSettingsControllers.add(new LockAfterTimeoutPreferenceController( + getContext(), mUserId, mLockPatternUtils)); + mUnlockSettingsControllers.add(new AutoPinConfirmPreferenceController( + getContext(), mUserId, mLockPatternUtils, this)); + } + + private void setUpUnlockSettingsPreference() { + boolean showUnlockSettingsCategory = false; + for (AbstractPreferenceController controller : mUnlockSettingsControllers) { + final boolean isAvailable = controller.isAvailable(); + final Preference preference = findPreference(controller.getPreferenceKey()); + preference.setVisible(isAvailable); + if (!isAvailable) { + continue; + } + preference.setOnPreferenceChangeListener( + (Preference.OnPreferenceChangeListener) controller); + controller.updateState(preference); + showUnlockSettingsCategory = true; + } + final PreferenceCategory unlockSettingsCategory = findPreference(KEY_LOCK_SETTINGS); + unlockSettingsCategory.setVisible(showUnlockSettingsCategory); + } + private String getFooterString() { @StringRes int stringId; switch (mController.getAggregatedPasswordComplexity()) { diff --git a/src/com/android/settings/password/SetupChooseLockPattern.java b/src/com/android/settings/password/SetupChooseLockPattern.java index 55b3847125e..794104912e8 100644 --- a/src/com/android/settings/password/SetupChooseLockPattern.java +++ b/src/com/android/settings/password/SetupChooseLockPattern.java @@ -16,8 +16,6 @@ package com.android.settings.password; -import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; - import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN; import android.content.Context; @@ -138,17 +136,10 @@ public class SetupChooseLockPattern extends ChooseLockPattern { protected void updateStage(Stage stage) { super.updateStage(stage); if (!showMinimalUi() && mOptionsButton != null) { - // In landscape, keep view stub to avoid pattern view shifting, but in portrait the - // header title and description could become multiple lines in confirm stage, - // gone the button view to reserve more room for growth height of header. - @View.Visibility - final int hideOrGone = - getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE - ? View.INVISIBLE : View.GONE; mOptionsButton.setVisibility( (stage == Stage.Introduction || stage == Stage.HelpScreen || stage == Stage.ChoiceTooShort || stage == Stage.FirstChoiceValid) - ? View.VISIBLE : hideOrGone); + ? View.VISIBLE : View.INVISIBLE); } if (stage.leftMode == LeftButtonMode.Gone && stage == Stage.Introduction) { diff --git a/src/com/android/settings/regionalpreferences/RegionPickerBaseListPreferenceController.java b/src/com/android/settings/regionalpreferences/RegionPickerBaseListPreferenceController.java index cb3b82b57cd..338ecc978af 100644 --- a/src/com/android/settings/regionalpreferences/RegionPickerBaseListPreferenceController.java +++ b/src/com/android/settings/regionalpreferences/RegionPickerBaseListPreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.regionalpreferences; import android.content.Context; import android.os.Bundle; +import android.os.LocaleList; import android.util.Log; import androidx.annotation.NonNull; @@ -91,7 +92,7 @@ public abstract class RegionPickerBaseListPreferenceController extends BasePrefe ? getSuggestedLocaleList() : getSupportedLocaleList(); if (getPreferenceCategoryKey().contains(KEY_SUGGESTED)) { - Locale systemLocale = Locale.getDefault(); + Locale systemLocale = LocaleList.getDefault().get(0); LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(systemLocale); result.add(localeInfo); } @@ -105,7 +106,7 @@ public abstract class RegionPickerBaseListPreferenceController extends BasePrefe mPreferenceCategory.addPreference(pref); pref.setTitle(locale.getFullCountryNameNative()); pref.setKey(locale.toString()); - if (locale.getLocale().equals(Locale.getDefault())) { + if (locale.getLocale().equals(LocaleList.getDefault().get(0))) { pref.setChecked(true); } else { pref.setChecked(false); diff --git a/src/com/android/settings/regionalpreferences/RegionPickerFragment.java b/src/com/android/settings/regionalpreferences/RegionPickerFragment.java index cf4d9b99ba0..c064565fce8 100644 --- a/src/com/android/settings/regionalpreferences/RegionPickerFragment.java +++ b/src/com/android/settings/regionalpreferences/RegionPickerFragment.java @@ -19,6 +19,7 @@ package com.android.settings.regionalpreferences; import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; +import android.os.LocaleList; import android.provider.Settings; import androidx.annotation.NonNull; @@ -83,7 +84,7 @@ public class RegionPickerFragment extends DashboardFragment{ private List buildPreferenceControllers( @NonNull Context context) { - Locale parentLocale = LocaleStore.getLocaleInfo(Locale.getDefault()).getParent(); + Locale parentLocale = LocaleStore.getLocaleInfo(LocaleList.getDefault().get(0)).getParent(); LocaleStore.LocaleInfo parentLocaleInfo = LocaleStore.getLocaleInfo(parentLocale); SystemRegionSuggestedListPreferenceController mSuggestedListPreferenceController = new SystemRegionSuggestedListPreferenceController( diff --git a/src/com/android/settings/regionalpreferences/RegionPreferenceController.java b/src/com/android/settings/regionalpreferences/RegionPreferenceController.java index a9d87f0f181..345bd755d8d 100644 --- a/src/com/android/settings/regionalpreferences/RegionPreferenceController.java +++ b/src/com/android/settings/regionalpreferences/RegionPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.regionalpreferences; import android.content.Context; +import android.os.LocaleList; import androidx.annotation.NonNull; import androidx.preference.Preference; @@ -26,8 +27,6 @@ import com.android.internal.app.LocaleStore; import com.android.settings.core.BasePreferenceController; import com.android.settings.flags.Flags; -import java.util.Locale; - /** A controller for the entry of region picker page */ public class RegionPreferenceController extends BasePreferenceController { @@ -39,7 +38,8 @@ public class RegionPreferenceController extends BasePreferenceController { public void displayPreference(@NonNull PreferenceScreen screen) { super.displayPreference(screen); Preference preference = screen.findPreference(getPreferenceKey()); - LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(Locale.getDefault()); + LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo( + LocaleList.getDefault().get(0)); preference.setSummary(localeInfo.getFullCountryNameNative()); } diff --git a/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java b/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java index 88477c364f1..bc38feb20dc 100644 --- a/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java +++ b/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java @@ -92,7 +92,8 @@ public class ScreenLockPreferenceDetailsUtils { * Returns whether the Gear Menu should be shown. */ public boolean shouldShowGearMenu() { - return isLockPatternSecure(); + return !com.android.settings.flags.Flags.biometricsOnboardingEducation() + && isLockPatternSecure(); } /** diff --git a/src/com/android/settings/service/PreferenceService.kt b/src/com/android/settings/service/PreferenceService.kt index 2e5191486c0..9843847304e 100644 --- a/src/com/android/settings/service/PreferenceService.kt +++ b/src/com/android/settings/service/PreferenceService.kt @@ -16,7 +16,6 @@ package com.android.settings.service -import android.app.Application import android.os.Binder import android.os.OutcomeReceiver import android.service.settings.preferences.GetValueRequest @@ -26,6 +25,7 @@ import android.service.settings.preferences.MetadataResult import android.service.settings.preferences.SetValueRequest import android.service.settings.preferences.SetValueResult import android.service.settings.preferences.SettingsPreferenceService +import com.android.settings.metrics.SettingsRemoteOpMetricsLogger import com.android.settingslib.graph.GetPreferenceGraphApiHandler import com.android.settingslib.graph.GetPreferenceGraphRequest import com.android.settingslib.graph.PreferenceGetterApiHandler @@ -41,9 +41,19 @@ class PreferenceService : SettingsPreferenceService() { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) - private val getApiHandler = PreferenceGetterApiHandler(1, ApiPermissionChecker.alwaysAllow()) - private val setApiHandler = PreferenceSetterApiHandler(2, ApiPermissionChecker.alwaysAllow()) - private val graphApi = GraphProvider(3) + private val getApiHandler: PreferenceGetterApiHandler + private val setApiHandler: PreferenceSetterApiHandler + private val graphApi: GetPreferenceGraphApiHandler + + init { + val metricsLogger = SettingsRemoteOpMetricsLogger() + getApiHandler = + PreferenceGetterApiHandler(1, ApiPermissionChecker.alwaysAllow(), metricsLogger) + setApiHandler = + PreferenceSetterApiHandler(2, ApiPermissionChecker.alwaysAllow(), metricsLogger) + graphApi = + GetPreferenceGraphApiHandler(3, ApiPermissionChecker.alwaysAllow(), metricsLogger) + } override fun onGetAllPreferenceMetadata( request: MetadataRequest, @@ -58,9 +68,7 @@ class PreferenceService : SettingsPreferenceService() { application, callingPid, callingUid, - GetPreferenceGraphRequest( - flags = PreferenceGetterFlags.METADATA, - ), + GetPreferenceGraphRequest(flags = PreferenceGetterFlags.METADATA), ) val result = transformCatalystGetMetadataResponse(this@PreferenceService, graphProto) callback.onResult(result) @@ -107,14 +115,4 @@ class PreferenceService : SettingsPreferenceService() { } } } - - // Basic implementation - we already have permission to access Graph for Metadata via superclass - private class GraphProvider(override val id: Int) : GetPreferenceGraphApiHandler(emptySet()) { - override fun hasPermission( - application: Application, - callingPid: Int, - callingUid: Int, - request: GetPreferenceGraphRequest, - ) = true - } } diff --git a/src/com/android/settings/supervision/SupervisionDashboardFragment.kt b/src/com/android/settings/supervision/SupervisionDashboardFragment.kt index 77995055737..9b1b1553f99 100644 --- a/src/com/android/settings/supervision/SupervisionDashboardFragment.kt +++ b/src/com/android/settings/supervision/SupervisionDashboardFragment.kt @@ -29,7 +29,7 @@ import com.android.settings.dashboard.DashboardFragment */ class SupervisionDashboardFragment : DashboardFragment() { - override fun getPreferenceScreenResId() = R.xml.placeholder_preference_screen + override fun getPreferenceScreenResId() = 0 override fun getMetricsCategory() = SettingsEnums.SUPERVISION_DASHBOARD diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java index c93ee1e8e2e..4e8c592c44f 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java @@ -21,16 +21,8 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TRIPLETAP; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP; - import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.spy; - import android.accessibilityservice.AccessibilityServiceInfo; import android.content.ComponentName; import android.content.Context; @@ -61,7 +53,6 @@ public final class AccessibilityUtilTest { private static final String SECURE_TEST_KEY = "secure_test_key"; private static final String MOCK_PACKAGE_NAME = "com.mock.example"; private static final String MOCK_CLASS_NAME = MOCK_PACKAGE_NAME + ".mock_a11y_service"; - private static final String MOCK_CLASS_NAME2 = MOCK_PACKAGE_NAME + ".mock_a11y_service2"; private static final ComponentName MOCK_COMPONENT_NAME = new ComponentName(MOCK_PACKAGE_NAME, MOCK_CLASS_NAME); @Rule @@ -71,7 +62,7 @@ public final class AccessibilityUtilTest { @Before public void setUp() { - mContext = spy(ApplicationProvider.getApplicationContext()); + mContext = ApplicationProvider.getApplicationContext(); } @Test @@ -148,37 +139,6 @@ public final class AccessibilityUtilTest { AccessibilityUtil.AccessibilityServiceFragmentType.TOGGLE); } - @Test - public void convertKeyFromSettings_shortcutTypeSoftware() { - assertThat(AccessibilityUtil.convertKeyFromSettings(SOFTWARE)) - .isEqualTo(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS); - } - - @Test - public void convertKeyFromSettings_shortcutTypeHardware() { - assertThat(AccessibilityUtil.convertKeyFromSettings(HARDWARE)) - .isEqualTo(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); - } - - @Test - public void convertKeyFromSettings_shortcutTypeTripleTap() { - assertThat(AccessibilityUtil.convertKeyFromSettings(TRIPLETAP)) - .isEqualTo(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED); - } - - @Test - public void convertKeyFromSettings_shortcutTypeMultiFingersMultiTap() { - assertThat(AccessibilityUtil.convertKeyFromSettings(TWOFINGER_DOUBLETAP)) - .isEqualTo( - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED); - } - - @Test - public void convertKeyFromSettings_shortcutTypeQuickSettings() { - assertThat(AccessibilityUtil.convertKeyFromSettings(QUICK_SETTINGS)) - .isEqualTo(Settings.Secure.ACCESSIBILITY_QS_TARGETS); - } - @Test @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void getSoftwareShortcutSummary_returnsSoftwareSummary() { diff --git a/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java index 8d5724bb197..da8fd7ef5ca 100644 --- a/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java @@ -16,8 +16,6 @@ package com.android.settings.accessibility; -import static com.google.common.truth.Truth.assertThat; - import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -34,11 +32,7 @@ import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; -import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; - import org.junit.Before; -import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; @@ -83,72 +77,6 @@ public class LaunchAccessibilityActivityPreferenceFragmentTest { doReturn(mScreen).when(mFragment).getPreferenceScreen(); } - @Test - public void getTileTooltipContent_noTileServiceAssigned_returnNull() { - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); - - assertThat(tileTooltipContent).isNull(); - } - - @Test - public void getTileTooltipContent_hasOneTileService_guideToEdit_haveMatchString() { - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, - PLACEHOLDER_TILE_NAME); - - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); - final CharSequence tileName = - mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); - assertThat(tileTooltipContent.toString()).isEqualTo( - mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName)); - } - - @Test - public void getTileTooltipContent_hasOneTileService_guideToDirectUse_haveMatchString() { - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, - PLACEHOLDER_TILE_NAME); - - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE); - final CharSequence tileName = - mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); - assertThat(tileTooltipContent.toString()).isEqualTo( - mContext.getString( - R.string.accessibility_service_auto_added_qs_tooltip_content, tileName)); - } - - @Test - public void getTileTooltipContent_hasTwoTileServices_guideToEdit_haveMatchString() { - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, - PLACEHOLDER_TILE_NAME); - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME2, - PLACEHOLDER_TILE_NAME2); - - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); - final CharSequence tileName = - mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); - assertThat(tileTooltipContent.toString()).isEqualTo( - mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName)); - } - - @Test - public void getTileTooltipContent_hasTwoTileServices_guideToDirectUse_haveMatchString() { - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, - PLACEHOLDER_TILE_NAME); - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME2, - PLACEHOLDER_TILE_NAME2); - - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE); - final CharSequence tileName = - mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); - assertThat(tileTooltipContent.toString()).isEqualTo( - mContext.getString( - R.string.accessibility_service_auto_added_qs_tooltip_content, tileName)); - } - private void setupTileService(String packageName, String name, String tileName) { final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE); final ResolveInfo info = new ResolveInfo(); diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java index 70290af8a61..db5aec56276 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java @@ -43,9 +43,7 @@ import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.internal.accessibility.common.ShortcutConstants; -import com.android.settings.R; import com.android.settings.SettingsActivity; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; import com.android.settings.widget.SettingsMainSwitchPreference; @@ -111,72 +109,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { mShadowAccessibilityManager = Shadow.extract(AccessibilityManager.getInstance(mContext)); } - @Test - public void getTileTooltipContent_noTileServiceAssigned_returnNull() { - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); - - assertThat(tileTooltipContent).isNull(); - } - - @Test - public void getTileTooltipContent_hasOneTileService_guideToEdit_haveMatchString() { - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, - PLACEHOLDER_TILE_NAME); - - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); - final CharSequence tileName = - mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); - assertThat(tileTooltipContent.toString()).isEqualTo( - mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName)); - } - - @Test - public void getTileTooltipContent_hasOneTileService_guideToDirectUse_haveMatchString() { - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, - PLACEHOLDER_TILE_NAME); - - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE); - final CharSequence tileName = - mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); - assertThat(tileTooltipContent.toString()).isEqualTo( - mContext.getString( - R.string.accessibility_service_auto_added_qs_tooltip_content, tileName)); - } - - @Test - public void getTileTooltipContent_hasTwoTileServices_guideToEdit_haveMatchString() { - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, - PLACEHOLDER_TILE_NAME); - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME2, - PLACEHOLDER_TILE_NAME2); - - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); - final CharSequence tileName = - mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); - assertThat(tileTooltipContent.toString()).isEqualTo( - mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName)); - } - - @Test - public void getTileTooltipContent_hasTwoTileServices_guideToDirectUse_haveMatchString() { - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, - PLACEHOLDER_TILE_NAME); - setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME2, - PLACEHOLDER_TILE_NAME2); - - final CharSequence tileTooltipContent = - mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE); - final CharSequence tileName = - mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); - assertThat(tileTooltipContent.toString()).isEqualTo( - mContext.getString( - R.string.accessibility_service_auto_added_qs_tooltip_content, tileName)); - } - @Test public void getAccessibilityServiceInfo() throws Throwable { final AccessibilityServiceInfo info1 = getFakeAccessibilityServiceInfo( diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java index cbd449305d4..ff73e7feece 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java @@ -47,7 +47,6 @@ import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settings.widget.SettingsMainSwitchPreference; @@ -265,11 +264,6 @@ public class ToggleColorInversionPreferenceFragmentTest { return PLACEHOLDER_COMPONENT_NAME; } - @Override - protected CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { - return PLACEHOLDER_TILE_TOOLTIP_CONTENT; - } - @Override public View getView() { return mock(View.class); diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java index ad5b1b59a99..8f9d2e1fbd0 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java @@ -53,7 +53,6 @@ import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.flags.Flags; import com.android.settings.testutils.shadow.ShadowAccessibilityManager; import com.android.settings.testutils.shadow.ShadowFragment; @@ -378,11 +377,6 @@ public class ToggleFeaturePreferenceFragmentTest { return PLACEHOLDER_TILE_COMPONENT_NAME; } - @Override - protected CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { - return PLACEHOLDER_TILE_TOOLTIP_CONTENT; - } - @Override public int getPreferenceScreenResId() { return R.xml.placeholder_prefs; diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java index 863452fb645..ae059ddfafd 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java @@ -35,7 +35,6 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.settings.SettingsEnums; @@ -47,7 +46,6 @@ import android.database.ContentObserver; import android.icu.text.CaseMap; import android.net.Uri; import android.os.Bundle; -import android.os.UserHandle; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; @@ -66,7 +64,7 @@ import com.android.server.accessibility.Flags; import com.android.settings.DialogCreatable; import com.android.settings.R; import com.android.settings.SettingsActivity; -import com.android.settings.testutils.AccessibilityTestUtils; +import com.android.settings.testutils.shadow.ShadowAccessibilityManager; import com.android.settings.testutils.shadow.ShadowDeviceConfig; import com.android.settings.testutils.shadow.ShadowStorageManager; import com.android.settings.testutils.shadow.ShadowUserManager; @@ -83,6 +81,7 @@ import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.Shadows; import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowContentResolver; import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.shadows.ShadowSettings; @@ -92,7 +91,6 @@ import org.robolectric.util.ReflectionHelpers; import java.util.Collection; import java.util.List; import java.util.Locale; -import java.util.Set; /** Tests for {@link ToggleScreenMagnificationPreferenceFragment}. */ @RunWith(RobolectricTestRunner.class) @@ -101,6 +99,7 @@ import java.util.Set; ShadowStorageManager.class, ShadowSettings.ShadowSecure.class, ShadowDeviceConfig.class, + ShadowAccessibilityManager.class, }) public class ToggleScreenMagnificationPreferenceFragmentTest { @@ -137,15 +136,15 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { private FragmentController mFragController; private Context mContext; - private AccessibilityManager mAccessibilityManager; private Resources mSpyResources; private ShadowPackageManager mShadowPackageManager; + private ShadowAccessibilityManager mShadowAccessibilityManager; @Before public void setUpTestFragment() { - mContext = spy(ApplicationProvider.getApplicationContext()); - mAccessibilityManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext); + mShadowAccessibilityManager = Shadow.extract( + mContext.getSystemService(AccessibilityManager.class)); // Set up the fragment that support window magnification feature mSpyResources = spy(mContext.getResources()); @@ -420,137 +419,6 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { assertThat(shadowContentResolver.getContentObservers(observedUri)).isEmpty(); } - @Test - public void hasValueInSettings_putValue_hasValue() { - setMagnificationTripleTapEnabled(/* enabled= */ true); - - assertThat(ToggleScreenMagnificationPreferenceFragment.hasMagnificationValuesInSettings( - mContext, TRIPLETAP)).isTrue(); - } - - @Test - @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE) - public void hasMagnificationValuesInSettings_twoFingerTripleTapIsOn_isTrue() { - Settings.Secure.putInt( - mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON); - - assertThat(ToggleScreenMagnificationPreferenceFragment.hasMagnificationValuesInSettings( - mContext, TWOFINGER_DOUBLETAP)).isTrue(); - } - - @Test - @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE) - public void hasMagnificationValuesInSettings_twoFingerTripleTapIsOff_isFalse() { - Settings.Secure.putInt( - mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, OFF); - - assertThat(ToggleScreenMagnificationPreferenceFragment.hasMagnificationValuesInSettings( - mContext, TWOFINGER_DOUBLETAP)).isFalse(); - } - - @Test - public void optInAllValuesToSettings_optInValue_callA11yManager() { - int shortcutTypes = - SOFTWARE | TRIPLETAP | HARDWARE - | QUICK_SETTINGS; - Set shortcutTargets = Set.of(MAGNIFICATION_CONTROLLER_NAME); - - ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings(mContext, - shortcutTypes); - - verify(mAccessibilityManager).enableShortcutsForTargets( - /* enable= */ true, SOFTWARE, - shortcutTargets, UserHandle.myUserId()); - verify(mAccessibilityManager).enableShortcutsForTargets( - /* enable= */ true, HARDWARE, - shortcutTargets, UserHandle.myUserId()); - verify(mAccessibilityManager).enableShortcutsForTargets( - /* enable= */ true, QUICK_SETTINGS, - shortcutTargets, UserHandle.myUserId()); - verify(mAccessibilityManager).enableShortcutsForTargets( - /* enable= */ true, TRIPLETAP, - shortcutTargets, UserHandle.myUserId()); - verifyNoMoreInteractions(mAccessibilityManager); - } - - @Test - public void optInAllValuesToSettings_software_sizeValueIsNotNull_sizeValueIsNotChanged() { - for (int size : new int[]{FloatingMenuSizePreferenceController.Size.LARGE, - FloatingMenuSizePreferenceController.Size.SMALL}) { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, size); - - ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings( - mContext, - SOFTWARE); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.UNKNOWN)).isEqualTo( - size); - } - } - - @Test - public void optInAllValuesToSettings_hardware_sizeValueIsNotChanged() { - for (int size : new int[]{FloatingMenuSizePreferenceController.Size.UNKNOWN, - FloatingMenuSizePreferenceController.Size.LARGE, - FloatingMenuSizePreferenceController.Size.SMALL}) { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, size); - - ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings( - mContext, - HARDWARE); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, size + 1)).isEqualTo( - size); - } - } - - @Test - public void optInAllValuesToSettings_tripletap_sizeValueIsNotChanged() { - for (int size : new int[]{FloatingMenuSizePreferenceController.Size.UNKNOWN, - FloatingMenuSizePreferenceController.Size.LARGE, - FloatingMenuSizePreferenceController.Size.SMALL}) { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, size); - - ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings( - mContext, - TRIPLETAP); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, size + 1)).isEqualTo( - size); - } - } - - @Test - public void optOutAllValuesToSettings_optOutValue_callA11yManager() { - Set shortcutTargets = Set.of(MAGNIFICATION_CONTROLLER_NAME); - putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME); - putStringIntoSettings(HARDWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME); - setMagnificationTripleTapEnabled(/* enabled= */ true); - int shortcutTypes = - SOFTWARE | HARDWARE | TRIPLETAP; - - ToggleScreenMagnificationPreferenceFragment.optOutAllMagnificationValuesFromSettings( - mContext, shortcutTypes); - - verify(mAccessibilityManager).enableShortcutsForTargets( - /* enable= */ false, SOFTWARE, - shortcutTargets, UserHandle.myUserId()); - verify(mAccessibilityManager).enableShortcutsForTargets( - /* enable= */ false, HARDWARE, - shortcutTargets, UserHandle.myUserId()); - verify(mAccessibilityManager).enableShortcutsForTargets( - /* enable= */ false, TRIPLETAP, - shortcutTargets, UserHandle.myUserId()); - verifyNoMoreInteractions(mAccessibilityManager); - } - @Test public void updateShortcutPreferenceData_assignDefaultValueToVariable() { mFragController.create(R.id.main_content, /* bundle= */ null).start().resume(); @@ -565,8 +433,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test public void updateShortcutPreferenceData_hasValueInSettings_assignToVariable() { - putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME); - setMagnificationTripleTapEnabled(/* enabled= */ true); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TRIPLETAP | SOFTWARE, List.of(MAGNIFICATION_CONTROLLER_NAME)); mFragController.create(R.id.main_content, /* bundle= */ null).start().resume(); mFragController.get().updateShortcutPreferenceData(); @@ -593,8 +461,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE) public void updateShortcutPreferenceData_hasTwoFingerTripleTapInSettings_assignToVariable() { - Settings.Secure.putInt( - mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TWOFINGER_DOUBLETAP, List.of(MAGNIFICATION_CONTROLLER_NAME)); mFragController.create(R.id.main_content, /* bundle= */ null).start().resume(); mFragController.get().updateShortcutPreferenceData(); @@ -802,7 +670,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test public void getSummary_magnificationEnabled_returnShortcutOnWithSummary() { - setMagnificationTripleTapEnabled(true); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TRIPLETAP, List.of(MAGNIFICATION_CONTROLLER_NAME)); assertThat( ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString()) @@ -816,7 +685,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test public void getSummary_magnificationDisabled_returnShortcutOffWithSummary() { - setMagnificationTripleTapEnabled(false); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TRIPLETAP, List.of()); assertThat( ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString()) @@ -832,8 +702,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE) public void getSummary_magnificationGestureEnabled_returnShortcutOnWithSummary() { - Settings.Secure.putInt( - mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TWOFINGER_DOUBLETAP, List.of(MAGNIFICATION_CONTROLLER_NAME)); assertThat( ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString()) @@ -848,8 +718,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE) public void getSummary_magnificationGestureDisabled_returnShortcutOffWithSummary() { - Settings.Secure.putInt( - mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, OFF); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TRIPLETAP | TWOFINGER_DOUBLETAP, List.of()); assertThat( ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString()) @@ -977,7 +847,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE, Flags.FLAG_ENABLE_LOW_VISION_HATS}) public void getNonIndexableKeys_hasShortcutAndAllFeaturesEnabled_allItemsSearchable() { - setMagnificationTripleTapEnabled(true); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TRIPLETAP, List.of(MAGNIFICATION_CONTROLLER_NAME)); setAlwaysOnSupported(true); setJoystickSupported(true); @@ -991,7 +862,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) public void getNonIndexableKeys_noShortcut_alwaysOnSupported_notSearchable() { - setMagnificationTripleTapEnabled(false); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TRIPLETAP, List.of()); setAlwaysOnSupported(true); final List niks = ToggleScreenMagnificationPreferenceFragment @@ -1004,7 +876,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) public void getNonIndexableKeys_hasShortcut_alwaysOnNotSupported_notSearchable() { - setMagnificationTripleTapEnabled(true); + mShadowAccessibilityManager.setAccessibilityShortcutTargets( + TRIPLETAP, List.of(MAGNIFICATION_CONTROLLER_NAME)); setAlwaysOnSupported(false); final List niks = ToggleScreenMagnificationPreferenceFragment @@ -1056,11 +929,6 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { PreferredShortcuts.saveUserShortcutType(context, shortcut); } - private void setMagnificationTripleTapEnabled(boolean enabled) { - Settings.Secure.putInt(mContext.getContentResolver(), TRIPLETAP_SHORTCUT_KEY, - enabled ? ON : OFF); - } - private void setKeyMagnificationMode(@MagnificationMode int mode) { MagnificationCapabilities.setCapabilities(mContext, mode); } diff --git a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java index 53a8f5d2cdd..8880e2c307e 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java @@ -28,6 +28,7 @@ import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; +import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.view.LayoutInflater; @@ -551,6 +552,104 @@ public class AdvancedBluetoothDetailsHeaderControllerTest { assertThat(button.getVisibility()).isEqualTo(View.GONE); } + @Test + @EnableFlags(Flags.FLAG_ENABLE_BATTERY_LEVEL_DISPLAY) + public void enableBatt_budsDisconnected_batteryLevelShown() { + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_DEVICE_TYPE)) + .thenReturn(BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET.getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) + .thenReturn(String.valueOf(false).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_LEFT_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_LEFT).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_RIGHT_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_RIGHT).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_CASE_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_MAIN).getBytes()); + when(mBluetoothDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS)) + .thenReturn("true".getBytes()); + when(mCachedDevice.isConnected()).thenReturn(false); + + mController.refresh(); + + assertBatteryLevel(mLayoutPreference.findViewById(R.id.layout_left), BATTERY_LEVEL_LEFT); + assertBatteryLevel(mLayoutPreference.findViewById(R.id.layout_right), BATTERY_LEVEL_RIGHT); + assertBatteryLevel(mLayoutPreference.findViewById(R.id.layout_middle), BATTERY_LEVEL_MAIN); + } + + @Test + @DisableFlags(Flags.FLAG_ENABLE_BATTERY_LEVEL_DISPLAY) + public void disableBatt_budsDisconnected_batteryLevelNotShown() { + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_DEVICE_TYPE)) + .thenReturn(BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET.getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) + .thenReturn(String.valueOf(false).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_LEFT_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_LEFT).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_RIGHT_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_RIGHT).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_CASE_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_MAIN).getBytes()); + when(mBluetoothDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS)) + .thenReturn("true".getBytes()); + when(mCachedDevice.isConnected()).thenReturn(false); + + mController.refresh(); + + assertThat(mLayoutPreference.findViewById(R.id.layout_left).getVisibility()) + .isNotEqualTo(View.VISIBLE); + assertThat(mLayoutPreference.findViewById(R.id.layout_right).getVisibility()) + .isNotEqualTo(View.VISIBLE); + assertThat( + mLayoutPreference + .findViewById(R.id.layout_middle) + .findViewById(R.id.bt_battery_summary) + .getVisibility()) + .isNotEqualTo(View.VISIBLE); + assertThat( + mLayoutPreference + .findViewById(R.id.layout_middle) + .findViewById(R.id.bt_battery_icon) + .getVisibility()) + .isNotEqualTo(View.VISIBLE); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_BATTERY_LEVEL_DISPLAY) + public void disableFastPairBatt_budsDisconnected_batteryLevelNotShown() { + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_DEVICE_TYPE)) + .thenReturn(BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET.getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) + .thenReturn(String.valueOf(false).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_LEFT_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_LEFT).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_RIGHT_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_RIGHT).getBytes()); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_UNTETHERED_CASE_BATTERY)) + .thenReturn(String.valueOf(BATTERY_LEVEL_MAIN).getBytes()); + when(mBluetoothDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS)) + .thenReturn("false".getBytes()); + when(mCachedDevice.isConnected()).thenReturn(false); + + mController.refresh(); + + assertThat(mLayoutPreference.findViewById(R.id.layout_left).getVisibility()) + .isNotEqualTo(View.VISIBLE); + assertThat(mLayoutPreference.findViewById(R.id.layout_right).getVisibility()) + .isNotEqualTo(View.VISIBLE); + assertThat( + mLayoutPreference + .findViewById(R.id.layout_middle) + .findViewById(R.id.bt_battery_summary) + .getVisibility()) + .isNotEqualTo(View.VISIBLE); + assertThat( + mLayoutPreference + .findViewById(R.id.layout_middle) + .findViewById(R.id.bt_battery_icon) + .getVisibility()) + .isNotEqualTo(View.VISIBLE); + } + private void assertBatteryPredictionVisible(LinearLayout linearLayout, int visible) { final TextView textView = linearLayout.findViewById(R.id.bt_battery_prediction); assertThat(textView.getVisibility()).isEqualTo(visible); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java index 4a4a167622f..1156b7af9a1 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java @@ -117,8 +117,6 @@ import java.util.concurrent.Executor; }) public class AudioSharingDevicePreferenceControllerTest { private static final String KEY = "audio_sharing_device_list"; - private static final String KEY_AUDIO_SHARING_SETTINGS = - "connected_device_audio_sharing_settings"; private static final String TEST_DEVICE_NAME = "test"; @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); @@ -151,7 +149,6 @@ public class AudioSharingDevicePreferenceControllerTest { private Lifecycle mLifecycle; private LifecycleOwner mLifecycleOwner; private PreferenceCategory mPreferenceGroup; - private Preference mAudioSharingPreference; private FakeFeatureFactory mFeatureFactory; private AudioManager mAudioManager; @@ -189,10 +186,6 @@ public class AudioSharingDevicePreferenceControllerTest { when(mScreen.getContext()).thenReturn(mContext); mPreferenceGroup = spy(new PreferenceCategory(mContext)); doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager(); - mAudioSharingPreference = new Preference(mContext); - mPreferenceGroup.addPreference(mAudioSharingPreference); - when(mPreferenceGroup.findPreference(KEY_AUDIO_SHARING_SETTINGS)) - .thenReturn(mAudioSharingPreference); when(mScreen.findPreference(KEY)).thenReturn(mPreferenceGroup); mController = new AudioSharingDevicePreferenceController(mContext); mController.init(mFragment); @@ -260,7 +253,6 @@ public class AudioSharingDevicePreferenceControllerTest { mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mController.displayPreference(mScreen); assertThat(mPreferenceGroup.isVisible()).isFalse(); - assertThat(mAudioSharingPreference.isVisible()).isFalse(); verify(mBluetoothDeviceUpdater, never()).forceUpdate(); } @@ -269,7 +261,6 @@ public class AudioSharingDevicePreferenceControllerTest { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mController.displayPreference(mScreen); assertThat(mPreferenceGroup.isVisible()).isFalse(); - assertThat(mAudioSharingPreference.isVisible()).isFalse(); verify(mBluetoothDeviceUpdater).setPrefContext(mContext); verify(mBluetoothDeviceUpdater).forceUpdate(); } @@ -299,8 +290,7 @@ public class AudioSharingDevicePreferenceControllerTest { shadowOf(Looper.getMainLooper()).idle(); assertThat(mPreferenceGroup.isVisible()).isTrue(); - assertThat(mAudioSharingPreference.isVisible()).isTrue(); - assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2); + assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); } @Test @@ -312,8 +302,7 @@ public class AudioSharingDevicePreferenceControllerTest { shadowOf(Looper.getMainLooper()).idle(); assertThat(mPreferenceGroup.isVisible()).isFalse(); - assertThat(mAudioSharingPreference.isVisible()).isFalse(); - assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); + assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0); } @Test diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceControllerTest.java index d9c883e5b1f..cdf21db9de2 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceControllerTest.java @@ -25,8 +25,10 @@ import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; @@ -77,7 +79,8 @@ import org.robolectric.shadow.api.Shadow; ShadowThreadUtils.class }) public class AudioSharingPreferenceControllerTest { - private static final String PREF_KEY = "audio_sharing_settings"; + private static final String PREF_KEY1 = "audio_sharing_settings"; + private static final String PREF_KEY2 = "connected_device_audio_sharing_settings"; @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @@ -110,9 +113,6 @@ public class AudioSharingPreferenceControllerTest { when(localBluetoothManager.getEventManager()).thenReturn(mBtEventManager); when(localBluetoothManager.getProfileManager()).thenReturn(mLocalBtProfileManager); when(mLocalBtProfileManager.getLeAudioBroadcastProfile()).thenReturn(mBroadcast); - mController = new AudioSharingPreferenceController(mContext, PREF_KEY); - mPreference = spy(new Preference(mContext)); - when(mScreen.findPreference(PREF_KEY)).thenReturn(mPreference); } @After @@ -124,6 +124,7 @@ public class AudioSharingPreferenceControllerTest { @Test public void onStart_flagOn_registerCallback() { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); + setupControllerWithKey(PREF_KEY1); mController.onStart(mLifecycleOwner); verify(mBtEventManager).registerCallback(mController); verify(mBroadcast).registerServiceCallBack(any(), any(BluetoothLeBroadcast.Callback.class)); @@ -132,6 +133,7 @@ public class AudioSharingPreferenceControllerTest { @Test public void onStart_flagOff_skipRegisterCallback() { mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); + setupControllerWithKey(PREF_KEY1); mController.onStart(mLifecycleOwner); verify(mBtEventManager, never()).registerCallback(mController); verify(mBroadcast, never()) @@ -141,6 +143,7 @@ public class AudioSharingPreferenceControllerTest { @Test public void onStop_flagOn_unregisterCallback() { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); + setupControllerWithKey(PREF_KEY1); mController.onStop(mLifecycleOwner); verify(mBtEventManager).unregisterCallback(mController); verify(mBroadcast).unregisterServiceCallBack(any(BluetoothLeBroadcast.Callback.class)); @@ -149,6 +152,7 @@ public class AudioSharingPreferenceControllerTest { @Test public void onStop_flagOff_skipUnregisterCallback() { mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); + setupControllerWithKey(PREF_KEY1); mController.onStop(mLifecycleOwner); verify(mBtEventManager, never()).unregisterCallback(mController); verify(mBroadcast, never()) @@ -158,65 +162,147 @@ public class AudioSharingPreferenceControllerTest { @Test public void getAvailabilityStatus_flagOn() { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); + setupControllerWithKey(PREF_KEY1); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test public void getAvailabilityStatus_flagOff() { mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); + setupControllerWithKey(PREF_KEY1); assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); } @Test - public void getSummary_broadcastOn() { + public void getSummary_connectionPreference_broadcastOn() { when(mBroadcast.isEnabled(any())).thenReturn(true); + setupControllerWithKey(PREF_KEY1); assertThat(mController.getSummary().toString()) .isEqualTo(mContext.getString(R.string.audio_sharing_summary_on)); } @Test - public void getSummary_broadcastOff() { + public void getSummary_connectionPreference_broadcastOff() { when(mBroadcast.isEnabled(any())).thenReturn(false); + setupControllerWithKey(PREF_KEY1); assertThat(mController.getSummary().toString()) .isEqualTo(mContext.getString(R.string.audio_sharing_summary_off)); } + @Test + public void getSummary_connectedDevices_broadcastOn() { + when(mBroadcast.isEnabled(any())).thenReturn(true); + setupControllerWithKey(PREF_KEY2); + assertThat(mController.getSummary().toString()).isEmpty(); + } + + @Test + public void getSummary_connectedDevices_broadcastOff() { + when(mBroadcast.isEnabled(any())).thenReturn(false); + setupControllerWithKey(PREF_KEY2); + assertThat(mController.getSummary().toString()).isEmpty(); + } + @Test public void onBluetoothStateChanged_refreshSummary() { + setupControllerWithKey(PREF_KEY1); + mController.updateState(mPreference); mController.displayPreference(mScreen); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mPreference.getSummary().toString()) + .isEqualTo(mContext.getString(R.string.audio_sharing_summary_off)); + assertThat(mPreference.isVisible()).isTrue(); + when(mBroadcast.isEnabled(any())).thenReturn(true); mController.onBluetoothStateChanged(STATE_ON); shadowOf(Looper.getMainLooper()).idle(); assertThat(mPreference.getSummary().toString()) .isEqualTo(mContext.getString(R.string.audio_sharing_summary_on)); + assertThat(mPreference.isVisible()).isTrue(); when(mBroadcast.isEnabled(any())).thenReturn(false); mController.onBluetoothStateChanged(STATE_OFF); shadowOf(Looper.getMainLooper()).idle(); assertThat(mPreference.getSummary().toString()) .isEqualTo(mContext.getString(R.string.audio_sharing_summary_off)); + assertThat(mPreference.isVisible()).isTrue(); + } + + @Test + public void onBluetoothStateChanged_refreshVisibility() { + setupControllerWithKey(PREF_KEY2); + mController.updateState(mPreference); + mController.displayPreference(mScreen); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mPreference.getSummary().toString()).isEmpty(); + assertThat(mPreference.isVisible()).isFalse(); + + when(mBroadcast.isEnabled(any())).thenReturn(true); + mController.onBluetoothStateChanged(STATE_ON); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mPreference.getSummary().toString()).isEmpty(); + assertThat(mPreference.isVisible()).isTrue(); + + when(mBroadcast.isEnabled(any())).thenReturn(false); + mController.onBluetoothStateChanged(STATE_OFF); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mPreference.getSummary().toString()).isEmpty(); + assertThat(mPreference.isVisible()).isFalse(); } @Test public void testBluetoothLeBroadcastCallbacks_refreshSummary() { + setupControllerWithKey(PREF_KEY1); + mController.updateState(mPreference); mController.displayPreference(mScreen); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mPreference.getSummary().toString()) + .isEqualTo(mContext.getString(R.string.audio_sharing_summary_off)); + assertThat(mPreference.isVisible()).isTrue(); when(mBroadcast.isEnabled(any())).thenReturn(true); mController.mBroadcastCallback.onBroadcastStarted(/* reason= */ 1, /* broadcastId= */ 1); shadowOf(Looper.getMainLooper()).idle(); assertThat(mPreference.getSummary().toString()) .isEqualTo(mContext.getString(R.string.audio_sharing_summary_on)); + assertThat(mPreference.isVisible()).isTrue(); when(mBroadcast.isEnabled(any())).thenReturn(false); mController.mBroadcastCallback.onBroadcastStopped(/* reason= */ 1, /* broadcastId= */ 1); shadowOf(Looper.getMainLooper()).idle(); assertThat(mPreference.getSummary().toString()) .isEqualTo(mContext.getString(R.string.audio_sharing_summary_off)); + assertThat(mPreference.isVisible()).isTrue(); + } + + @Test + public void testBluetoothLeBroadcastCallbacks_refreshVisibility() { + setupControllerWithKey(PREF_KEY2); + mController.updateState(mPreference); + mController.displayPreference(mScreen); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mPreference.getSummary().toString()).isEmpty(); + assertThat(mPreference.isVisible()).isFalse(); + + when(mBroadcast.isEnabled(any())).thenReturn(true); + mController.mBroadcastCallback.onBroadcastStarted(/* reason= */ 1, /* broadcastId= */ 1); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mPreference.getSummary().toString()).isEmpty(); + assertThat(mPreference.isVisible()).isTrue(); + + when(mBroadcast.isEnabled(any())).thenReturn(false); + mController.mBroadcastCallback.onBroadcastStopped(/* reason= */ 1, /* broadcastId= */ 1); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mPreference.getSummary().toString()).isEmpty(); + assertThat(mPreference.isVisible()).isFalse(); } @Test public void testBluetoothLeBroadcastCallbacks_doNothing() { + setupControllerWithKey(PREF_KEY1); mController.displayPreference(mScreen); + shadowOf(Looper.getMainLooper()).idle(); + verify(mPreference).setVisible(anyBoolean()); mController.mBroadcastCallback.onBroadcastMetadataChanged(/* reason= */ 1, mMetadata); verify(mPreference, never()).setSummary(any()); @@ -233,5 +319,34 @@ public class AudioSharingPreferenceControllerTest { mController.mBroadcastCallback.onBroadcastUpdateFailed( /* reason= */ 1, /* broadcastId= */ 1); verify(mPreference, never()).setSummary(any()); + verify(mPreference).setVisible(anyBoolean()); + + setupControllerWithKey(PREF_KEY2); + mController.displayPreference(mScreen); + shadowOf(Looper.getMainLooper()).idle(); + verify(mPreference, times(3)).setVisible(anyBoolean()); + + mController.mBroadcastCallback.onBroadcastMetadataChanged(/* reason= */ 1, mMetadata); + verify(mPreference, never()).setSummary(any()); + mController.mBroadcastCallback.onBroadcastUpdated(/* reason= */ 1, /* broadcastId= */ 1); + verify(mPreference, never()).setSummary(any()); + mController.mBroadcastCallback.onPlaybackStarted(/* reason= */ 1, /* broadcastId= */ 1); + verify(mPreference, never()).setSummary(any()); + mController.mBroadcastCallback.onPlaybackStopped(/* reason= */ 1, /* broadcastId= */ 1); + verify(mPreference, never()).setSummary(any()); + mController.mBroadcastCallback.onBroadcastStartFailed(/* reason= */ 1); + verify(mPreference, never()).setSummary(any()); + mController.mBroadcastCallback.onBroadcastStopFailed(/* reason= */ 1); + verify(mPreference, never()).setSummary(any()); + mController.mBroadcastCallback.onBroadcastUpdateFailed( + /* reason= */ 1, /* broadcastId= */ 1); + verify(mPreference, never()).setSummary(any()); + verify(mPreference, times(3)).setVisible(anyBoolean()); + } + + private void setupControllerWithKey(String preferenceKey) { + mController = new AudioSharingPreferenceController(mContext, preferenceKey); + mPreference = spy(new Preference(mContext)); + when(mScreen.findPreference(preferenceKey)).thenReturn(mPreference); } } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java index 7851b2b38f8..dea98233609 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java @@ -515,23 +515,14 @@ public class AudioSharingSwitchBarControllerTest { } @Test - public void onBroadcastMetadataChanged_hasLocalSource_noDialog() { + public void onBroadcastMetadataChanged_notTriggeredHere_noDialog() { FeatureFlagUtils.setEnabled( mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); when(mBtnView.isEnabled()).thenReturn(true); when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1)); - when(mState.getBroadcastId()).thenReturn(1); - when(mBroadcast.getLatestBroadcastId()).thenReturn(1); - when(mAssistant.getAllSources(mDevice2)).thenReturn(ImmutableList.of(mState)); + when(mAssistant.getAllSources(any(BluetoothDevice.class))).thenReturn(ImmutableList.of()); when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata); doNothing().when(mBroadcast).startPrivateBroadcast(); - mController.onCheckedChanged(mBtnView, /* isChecked= */ true); - shadowOf(Looper.getMainLooper()).idle(); - - verify(mBroadcast).startPrivateBroadcast(); - List childFragments = mParentFragment.getChildFragmentManager().getFragments(); - assertThat(childFragments).comparingElementsUsing(CLAZZNAME_EQUALS).containsExactly( - AudioSharingProgressDialogFragment.class.getName()); mController.mBroadcastCallback.onBroadcastMetadataChanged(/* reason= */ 1, mMetadata); shadowOf(Looper.getMainLooper()).idle(); @@ -540,7 +531,7 @@ public class AudioSharingSwitchBarControllerTest { verify(mFeatureFactory.metricsFeatureProvider, never()) .action(any(Context.class), eq(SettingsEnums.ACTION_AUTO_JOIN_AUDIO_SHARING)); - childFragments = mParentFragment.getChildFragmentManager().getFragments(); + List childFragments = mParentFragment.getChildFragmentManager().getFragments(); // No audio sharing dialog. assertThat(childFragments).comparingElementsUsing(CLAZZNAME_EQUALS).doesNotContain( AudioSharingDialogFragment.class.getName()); @@ -613,7 +604,7 @@ public class AudioSharingSwitchBarControllerTest { } @Test - public void onBroadcastMetadataChanged_oneActiveOnConnected_showJoinAudioSharingDialog() { + public void onBroadcastMetadataChanged_oneActiveOneConnected_showJoinAudioSharingDialog() { FeatureFlagUtils.setEnabled( mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); when(mBtnView.isEnabled()).thenReturn(true); @@ -681,7 +672,7 @@ public class AudioSharingSwitchBarControllerTest { } @Test - public void onBroadcastMetadataChanged_oneActiveOnConnected_clickShareBtnOnDialog_addSource() { + public void onBroadcastMetadataChanged_oneActiveOneConnected_clickShareBtnOnDialog_addSource() { FeatureFlagUtils.setEnabled( mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); when(mBtnView.isEnabled()).thenReturn(true); @@ -722,7 +713,7 @@ public class AudioSharingSwitchBarControllerTest { } @Test - public void onBroadcastMetadataChanged_oneActiveOnConnected_clickCancelBtnOnDialog_doNothing() { + public void onBroadcastMetadataChanged_oneActiveOneConnected_clickCancelBtnOnDlg_doNothing() { FeatureFlagUtils.setEnabled( mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); when(mBtnView.isEnabled()).thenReturn(true); diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java index 6db008de223..b2a928e03e3 100644 --- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java @@ -29,7 +29,9 @@ import static org.mockito.Mockito.verify; import android.app.Activity; import android.app.admin.DevicePolicyManager; +import android.app.supervision.SupervisionManager; import android.content.ComponentName; +import android.content.Context; import android.content.pm.UserInfo; import android.os.Process; import android.os.UserHandle; @@ -49,14 +51,19 @@ import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowContextImpl; import org.robolectric.shadows.ShadowProcess; @RunWith(RobolectricTestRunner.class) @@ -66,19 +73,24 @@ import org.robolectric.shadows.ShadowProcess; ShadowActivity.class }) public class ActionDisabledByAdminDialogHelperTest { + @Rule public final MockitoRule mMocks = MockitoJUnit.rule(); + private static final ComponentName ADMIN_COMPONENT = new ComponentName("some.package.name", "some.package.name.SomeClass"); private static final int USER_ID = 123; private static final EnforcedAdmin ENFORCED_ADMIN = new EnforcedAdmin(ADMIN_COMPONENT, new UserHandle(USER_ID)); + + @Mock private SupervisionManager mSupervisionManager; + private ActionDisabledByAdminDialogHelper mHelper; private Activity mActivity; - private org.robolectric.shadows.ShadowActivity mActivityShadow; @Before public void setUp() { mActivity = Robolectric.setupActivity(CustomActivity.class); - mActivityShadow = Shadow.extract(mActivity); + ShadowContextImpl shadowContext = Shadow.extract(mActivity.getBaseContext()); + shadowContext.setSystemService(Context.SUPERVISION_SERVICE, mSupervisionManager); mHelper = new ActionDisabledByAdminDialogHelper(mActivity); } diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java index 2741212b23a..4de733972ce 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java @@ -26,6 +26,7 @@ import android.content.Context; import android.util.ArrayMap; import android.view.accessibility.AccessibilityManager; +import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; import org.robolectric.annotation.Implementation; @@ -96,8 +97,11 @@ public class ShadowAccessibilityManager extends org.robolectric.shadows.ShadowAc /** * Used by tests to easily write directly to a shortcut targets value */ - public void setAccessibilityShortcutTargets( - @UserShortcutType int shortcutType, List targets) { - mShortcutTargets.put(shortcutType, targets); + public void setAccessibilityShortcutTargets(int shortcutTypes, List targets) { + for (int type : ShortcutConstants.USER_SHORTCUT_TYPES) { + if ((type & shortcutTypes) == type) { + mShortcutTargets.put(type, List.copyOf(targets)); + } + } } } diff --git a/tests/unit/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java deleted file mode 100644 index fbc1a199d66..00000000000 --- a/tests/unit/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2020 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 android.view.flags.Flags.FLAG_ENABLE_VECTOR_CURSOR_A11Y_SETTINGS; - -import static com.android.settings.accessibility.LargePointerIconPreferenceController.OFF; -import static com.android.settings.accessibility.LargePointerIconPreferenceController.ON; - -import static com.google.common.truth.Truth.assertThat; - -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 android.provider.Settings; - -import androidx.preference.SwitchPreference; -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import com.android.settings.core.BasePreferenceController; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -public class LargePointerIconPreferenceControllerTest { - - @Rule - public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); - - private static final int UNKNOWN = -1; - - private Context mContext; - private SwitchPreference mPreference; - private LargePointerIconPreferenceController mController; - - @Before - public void setUp() { - mContext = ApplicationProvider.getApplicationContext(); - mPreference = new SwitchPreference(mContext); - mController = new LargePointerIconPreferenceController(mContext, "large_pointer"); - } - - @Test - @RequiresFlagsDisabled(FLAG_ENABLE_VECTOR_CURSOR_A11Y_SETTINGS) - public void getAvailabilityStatus_shouldReturnAvailable() { - assertThat(mController.getAvailabilityStatus()) - .isEqualTo(BasePreferenceController.AVAILABLE); - } - - @Test - @RequiresFlagsEnabled(FLAG_ENABLE_VECTOR_CURSOR_A11Y_SETTINGS) - public void getAvailabilityStatus_shouldReturnConditionallyUnavailable() { - assertThat(mController.getAvailabilityStatus()) - .isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE); - } - - @Test - public void isChecked_enabledLargePointer_shouldReturnTrue() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, ON); - - mController.updateState(mPreference); - - assertThat(mController.isChecked()).isTrue(); - assertThat(mPreference.isChecked()).isTrue(); - } - - @Test - public void isChecked_disabledLargePointer_shouldReturnFalse() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, OFF); - - mController.updateState(mPreference); - - assertThat(mController.isChecked()).isFalse(); - assertThat(mPreference.isChecked()).isFalse(); - } - - @Test - public void setChecked_enabled_shouldEnableLargePointer() { - mController.setChecked(true); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, UNKNOWN)).isEqualTo(ON); - } - - @Test - public void setChecked_disabled_shouldDisableLargePointer() { - mController.setChecked(false); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, UNKNOWN)).isEqualTo(OFF); - } -} diff --git a/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java b/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java index ad886879698..abc982db33c 100644 --- a/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java +++ b/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java @@ -32,12 +32,17 @@ import android.content.Intent; import android.content.res.Resources; import android.os.UserManager; import android.os.storage.StorageManager; +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 androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.internal.widget.LockPatternUtils; import com.android.settings.SettingsActivity; +import com.android.settings.flags.Flags; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.security.screenlock.ScreenLockSettings; import com.android.settings.testutils.FakeFeatureFactory; @@ -46,6 +51,7 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -58,6 +64,8 @@ public class ScreenLockPreferenceDetailsUtilsTest { private static final int SOURCE_METRICS_CATEGORY = 10; private static final int USER_ID = 11; + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Mock private LockPatternUtils mLockPatternUtils; @Mock @@ -267,14 +275,32 @@ public class ScreenLockPreferenceDetailsUtilsTest { } @Test - public void shouldShowGearMenu_patternIsSecure_shouldReturnTrue() { + @RequiresFlagsEnabled(Flags.FLAG_BIOMETRIC_ONBOARDING_EDUCATION) + public void shouldShowGearMenu_patternIsSecure_flagOn_shouldReturnFalse() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + + assertThat(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).isFalse(); + } + + @Test + @RequiresFlagsDisabled(Flags.FLAG_BIOMETRIC_ONBOARDING_EDUCATION) + public void shouldShowGearMenu_patternIsNotSecure_flagOff_shouldReturnFalse() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false); + + assertThat(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).isFalse(); + } + + @Test + @RequiresFlagsDisabled(Flags.FLAG_BIOMETRIC_ONBOARDING_EDUCATION) + public void shouldShowGearMenu_patternIsSecure_flagOff_shouldReturnTrue() { when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); assertThat(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).isTrue(); } @Test - public void shouldShowGearMenu_patternIsNotSecure_shouldReturnFalse() { + @RequiresFlagsEnabled(Flags.FLAG_BIOMETRIC_ONBOARDING_EDUCATION) + public void shouldShowGearMenu_patternIsNotSecure_flagOn_shouldReturnFalse() { when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false); assertThat(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).isFalse();