summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boot/preloaded-classes1
-rw-r--r--config/preloaded-classes1
-rw-r--r--core/api/current.txt4
-rw-r--r--core/api/system-current.txt1
-rw-r--r--core/api/test-current.txt6
-rw-r--r--core/java/android/app/Notification.java44
-rw-r--r--core/java/android/app/NotificationManager.java224
-rw-r--r--core/java/android/app/SystemServiceRegistry.java3
-rw-r--r--core/java/android/app/appfunctions/AppFunctionManager.java4
-rw-r--r--core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java17
-rw-r--r--core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java27
-rw-r--r--core/java/android/app/notification.aconfig7
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceManager.java6
-rw-r--r--core/java/android/content/EventLogTags.logtags2
-rw-r--r--core/java/android/content/Intent.java10
-rw-r--r--core/java/android/content/pm/parsing/ApkLiteParseUtils.java3
-rw-r--r--core/java/android/content/res/flags.aconfig8
-rw-r--r--core/java/android/content/res/loader/ResourcesProvider.java5
-rw-r--r--core/java/android/credentials/flags.aconfig10
-rw-r--r--core/java/android/credentials/selection/IntentFactory.java88
-rw-r--r--core/java/android/hardware/contexthub/HubEndpoint.java8
-rw-r--r--core/java/android/inputmethodservice/InputMethodService.java9
-rw-r--r--core/java/android/net/http/X509TrustManagerExtensions.java4
-rw-r--r--core/java/android/os/CombinedMessageQueue/MessageQueue.java15
-rw-r--r--core/java/android/os/ConcurrentMessageQueue/MessageQueue.java24
-rw-r--r--core/java/android/os/EventLogTags.logtags2
-rw-r--r--core/java/android/os/IHintManager.aidl34
-rw-r--r--core/java/android/os/LegacyMessageQueue/MessageQueue.java4
-rw-r--r--core/java/android/os/UserManager.java6
-rw-r--r--core/java/android/permission/flags.aconfig2
-rw-r--r--core/java/android/service/notification/RateEstimator.java (renamed from services/core/java/com/android/server/notification/RateEstimator.java)8
-rw-r--r--core/java/android/view/Display.java15
-rw-r--r--core/java/android/view/EventLogTags.logtags4
-rw-r--r--core/java/android/view/View.java30
-rw-r--r--core/java/android/view/ViewRootImpl.java6
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java2
-rw-r--r--core/java/android/widget/RemoteViews.java2
-rw-r--r--core/java/android/window/WindowContainerTransaction.java115
-rw-r--r--core/java/android/window/flags/lse_desktop_experience.aconfig28
-rw-r--r--core/java/android/window/flags/windowing_frontend.aconfig11
-rw-r--r--core/java/com/android/internal/app/EventLogTags.logtags2
-rw-r--r--core/java/com/android/internal/content/om/OverlayManagerImpl.java14
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodDebug.java6
-rw-r--r--core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java28
-rw-r--r--core/java/com/android/internal/logging/EventLogTags.logtags2
-rw-r--r--core/java/com/android/internal/policy/KeyInterceptionInfo.java4
-rw-r--r--core/java/com/android/internal/widget/CallLayout.java3
-rw-r--r--core/java/com/android/internal/widget/ConversationLayout.java69
-rw-r--r--core/java/org/chromium/arc/EventLogTags.logtags2
-rw-r--r--core/jni/Android.bp2
-rw-r--r--core/res/res/color-watch-v36/btn_material_filled_background_color.xml4
-rw-r--r--core/res/res/color-watch-v36/btn_material_filled_content_color.xml4
-rw-r--r--core/res/res/color-watch-v36/btn_material_filled_tonal_background_color.xml4
-rw-r--r--core/res/res/color-watch-v36/btn_material_filled_tonal_content_color.xml4
-rw-r--r--core/res/res/color-watch-v36/btn_material_outlined_background_color.xml4
-rw-r--r--core/res/res/color/input_method_switch_on_item.xml4
-rw-r--r--core/res/res/color/notification_expand_button_state_tint.xml4
-rw-r--r--core/res/res/color/system_on_surface_disabled.xml2
-rw-r--r--core/res/res/color/system_outline_disabled.xml2
-rw-r--r--core/res/res/color/system_surface_disabled.xml2
-rw-r--r--core/res/res/drawable-watch-v36/progress_ring_wear_material3.xml4
-rw-r--r--core/res/res/drawable/floating_popup_background.xml2
-rw-r--r--core/res/res/drawable/immersive_cling_bg.xml2
-rw-r--r--core/res/res/drawable/input_method_switch_button.xml2
-rw-r--r--core/res/res/drawable/input_method_switch_item_background.xml2
-rw-r--r--core/res/res/layout/floating_popup_menu_button.xml2
-rw-r--r--core/res/res/layout/floating_popup_overflow_button.xml2
-rw-r--r--core/res/res/layout/immersive_mode_cling.xml6
-rw-r--r--core/res/res/layout/input_method_switch_item_divider.xml2
-rw-r--r--core/res/res/layout/input_method_switch_item_header.xml2
-rw-r--r--core/res/res/layout/input_method_switch_item_new.xml2
-rw-r--r--core/res/res/layout/notification_2025_conversation_face_pile_layout.xml12
-rw-r--r--core/res/res/layout/notification_2025_conversation_header.xml171
-rw-r--r--core/res/res/layout/notification_2025_conversation_icon_container.xml37
-rw-r--r--core/res/res/layout/notification_2025_template_collapsed_call.xml4
-rw-r--r--core/res/res/layout/notification_2025_template_conversation.xml6
-rw-r--r--core/res/res/layout/notification_2025_template_expanded_call.xml6
-rw-r--r--core/res/res/layout/notification_2025_text.xml1
-rw-r--r--core/res/res/values-watch/themes_device_defaults.xml50
-rw-r--r--core/res/res/values/attrs.xml172
-rw-r--r--core/res/res/values/attrs_manifest.xml4
-rw-r--r--core/res/res/values/config.xml4
-rw-r--r--core/res/res/values/dimens.xml14
-rw-r--r--core/res/res/values/symbols.xml139
-rw-r--r--core/res/res/values/themes_device_defaults.xml4418
-rw-r--r--core/tests/coretests/src/android/app/NotificationManagerTest.java151
-rw-r--r--core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java2
-rw-r--r--core/tests/coretests/src/android/view/ViewGroupTest.java42
-rw-r--r--core/tests/overlaytests/device_self_targeting/Android.bp1
-rw-r--r--core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java21
-rw-r--r--core/tests/overlaytests/host/Android.bp18
-rw-r--r--libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml2
-rw-r--r--libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml2
-rw-r--r--libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml4
-rw-r--r--libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml25
-rw-r--r--libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_or_maximize_exit_button_dark.xml (renamed from libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml)4
-rw-r--r--libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml4
-rw-r--r--libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml4
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml4
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml2
-rw-r--r--libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml2
-rw-r--r--libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml6
-rw-r--r--libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml2
-rw-r--r--libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml4
-rw-r--r--libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml6
-rw-r--r--libs/WindowManager/Shell/res/layout/bubble_flyout.xml4
-rw-r--r--libs/WindowManager/Shell/res/layout/bubble_manage_button.xml2
-rw-r--r--libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml6
-rw-r--r--libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml24
-rw-r--r--libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml6
-rw-r--r--libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml2
-rw-r--r--libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml4
-rw-r--r--libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml6
-rw-r--r--libs/WindowManager/Shell/res/values/colors.xml2
-rw-r--r--libs/WindowManager/Shell/res/values/styles.xml12
-rw-r--r--libs/WindowManager/Shell/shared/Android.bp2
-rw-r--r--libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/Utils.java46
-rw-r--r--libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java28
-rw-r--r--libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java40
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt9
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java11
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java35
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt15
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java12
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java14
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java16
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java16
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java56
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitSpec.java183
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java18
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java10
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt234
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt43
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt7
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt30
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java48
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt7
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java19
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java13
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt79
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java8
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS8
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt35
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt58
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt68
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt39
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt39
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt123
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt39
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt14
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt9
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageOrderOperatorTests.kt144
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt1
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt53
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java64
-rw-r--r--media/java/android/media/IMediaRoute2ProviderService.aidl17
-rw-r--r--media/java/android/media/MediaRoute2Info.java11
-rw-r--r--media/java/android/media/MediaRoute2ProviderService.java258
-rw-r--r--native/android/performance_hint.cpp116
-rw-r--r--native/android/tests/performance_hint/PerformanceHintNativeTest.cpp35
-rw-r--r--packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml2
-rw-r--r--packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml2
-rw-r--r--packages/CredentialManager/res/drawable/more_options_list_item.xml4
-rw-r--r--packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml4
-rw-r--r--packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml6
-rw-r--r--packages/CredentialManager/res/values/colors.xml8
-rw-r--r--packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java20
-rw-r--r--packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml2
-rw-r--r--packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml2
-rw-r--r--packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml2
-rw-r--r--packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml2
-rw-r--r--packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml5
-rw-r--r--packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml5
-rw-r--r--packages/SettingsLib/CardPreference/res/values/styles_expressive.xml6
-rw-r--r--packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml25
-rw-r--r--packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml2
-rw-r--r--packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml6
-rw-r--r--packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml2
-rw-r--r--packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml1
-rw-r--r--packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java31
-rw-r--r--packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt21
-rw-r--r--packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt4
-rw-r--r--packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt12
-rw-r--r--packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt15
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant12.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant17.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant22.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant24.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant4.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant6.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant87.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant92.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant94.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant96.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant98.xml20
-rw-r--r--packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_check.xml (renamed from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_check.xml)0
-rw-r--r--packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_close.xml (renamed from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_close.xml)0
-rw-r--r--packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_switch_thumb_icon.xml (renamed from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_switch_thumb_icon.xml)0
-rw-r--r--packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml2
-rw-r--r--packages/SettingsLib/SettingsTheme/res/layout/settingslib_expressive_preference_text_frame.xml (renamed from packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml)6
-rw-r--r--packages/SettingsLib/SettingsTheme/res/layout/settingslib_preference_category_no_title.xml (renamed from packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml)0
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml35
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml35
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml33
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-night/colors.xml53
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml47
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v31/config.xml2
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml129
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v33/styles_expressive.xml306
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml47
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml45
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml275
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml4
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values/attrs_expressive.xml (renamed from packages/SettingsLib/SettingsTheme/res/values-v35/attrs_expressive.xml)0
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values/colors.xml79
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values/config.xml3
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values/dimens_expressive.xml (renamed from packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml)0
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml253
-rw-r--r--packages/SettingsLib/Spa/build.gradle.kts22
-rw-r--r--packages/SettingsLib/Spa/gallery/build.gradle.kts1
-rw-r--r--packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt21
-rw-r--r--packages/SettingsLib/Spa/gradle/libs.versions.toml8
-rw-r--r--packages/SettingsLib/Spa/spa/build.gradle.kts6
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt70
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt6
-rw-r--r--packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt4
-rw-r--r--packages/SettingsLib/Spa/testutils/build.gradle.kts4
-rw-r--r--packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/AmbientVolumeController.java415
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java9
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java3
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java8
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java36
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java23
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java140
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java148
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java318
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java17
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java9
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java13
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java8
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java1
-rw-r--r--packages/SystemUI/aconfig/systemui.aconfig10
-rw-r--r--packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt9
-rw-r--r--packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt14
-rw-r--r--packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt48
-rw-r--r--packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt2
-rw-r--r--packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt82
-rw-r--r--packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt76
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt2
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt57
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt52
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt15
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt23
-rw-r--r--packages/SystemUI/lint-baseline.xml9
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java8
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java26
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java3
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java8
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java8
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt3
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt19
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/OWNERS3
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt17
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt11
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt14
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt18
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt164
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt18
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt55
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt38
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt145
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt31
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt19
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt7
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java379
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt385
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt135
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt146
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt14
-rw-r--r--packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml2
-rw-r--r--packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml2
-rw-r--r--packages/SystemUI/res-keyguard/drawable/progress_bar.xml2
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml4
-rw-r--r--packages/SystemUI/res-keyguard/values/styles.xml8
-rw-r--r--packages/SystemUI/res/color/connected_network_primary_color.xml2
-rw-r--r--packages/SystemUI/res/color/disconnected_network_primary_color.xml2
-rw-r--r--packages/SystemUI/res/color/menu_item_text.xml4
-rw-r--r--packages/SystemUI/res/color/notification_focus_overlay_color.xml2
-rw-r--r--packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml2
-rw-r--r--packages/SystemUI/res/color/notification_guts_priority_contents.xml2
-rw-r--r--packages/SystemUI/res/color/notification_state_color_default.xml4
-rw-r--r--packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml4
-rw-r--r--packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml4
-rw-r--r--packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml4
-rw-r--r--packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml4
-rw-r--r--packages/SystemUI/res/color/qs_dialog_btn_outline.xml4
-rw-r--r--packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml4
-rw-r--r--packages/SystemUI/res/color/remote_input_hint.xml2
-rw-r--r--packages/SystemUI/res/color/remote_input_send.xml4
-rw-r--r--packages/SystemUI/res/color/remote_input_text.xml4
-rw-r--r--packages/SystemUI/res/color/screenshare_options_spinner_background.xml4
-rw-r--r--packages/SystemUI/res/color/slider_active_track_color.xml4
-rw-r--r--packages/SystemUI/res/color/slider_inactive_track_color.xml4
-rw-r--r--packages/SystemUI/res/color/slider_thumb_color.xml4
-rw-r--r--packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml4
-rw-r--r--packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml4
-rw-r--r--packages/SystemUI/res/drawable/action_chip_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/action_chip_container_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/brightness_bar.xml2
-rw-r--r--packages/SystemUI/res/drawable/brightness_progress_drawable.xml2
-rw-r--r--packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/chipbar_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/chipbar_end_button_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml2
-rw-r--r--packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml2
-rw-r--r--packages/SystemUI/res/drawable/ic_shortcutlist_search.xml2
-rw-r--r--packages/SystemUI/res/drawable/immersive_cling_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/notif_footer_btn_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/notification_guts_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/notification_material_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/overlay_border.xml2
-rw-r--r--packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml4
-rw-r--r--packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml4
-rw-r--r--packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/qs_tile_focused_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/remote_input_view_text_bg.xml4
-rw-r--r--packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/screenshot_edit_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml2
-rw-r--r--packages/SystemUI/res/drawable/settingslib_thumb_on.xml2
-rw-r--r--packages/SystemUI/res/drawable/settingslib_track_on_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/shelf_action_chip_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/shortcut_button_colored.xml2
-rw-r--r--packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml2
-rw-r--r--packages/SystemUI/res/drawable/shortcut_search_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml2
-rw-r--r--packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml2
-rw-r--r--packages/SystemUI/res/drawable/volume_background_top.xml2
-rw-r--r--packages/SystemUI/res/drawable/volume_dialog_background.xml2
-rw-r--r--packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml2
-rw-r--r--packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/volume_ringer_item_bg.xml2
-rw-r--r--packages/SystemUI/res/drawable/volume_row_seekbar.xml2
-rw-r--r--packages/SystemUI/res/layout/alert_dialog_title_systemui.xml2
-rw-r--r--packages/SystemUI/res/layout/app_clips_screenshot.xml10
-rw-r--r--packages/SystemUI/res/layout/bundle_notification_info.xml4
-rw-r--r--packages/SystemUI/res/layout/chipbar.xml8
-rw-r--r--packages/SystemUI/res/layout/clipboard_edit_text_activity.xml4
-rw-r--r--packages/SystemUI/res/layout/clipboard_overlay.xml4
-rw-r--r--packages/SystemUI/res/layout/connected_display_dialog.xml4
-rw-r--r--packages/SystemUI/res/layout/contextual_edu_dialog.xml5
-rw-r--r--packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml2
-rw-r--r--packages/SystemUI/res/layout/immersive_mode_cling.xml6
-rw-r--r--packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml2
-rw-r--r--packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml2
-rw-r--r--packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml2
-rw-r--r--packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml2
-rw-r--r--packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml4
-rw-r--r--packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml4
-rw-r--r--packages/SystemUI/res/layout/long_screenshot.xml24
-rw-r--r--packages/SystemUI/res/layout/notif_half_shelf.xml2
-rw-r--r--packages/SystemUI/res/layout/notif_half_shelf_row.xml4
-rw-r--r--packages/SystemUI/res/layout/notification_2025_footer.xml (renamed from packages/SystemUI/res/layout/status_bar_notification_footer_redesign.xml)2
-rw-r--r--packages/SystemUI/res/layout/notification_children_divider.xml2
-rw-r--r--packages/SystemUI/res/layout/notification_conversation_info.xml2
-rw-r--r--packages/SystemUI/res/layout/notification_info.xml4
-rw-r--r--packages/SystemUI/res/layout/notification_snooze.xml4
-rw-r--r--packages/SystemUI/res/layout/notification_snooze_option.xml2
-rw-r--r--packages/SystemUI/res/layout/privacy_dialog_item_v2.xml2
-rw-r--r--packages/SystemUI/res/layout/privacy_dialog_v2.xml2
-rw-r--r--packages/SystemUI/res/layout/record_issue_dialog.xml4
-rw-r--r--packages/SystemUI/res/layout/screen_share_dialog.xml2
-rw-r--r--packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml2
-rw-r--r--packages/SystemUI/res/layout/screenshot_shelf.xml4
-rw-r--r--packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml4
-rw-r--r--packages/SystemUI/res/layout/shelf_action_chip.xml4
-rw-r--r--packages/SystemUI/res/layout/volume_dialog.xml4
-rw-r--r--packages/SystemUI/res/layout/volume_ringer_button.xml2
-rw-r--r--packages/SystemUI/res/values-land/styles.xml6
-rw-r--r--packages/SystemUI/res/values-sw600dp-land/styles.xml6
-rw-r--r--packages/SystemUI/res/values-sw600dp-port/styles.xml2
-rw-r--r--packages/SystemUI/res/values-sw720dp-land/styles.xml6
-rw-r--r--packages/SystemUI/res/values-sw720dp-port/styles.xml2
-rw-r--r--packages/SystemUI/res/values/colors.xml2
-rw-r--r--packages/SystemUI/res/values/strings.xml15
-rw-r--r--packages/SystemUI/res/values/styles.xml145
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java5
-rw-r--r--packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt5
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java8
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java17
-rw-r--r--packages/SystemUI/src/com/android/keyguard/NumPadButton.java3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/NumPadKey.java3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java4
-rw-r--r--packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt12
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt21
-rw-r--r--packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt11
-rw-r--r--packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt18
-rw-r--r--packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt26
-rw-r--r--packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt21
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/shortcut/OWNERS3
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt15
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt67
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt26
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt24
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt19
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt103
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt11
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt31
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt41
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt125
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt95
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt19
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt43
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt35
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt37
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt28
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt24
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt36
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt113
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileContentDescriptionViewBinder.kt30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/model/MobileContentDescription.kt43
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt68
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt36
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt28
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt44
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt30
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java11
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt4
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt13
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt4
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt4
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt7
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt45
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt21
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt9
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt7
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt18
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt58
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt23
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt44
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt2
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt2
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt10
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt2
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt6
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt14
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt31
-rw-r--r--packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt22
-rw-r--r--packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt24
-rw-r--r--services/appfunctions/Android.bp8
-rw-r--r--services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java7
-rw-r--r--services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java31
-rw-r--r--services/appfunctions/java/com/android/server/appfunctions/AppFunctionsLoggerWrapper.java74
-rw-r--r--services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java2
-rw-r--r--services/autofill/bugfixes.aconfig10
-rw-r--r--services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java45
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java51
-rw-r--r--services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java11
-rw-r--r--services/core/java/com/android/server/GestureLauncherService.java309
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java6
-rw-r--r--services/core/java/com/android/server/am/SettingsToPropertiesMapper.java1
-rw-r--r--services/core/java/com/android/server/audio/AudioDeviceInventory.java4
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java33
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java11
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java7
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerProximityStateController.java57
-rw-r--r--services/core/java/com/android/server/display/LogicalDisplayMapper.java8
-rw-r--r--services/core/java/com/android/server/display/VirtualDisplayAdapter.java24
-rw-r--r--services/core/java/com/android/server/display/feature/DisplayManagerFlags.java9
-rw-r--r--services/core/java/com/android/server/display/mode/DisplayModeDirector.java5
-rw-r--r--services/core/java/com/android/server/display/mode/ModeChangeObserver.java108
-rw-r--r--services/core/java/com/android/server/display/mode/RejectedModesVote.java40
-rw-r--r--services/core/java/com/android/server/display/mode/Vote.java43
-rw-r--r--services/core/java/com/android/server/display/mode/VoteSummary.java26
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java4
-rw-r--r--services/core/java/com/android/server/hdmi/OneTouchPlayAction.java3
-rw-r--r--services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java19
-rw-r--r--services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java17
-rw-r--r--services/core/java/com/android/server/media/quality/MediaQualityService.java104
-rw-r--r--services/core/java/com/android/server/media/quality/OWNERS3
-rw-r--r--services/core/java/com/android/server/notification/NotificationUsageStats.java1
-rw-r--r--services/core/java/com/android/server/pm/InstallDependencyHelper.java23
-rw-r--r--services/core/java/com/android/server/pm/InstallRequest.java16
-rw-r--r--services/core/java/com/android/server/pm/InstallingSession.java9
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java38
-rw-r--r--services/core/java/com/android/server/pm/PackageMetrics.java55
-rw-r--r--services/core/java/com/android/server/pm/VerifyingSession.java7
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java233
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java4
-rw-r--r--services/core/java/com/android/server/power/hint/HintManagerService.java59
-rw-r--r--services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java43
-rw-r--r--services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java14
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java43
-rw-r--r--services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java4
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java21
-rw-r--r--services/core/java/com/android/server/wm/DisplayWindowSettings.java6
-rw-r--r--services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java3
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java75
-rw-r--r--services/core/java/com/android/server/wm/TaskFragment.java207
-rw-r--r--services/core/java/com/android/server/wm/Transition.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerConstants.java34
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java106
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java5
-rw-r--r--services/core/jni/com_android_server_am_Freezer.cpp2
-rw-r--r--services/credentials/java/com/android/server/credentials/CredentialManagerUi.java6
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java2
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java20
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java20
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/RejectedModesVoteTest.kt58
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt38
-rw-r--r--services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java19
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java31
-rw-r--r--services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java98
-rw-r--r--services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java205
-rw-r--r--services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java8
-rw-r--r--services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java12
-rw-r--r--services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java28
-rw-r--r--services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java560
-rw-r--r--services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java55
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java216
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java2
-rw-r--r--services/tests/wmtests/res/xml/bookmarks.xml2
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java158
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java26
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java105
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java12
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java37
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java232
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java94
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TransitionTests.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java45
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java19
-rw-r--r--telephony/java/android/telephony/Annotation.java1
-rw-r--r--telephony/java/android/telephony/CellIdentityCdma.java70
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthCdma.java29
-rw-r--r--telephony/java/android/telephony/RadioAccessFamily.java9
-rw-r--r--telephony/java/android/telephony/ServiceState.java26
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java45
-rw-r--r--telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java13
-rw-r--r--tests/Input/src/com/android/server/input/InputManagerServiceTests.kt3
661 files changed, 10848 insertions, 10106 deletions
diff --git a/boot/preloaded-classes b/boot/preloaded-classes
index a696e03d5bdf..afd9984cb124 100644
--- a/boot/preloaded-classes
+++ b/boot/preloaded-classes
@@ -6469,6 +6469,7 @@ android.os.connectivity.WifiActivityEnergyInfo$1
android.os.connectivity.WifiActivityEnergyInfo
android.os.connectivity.WifiBatteryStats$1
android.os.connectivity.WifiBatteryStats
+android.os.flagging.AconfigPackage
android.os.health.HealthKeys$Constant
android.os.health.HealthKeys$Constants
android.os.health.HealthKeys$SortedIntArray
diff --git a/config/preloaded-classes b/config/preloaded-classes
index ed402767ee64..343de0bf3b98 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -6473,6 +6473,7 @@ android.os.connectivity.WifiActivityEnergyInfo$1
android.os.connectivity.WifiActivityEnergyInfo
android.os.connectivity.WifiBatteryStats$1
android.os.connectivity.WifiBatteryStats
+android.os.flagging.AconfigPackage
android.os.health.HealthKeys$Constant
android.os.health.HealthKeys$Constants
android.os.health.HealthKeys$SortedIntArray
diff --git a/core/api/current.txt b/core/api/current.txt
index 5efa74779c06..3821b8a5c307 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -29956,7 +29956,7 @@ package android.net.http {
public class X509TrustManagerExtensions {
ctor public X509TrustManagerExtensions(javax.net.ssl.X509TrustManager) throws java.lang.IllegalArgumentException;
method public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(java.security.cert.X509Certificate[], String, String) throws java.security.cert.CertificateException;
- method @FlaggedApi("android.net.platform.flags.x509_extensions_certificate_transparency") @NonNull public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(@NonNull java.security.cert.X509Certificate[], @Nullable byte[], @Nullable byte[], @NonNull String, @NonNull String) throws java.security.cert.CertificateException;
+ method @FlaggedApi("android.security.certificate_transparency_configuration") @NonNull public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(@NonNull java.security.cert.X509Certificate[], @Nullable byte[], @Nullable byte[], @NonNull String, @NonNull String) throws java.security.cert.CertificateException;
method public boolean isSameTrustConfiguration(String, String);
method public boolean isUserAddedCertificate(java.security.cert.X509Certificate);
}
@@ -47463,7 +47463,6 @@ package android.telephony {
field public static final long NETWORK_TYPE_BITMASK_IWLAN = 131072L; // 0x20000L
field public static final long NETWORK_TYPE_BITMASK_LTE = 4096L; // 0x1000L
field @Deprecated public static final long NETWORK_TYPE_BITMASK_LTE_CA = 262144L; // 0x40000L
- field @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") public static final long NETWORK_TYPE_BITMASK_NB_IOT_NTN = 1048576L; // 0x100000L
field public static final long NETWORK_TYPE_BITMASK_NR = 524288L; // 0x80000L
field public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = 65536L; // 0x10000L
field public static final long NETWORK_TYPE_BITMASK_UMTS = 4L; // 0x4L
@@ -47483,7 +47482,6 @@ package android.telephony {
field @Deprecated public static final int NETWORK_TYPE_IDEN = 11; // 0xb
field public static final int NETWORK_TYPE_IWLAN = 18; // 0x12
field public static final int NETWORK_TYPE_LTE = 13; // 0xd
- field @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") public static final int NETWORK_TYPE_NB_IOT_NTN = 21; // 0x15
field public static final int NETWORK_TYPE_NR = 20; // 0x14
field public static final int NETWORK_TYPE_TD_SCDMA = 17; // 0x11
field public static final int NETWORK_TYPE_UMTS = 3; // 0x3
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 9590e1ab19c9..e5dcc7d8ba7f 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -5088,6 +5088,7 @@ package android.hardware.contexthub {
field public static final int REASON_ENDPOINT_STOPPED = 6; // 0x6
field public static final int REASON_FAILURE = 0; // 0x0
field public static final int REASON_OPEN_ENDPOINT_SESSION_REQUEST_REJECTED = 3; // 0x3
+ field public static final int REASON_PERMISSION_DENIED = 9; // 0x9
}
public static final class HubEndpoint.Builder {
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 6230a59a62c0..8594caee32c5 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1402,9 +1402,9 @@ package android.credentials.selection {
method @NonNull public android.credentials.selection.GetCredentialProviderData.Builder setRemoteEntry(@Nullable android.credentials.selection.Entry);
}
- @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public class IntentFactory {
- method @NonNull public static android.content.Intent createCancelUiIntent(@NonNull android.content.Context, @NonNull android.os.IBinder, boolean, @NonNull String);
- method @NonNull public static android.content.Intent createCredentialSelectorIntent(@NonNull android.content.Context, @NonNull android.credentials.selection.RequestInfo, @NonNull java.util.ArrayList<android.credentials.selection.ProviderData>, @NonNull java.util.ArrayList<android.credentials.selection.DisabledProviderData>, @NonNull android.os.ResultReceiver);
+ @FlaggedApi("android.credentials.flags.propagate_user_context_for_intent_creation") public class IntentFactory {
+ method @NonNull public static android.content.Intent createCancelUiIntent(@NonNull android.content.Context, @NonNull android.os.IBinder, boolean, @NonNull String, int);
+ method @NonNull public static android.content.Intent createCredentialSelectorIntent(@NonNull android.content.Context, @NonNull android.credentials.selection.RequestInfo, @NonNull java.util.ArrayList<android.credentials.selection.ProviderData>, @NonNull java.util.ArrayList<android.credentials.selection.DisabledProviderData>, @NonNull android.os.ResultReceiver, int);
}
@FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public abstract class ProviderData implements android.os.Parcelable {
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 7e998d90e04f..aa2ada5372af 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -6024,8 +6024,9 @@ public class Notification implements Parcelable
/**
* @param isHeader If the notification is a notification header
* @return An instance of mColors after resolving the palette
+ * @hide
*/
- private Colors getColors(boolean isHeader) {
+ public Colors getColors(boolean isHeader) {
mColors.resolvePalette(mContext, mN.color, !isHeader && mN.isColorized(), mInNightMode);
return mColors;
}
@@ -14765,7 +14766,6 @@ public class Notification implements Parcelable
* A utility which stores and calculates the palette of colors used to color notifications.
* @hide
*/
- @VisibleForTesting
public static class Colors {
private int mPaletteIsForRawColor = COLOR_INVALID;
private boolean mPaletteIsForColorized = false;
@@ -14839,10 +14839,7 @@ public class Notification implements Parcelable
if (isColorized) {
if (rawColor == COLOR_DEFAULT) {
- int[] attrs = {R.attr.materialColorSecondary};
- try (TypedArray ta = obtainDayNightAttributes(ctx, attrs)) {
- mBackgroundColor = getColor(ta, 0, Color.WHITE);
- }
+ mBackgroundColor = ctx.getColor(R.color.materialColorSecondary);
} else {
mBackgroundColor = rawColor;
}
@@ -14874,30 +14871,25 @@ public class Notification implements Parcelable
mRippleAlpha = 0x33;
} else {
int[] attrs = {
- R.attr.materialColorSurfaceContainerHigh,
- R.attr.materialColorOnSurface,
- R.attr.materialColorOnSurfaceVariant,
- R.attr.materialColorPrimary,
- R.attr.materialColorSecondary,
- R.attr.materialColorTertiary,
- R.attr.materialColorOnTertiary,
- R.attr.materialColorTertiaryFixedDim,
- R.attr.materialColorOnTertiaryFixed,
R.attr.colorError,
R.attr.colorControlHighlight
};
+
+ mBackgroundColor = ctx.getColor(R.color.materialColorSurfaceContainerHigh);
+ mPrimaryTextColor = ctx.getColor(R.color.materialColorOnSurface);
+ mSecondaryTextColor = ctx.getColor(R.color.materialColorOnSurfaceVariant);
+ mPrimaryAccentColor = ctx.getColor(R.color.materialColorPrimary);
+ mSecondaryAccentColor = ctx.getColor(R.color.materialColorSecondary);
+ mTertiaryAccentColor = ctx.getColor(R.color.materialColorTertiary);
+ mOnTertiaryAccentTextColor = ctx.getColor(R.color.materialColorOnTertiary);
+ mTertiaryFixedDimAccentColor = ctx.getColor(
+ R.color.materialColorTertiaryFixedDim);
+ mOnTertiaryFixedAccentTextColor = ctx.getColor(
+ R.color.materialColorOnTertiaryFixed);
+
try (TypedArray ta = obtainDayNightAttributes(ctx, attrs)) {
- mBackgroundColor = getColor(ta, 0, nightMode ? Color.BLACK : Color.WHITE);
- mPrimaryTextColor = getColor(ta, 1, COLOR_INVALID);
- mSecondaryTextColor = getColor(ta, 2, COLOR_INVALID);
- mPrimaryAccentColor = getColor(ta, 3, COLOR_INVALID);
- mSecondaryAccentColor = getColor(ta, 4, COLOR_INVALID);
- mTertiaryAccentColor = getColor(ta, 5, COLOR_INVALID);
- mOnTertiaryAccentTextColor = getColor(ta, 6, COLOR_INVALID);
- mTertiaryFixedDimAccentColor = getColor(ta, 7, COLOR_INVALID);
- mOnTertiaryFixedAccentTextColor = getColor(ta, 8, COLOR_INVALID);
- mErrorColor = getColor(ta, 9, COLOR_INVALID);
- mRippleAlpha = Color.alpha(getColor(ta, 10, 0x33ffffff));
+ mErrorColor = getColor(ta, 0, COLOR_INVALID);
+ mRippleAlpha = Color.alpha(getColor(ta, 1, 0x33ffffff));
}
mContrastColor = calculateContrastColor(ctx, rawColor, mPrimaryAccentColor,
mBackgroundColor, nightMode);
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 87c861912036..8ed66eb7e6c0 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -49,7 +49,6 @@ import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
-import android.os.Handler;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
@@ -61,15 +60,18 @@ import android.provider.Settings;
import android.provider.Settings.Global;
import android.service.notification.Adjustment;
import android.service.notification.Condition;
+import android.service.notification.RateEstimator;
import android.service.notification.StatusBarNotification;
import android.service.notification.ZenDeviceEffects;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenPolicy;
import android.util.Log;
+import android.util.LruCache;
import android.util.proto.ProtoOutputStream;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.time.InstantSource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -643,9 +645,17 @@ public class NotificationManager {
*/
public static int MAX_SERVICE_COMPONENT_NAME_LENGTH = 500;
+ private static final float MAX_NOTIFICATION_ENQUEUE_RATE = 5f;
+
+ private final Context mContext;
private final Map<CallNotificationEventListener, CallNotificationEventCallbackStub>
mCallNotificationEventCallbacks = new HashMap<>();
+ private final InstantSource mClock;
+ private final RateEstimator mEnqueueRateEstimator = new RateEstimator();
+ private final LruCache<String, Boolean> mEnqueuedNotificationKeys = new LruCache<>(10);
+ private final Object mEnqueueThrottleLock = new Object();
+
@UnsupportedAppUsage
private static INotificationManager sService;
@@ -661,10 +671,17 @@ public class NotificationManager {
return sService;
}
+ /** @hide */
+ protected INotificationManager service() {
+ return getService();
+ }
+
+ /** {@hide} */
@UnsupportedAppUsage
- /*package*/ NotificationManager(Context context, Handler handler)
+ public NotificationManager(Context context, InstantSource clock)
{
mContext = context;
+ mClock = clock;
}
/** {@hide} */
@@ -736,7 +753,7 @@ public class NotificationManager {
*/
public void notifyAsPackage(@NonNull String targetPackage, @Nullable String tag, int id,
@NonNull Notification notification) {
- INotificationManager service = getService();
+ INotificationManager service = service();
String sender = mContext.getPackageName();
try {
@@ -752,13 +769,12 @@ public class NotificationManager {
* @hide
*/
@UnsupportedAppUsage
- public void notifyAsUser(String tag, int id, Notification notification, UserHandle user)
+ public void notifyAsUser(@Nullable String tag, int id, Notification notification,
+ UserHandle user)
{
- INotificationManager service = getService();
+ INotificationManager service = service();
String pkg = mContext.getPackageName();
-
- if (notificationClassification()
- && NotificationChannel.SYSTEM_RESERVED_IDS.contains(notification.getChannelId())) {
+ if (discardNotify(tag, id, notification)) {
return;
}
@@ -771,6 +787,37 @@ public class NotificationManager {
}
}
+ /**
+ * Determines whether a {@link #notify} call should be skipped. If the notification is not
+ * skipped, updates tracking metadata to use in future decisions.
+ */
+ private boolean discardNotify(@Nullable String tag, int id, Notification notification) {
+ if (notificationClassification()
+ && NotificationChannel.SYSTEM_RESERVED_IDS.contains(notification.getChannelId())) {
+ return true;
+ }
+
+ if (Flags.nmBinderPerfThrottleNotify()) {
+ String key = toEnqueuedNotificationKey(tag, id);
+ long now = mClock.millis();
+ synchronized (mEnqueueThrottleLock) {
+ if (mEnqueuedNotificationKeys.get(key) != null
+ && !notification.hasCompletedProgress()
+ && mEnqueueRateEstimator.getRate(now) > MAX_NOTIFICATION_ENQUEUE_RATE) {
+ return true;
+ }
+
+ mEnqueueRateEstimator.update(now);
+ mEnqueuedNotificationKeys.put(key, Boolean.TRUE);
+ }
+ }
+
+ return false;
+ }
+ private static String toEnqueuedNotificationKey(@Nullable String tag, int id) {
+ return tag + "," + id;
+ }
+
private Notification fixNotification(Notification notification) {
String pkg = mContext.getPackageName();
// Fix the notification as best we can.
@@ -852,7 +899,7 @@ public class NotificationManager {
* @param id An identifier for this notification.
*/
public void cancelAsPackage(@NonNull String targetPackage, @Nullable String tag, int id) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.cancelNotificationWithTag(targetPackage, mContext.getOpPackageName(),
tag, id, mContext.getUser().getIdentifier());
@@ -865,9 +912,15 @@ public class NotificationManager {
* @hide
*/
@UnsupportedAppUsage
- public void cancelAsUser(String tag, int id, UserHandle user)
+ public void cancelAsUser(@Nullable String tag, int id, UserHandle user)
{
- INotificationManager service = getService();
+ if (Flags.nmBinderPerfThrottleNotify()) {
+ synchronized (mEnqueueThrottleLock) {
+ mEnqueuedNotificationKeys.remove(toEnqueuedNotificationKey(tag, id));
+ }
+ }
+
+ INotificationManager service = service();
String pkg = mContext.getPackageName();
if (localLOGV) Log.v(TAG, pkg + ": cancel(" + id + ")");
try {
@@ -884,7 +937,13 @@ public class NotificationManager {
*/
public void cancelAll()
{
- INotificationManager service = getService();
+ if (Flags.nmBinderPerfThrottleNotify()) {
+ synchronized (mEnqueueThrottleLock) {
+ mEnqueuedNotificationKeys.evictAll();
+ }
+ }
+
+ INotificationManager service = service();
String pkg = mContext.getPackageName();
if (localLOGV) Log.v(TAG, pkg + ": cancelAll()");
try {
@@ -907,7 +966,7 @@ public class NotificationManager {
* @param delegate Package name of the app which can send notifications on your behalf.
*/
public void setNotificationDelegate(@Nullable String delegate) {
- INotificationManager service = getService();
+ INotificationManager service = service();
String pkg = mContext.getPackageName();
if (localLOGV) Log.v(TAG, pkg + ": cancelAll()");
try {
@@ -922,7 +981,7 @@ public class NotificationManager {
* your behalf, if there currently is one.
*/
public @Nullable String getNotificationDelegate() {
- INotificationManager service = getService();
+ INotificationManager service = service();
String pkg = mContext.getPackageName();
try {
return service.getNotificationDelegate(pkg);
@@ -938,7 +997,7 @@ public class NotificationManager {
* See {@link #setNotificationDelegate(String)}.
*/
public boolean canNotifyAsPackage(@NonNull String pkg) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.canNotifyAsPackage(mContext.getPackageName(), pkg, mContext.getUserId());
} catch (RemoteException e) {
@@ -956,7 +1015,7 @@ public class NotificationManager {
* {@link android.provider.Settings#ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT}.
*/
public boolean canUseFullScreenIntent() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.canUseFullScreenIntent(mContext.getAttributionSource());
} catch (RemoteException e) {
@@ -974,7 +1033,7 @@ public class NotificationManager {
*/
@FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
public boolean canPostPromotedNotifications() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.canBePromoted(mContext.getPackageName());
} catch (RemoteException e) {
@@ -989,7 +1048,7 @@ public class NotificationManager {
@TestApi
@FlaggedApi(android.app.Flags.FLAG_API_RICH_ONGOING)
public void setCanPostPromotedNotifications(@NonNull String pkg, int uid, boolean allowed) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setCanBePromoted(pkg, uid, allowed, true);
} catch (RemoteException e) {
@@ -1024,7 +1083,7 @@ public class NotificationManager {
* @param groups The list of groups to create
*/
public void createNotificationChannelGroups(@NonNull List<NotificationChannelGroup> groups) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.createNotificationChannelGroups(mContext.getPackageName(),
new ParceledListSlice(groups));
@@ -1067,7 +1126,7 @@ public class NotificationManager {
* @param channels the list of channels to attempt to create.
*/
public void createNotificationChannels(@NonNull List<NotificationChannel> channels) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.createNotificationChannels(mContext.getPackageName(),
new ParceledListSlice(channels));
@@ -1085,7 +1144,7 @@ public class NotificationManager {
* package (see {@link Context#createPackageContext(String, int)}).</p>
*/
public NotificationChannel getNotificationChannel(String channelId) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getNotificationChannel(mContext.getOpPackageName(),
mContext.getUserId(), mContext.getPackageName(), channelId);
@@ -1105,7 +1164,7 @@ public class NotificationManager {
*/
public @Nullable NotificationChannel getNotificationChannel(@NonNull String channelId,
@NonNull String conversationId) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getConversationNotificationChannel(mContext.getOpPackageName(),
mContext.getUserId(), mContext.getPackageName(), channelId, true,
@@ -1124,7 +1183,7 @@ public class NotificationManager {
* {@link Context#createPackageContext(String, int)}).</p>
*/
public List<NotificationChannel> getNotificationChannels() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getNotificationChannels(mContext.getOpPackageName(),
mContext.getPackageName(), mContext.getUserId()).getList();
@@ -1145,7 +1204,7 @@ public class NotificationManager {
&& NotificationChannel.SYSTEM_RESERVED_IDS.contains(channelId)) {
return;
}
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.deleteNotificationChannel(mContext.getPackageName(), channelId);
} catch (RemoteException e) {
@@ -1159,7 +1218,7 @@ public class NotificationManager {
* The channel group must belong to your package, or null will be returned.
*/
public NotificationChannelGroup getNotificationChannelGroup(String channelGroupId) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getNotificationChannelGroup(mContext.getPackageName(), channelGroupId);
} catch (RemoteException e) {
@@ -1171,7 +1230,7 @@ public class NotificationManager {
* Returns all notification channel groups belonging to the calling app.
*/
public List<NotificationChannelGroup> getNotificationChannelGroups() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
final ParceledListSlice<NotificationChannelGroup> parceledList =
service.getNotificationChannelGroups(mContext.getPackageName());
@@ -1189,7 +1248,7 @@ public class NotificationManager {
* belong to it.
*/
public void deleteNotificationChannelGroup(String groupId) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.deleteNotificationChannelGroup(mContext.getPackageName(), groupId);
} catch (RemoteException e) {
@@ -1203,7 +1262,7 @@ public class NotificationManager {
@TestApi
public void updateNotificationChannel(@NonNull String pkg, int uid,
@NonNull NotificationChannel channel) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.updateNotificationChannelForPackage(pkg, uid, channel);
} catch (RemoteException e) {
@@ -1216,7 +1275,7 @@ public class NotificationManager {
*/
@TestApi
public ComponentName getEffectsSuppressor() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getEffectsSuppressor();
} catch (RemoteException e) {
@@ -1228,7 +1287,7 @@ public class NotificationManager {
* @hide
*/
public boolean matchesCallFilter(Bundle extras) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.matchesCallFilter(extras);
} catch (RemoteException e) {
@@ -1241,7 +1300,7 @@ public class NotificationManager {
*/
@TestApi
public void cleanUpCallersAfter(long timeThreshold) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.cleanUpCallersAfter(timeThreshold);
} catch (RemoteException e) {
@@ -1253,7 +1312,7 @@ public class NotificationManager {
* @hide
*/
public boolean isSystemConditionProviderEnabled(String path) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.isSystemConditionProviderEnabled(path);
} catch (RemoteException e) {
@@ -1271,7 +1330,7 @@ public class NotificationManager {
/** @hide */
public void setZenMode(int mode, Uri conditionId, String reason, boolean fromUser) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setZenMode(mode, conditionId, reason, fromUser);
} catch (RemoteException e) {
@@ -1284,7 +1343,7 @@ public class NotificationManager {
* @hide
*/
public int getZenMode() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getZenMode();
} catch (RemoteException e) {
@@ -1297,7 +1356,7 @@ public class NotificationManager {
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public ZenModeConfig getZenModeConfig() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getZenModeConfig();
} catch (RemoteException e) {
@@ -1315,7 +1374,7 @@ public class NotificationManager {
* </p>
*/
public @NonNull NotificationManager.Policy getConsolidatedNotificationPolicy() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getConsolidatedNotificationPolicy();
} catch (RemoteException e) {
@@ -1327,7 +1386,7 @@ public class NotificationManager {
* @hide
*/
public int getRuleInstanceCount(ComponentName owner) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getRuleInstanceCount(owner);
} catch (RemoteException e) {
@@ -1364,7 +1423,7 @@ public class NotificationManager {
* See {@link #isNotificationPolicyAccessGranted}.
*/
public Map<String, AutomaticZenRule> getAutomaticZenRules() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
if (Flags.modesApi()) {
return service.getAutomaticZenRules();
@@ -1398,7 +1457,7 @@ public class NotificationManager {
* doesn't own the matching rule. See {@link AutomaticZenRule#getOwner}.
*/
public AutomaticZenRule getAutomaticZenRule(String id) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getAutomaticZenRule(id);
} catch (RemoteException e) {
@@ -1426,7 +1485,7 @@ public class NotificationManager {
@NonNull
public String addAutomaticZenRule(@NonNull AutomaticZenRule automaticZenRule,
boolean fromUser) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.addAutomaticZenRule(automaticZenRule,
mContext.getPackageName(), fromUser);
@@ -1461,7 +1520,7 @@ public class NotificationManager {
@FlaggedApi(Flags.FLAG_MODES_API)
public boolean updateAutomaticZenRule(@NonNull String id,
@NonNull AutomaticZenRule automaticZenRule, boolean fromUser) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.updateAutomaticZenRule(id, automaticZenRule, fromUser);
} catch (RemoteException e) {
@@ -1481,7 +1540,7 @@ public class NotificationManager {
@FlaggedApi(Flags.FLAG_MODES_API)
@Condition.State
public int getAutomaticZenRuleState(@NonNull String id) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getAutomaticZenRuleState(id);
} catch (RemoteException e) {
@@ -1527,7 +1586,7 @@ public class NotificationManager {
* @param condition The new state of this rule
*/
public void setAutomaticZenRuleState(@NonNull String id, @NonNull Condition condition) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setAutomaticZenRuleState(id, condition);
} catch (RemoteException e) {
@@ -1555,7 +1614,7 @@ public class NotificationManager {
@TestApi
@FlaggedApi(Flags.FLAG_MODES_API)
public boolean removeAutomaticZenRule(@NonNull String id, boolean fromUser) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.removeAutomaticZenRule(id, fromUser);
} catch (RemoteException e) {
@@ -1574,7 +1633,7 @@ public class NotificationManager {
/** @hide */
public boolean removeAutomaticZenRules(String packageName, boolean fromUser) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.removeAutomaticZenRules(packageName, fromUser);
} catch (RemoteException e) {
@@ -1587,7 +1646,7 @@ public class NotificationManager {
* package.
*/
public @Importance int getImportance() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getPackageImportance(mContext.getPackageName());
} catch (RemoteException e) {
@@ -1602,7 +1661,7 @@ public class NotificationManager {
if (Flags.nmBinderPerfPermissionCheck()) {
return mContext.checkSelfPermission(POST_NOTIFICATIONS) == PERMISSION_GRANTED;
} else {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.areNotificationsEnabled(mContext.getPackageName());
} catch (RemoteException e) {
@@ -1623,7 +1682,7 @@ public class NotificationManager {
*/
@Deprecated
public boolean areBubblesAllowed() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.areBubblesAllowed(mContext.getPackageName());
} catch (RemoteException e) {
@@ -1638,7 +1697,7 @@ public class NotificationManager {
* @see Notification.Builder#setBubbleMetadata(Notification.BubbleMetadata)
*/
public boolean areBubblesEnabled() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.areBubblesEnabled(mContext.getUser());
} catch (RemoteException e) {
@@ -1665,7 +1724,7 @@ public class NotificationManager {
* @return the users' bubble preference for the app.
*/
public @BubblePreference int getBubblePreference() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getBubblePreferenceForPackage(mContext.getPackageName(),
Binder.getCallingUid());
@@ -1685,7 +1744,7 @@ public class NotificationManager {
* @hide
*/
public void silenceNotificationSound() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.silenceNotificationSound();
} catch (RemoteException e) {
@@ -1701,7 +1760,7 @@ public class NotificationManager {
* PersistableBundle, SuspendDialogInfo) suspended}.
*/
public boolean areNotificationsPaused() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.isPackagePaused(mContext.getPackageName());
} catch (RemoteException e) {
@@ -1724,7 +1783,7 @@ public class NotificationManager {
* user grant or denial of this access.
*/
public boolean isNotificationPolicyAccessGranted() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.isNotificationPolicyAccessGranted(mContext.getOpPackageName());
} catch (RemoteException e) {
@@ -1745,7 +1804,7 @@ public class NotificationManager {
* {@link android.provider.Settings#ACTION_NOTIFICATION_LISTENER_SETTINGS}.
*/
public boolean isNotificationListenerAccessGranted(ComponentName listener) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.isNotificationListenerAccessGranted(listener);
} catch (RemoteException e) {
@@ -1769,7 +1828,7 @@ public class NotificationManager {
*/
@SystemApi
public boolean isNotificationAssistantAccessGranted(@NonNull ComponentName assistant) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.isNotificationAssistantAccessGranted(assistant);
} catch (RemoteException e) {
@@ -1785,7 +1844,7 @@ public class NotificationManager {
* listeners}.
*/
public boolean shouldHideSilentStatusBarIcons() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.shouldHideSilentStatusIcons(mContext.getOpPackageName());
} catch (RemoteException e) {
@@ -1804,7 +1863,7 @@ public class NotificationManager {
*/
@SystemApi
public @NonNull @Adjustment.Keys List<String> getAllowedAssistantAdjustments() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getAllowedAssistantAdjustments(mContext.getOpPackageName());
} catch (RemoteException e) {
@@ -1818,7 +1877,7 @@ public class NotificationManager {
@TestApi
@FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
public void allowAssistantAdjustment(@NonNull String capability) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.allowAssistantAdjustment(capability);
} catch (RemoteException e) {
@@ -1832,7 +1891,7 @@ public class NotificationManager {
@TestApi
@FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
public void disallowAssistantAdjustment(@NonNull String capability) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.disallowAssistantAdjustment(capability);
} catch (RemoteException e) {
@@ -1843,7 +1902,7 @@ public class NotificationManager {
/** @hide */
@TestApi
public boolean isNotificationPolicyAccessGrantedForPackage(@NonNull String pkg) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.isNotificationPolicyAccessGrantedForPackage(pkg);
} catch (RemoteException e) {
@@ -1857,7 +1916,7 @@ public class NotificationManager {
@TestApi
@FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
public void setAssistantAdjustmentKeyTypeState(@Adjustment.Types int type, boolean enabled) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setAssistantAdjustmentKeyTypeState(type, enabled);
} catch (RemoteException e) {
@@ -1870,7 +1929,7 @@ public class NotificationManager {
*/
@FlaggedApi(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI)
public void setTypeAdjustmentForPackageState(@NonNull String pkg, boolean enabled) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setTypeAdjustmentForPackageState(pkg, enabled);
} catch (RemoteException e) {
@@ -1882,7 +1941,7 @@ public class NotificationManager {
* @hide
*/
public List<String> getEnabledNotificationListenerPackages() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getEnabledNotificationListenerPackages();
} catch (RemoteException e) {
@@ -1899,7 +1958,7 @@ public class NotificationManager {
* {@link #setNotificationPolicy(Policy)}.
*/
public Policy getNotificationPolicy() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getNotificationPolicy(mContext.getOpPackageName());
} catch (RemoteException e) {
@@ -1929,7 +1988,7 @@ public class NotificationManager {
/** @hide */
public void setNotificationPolicy(@NonNull Policy policy, boolean fromUser) {
checkRequired("policy", policy);
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setNotificationPolicy(mContext.getOpPackageName(), policy, fromUser);
} catch (RemoteException e) {
@@ -1939,7 +1998,7 @@ public class NotificationManager {
/** @hide */
public void setNotificationPolicyAccessGranted(String pkg, boolean granted) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setNotificationPolicyAccessGranted(pkg, granted);
} catch (RemoteException e) {
@@ -1959,7 +2018,7 @@ public class NotificationManager {
@TestApi
@FlaggedApi(Flags.FLAG_MODES_API)
public @NonNull ZenPolicy getDefaultZenPolicy() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getDefaultZenPolicy();
} catch (RemoteException e) {
@@ -1971,7 +2030,7 @@ public class NotificationManager {
*/
@FlaggedApi(Flags.FLAG_MODES_UI)
public void setManualZenRuleDeviceEffects(@NonNull ZenDeviceEffects effects) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setManualZenRuleDeviceEffects(effects);
} catch (RemoteException e) {
@@ -2008,7 +2067,7 @@ public class NotificationManager {
@RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS)
public void setNotificationListenerAccessGranted(
@NonNull ComponentName listener, boolean granted, boolean userSet) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
if (CompatChanges.isChangeEnabled(SET_LISTENER_ACCESS_GRANTED_IS_USER_AWARE)) {
service.setNotificationListenerAccessGrantedForUser(listener, mContext.getUserId(),
@@ -2024,7 +2083,7 @@ public class NotificationManager {
/** @hide */
public void setNotificationListenerAccessGrantedForUser(ComponentName listener, int userId,
boolean granted) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setNotificationListenerAccessGrantedForUser(listener, userId, granted, true);
} catch (RemoteException e) {
@@ -2045,7 +2104,7 @@ public class NotificationManager {
@SystemApi
public void setNotificationAssistantAccessGranted(@Nullable ComponentName assistant,
boolean granted) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setNotificationAssistantAccessGranted(assistant, granted);
} catch (RemoteException e) {
@@ -2069,7 +2128,7 @@ public class NotificationManager {
/** @hide */
public List<ComponentName> getEnabledNotificationListeners(int userId) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getEnabledNotificationListeners(userId);
} catch (RemoteException e) {
@@ -2080,7 +2139,7 @@ public class NotificationManager {
/** @hide */
@SystemApi
public @Nullable ComponentName getAllowedNotificationAssistant() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.getAllowedNotificationAssistant();
} catch (RemoteException e) {
@@ -2100,16 +2159,13 @@ public class NotificationManager {
@SuppressLint("UserHandle")
public boolean hasEnabledNotificationListener(@NonNull String packageName,
@NonNull UserHandle userHandle) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return service.hasEnabledNotificationListener(packageName, userHandle.getIdentifier());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
-
- private Context mContext;
-
private static void checkRequired(String name, Object value) {
if (value == null) {
throw new IllegalArgumentException(name + " is required");
@@ -2125,7 +2181,7 @@ public class NotificationManager {
@TestApi
@RequiresPermission(android.Manifest.permission.MANAGE_TOAST_RATE_LIMITING)
public void setToastRateLimitingEnabled(boolean enable) {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
service.setToastRateLimitingEnabled(enable);
} catch (RemoteException e) {
@@ -2917,7 +2973,7 @@ public class NotificationManager {
* @return An array of {@link StatusBarNotification}.
*/
public StatusBarNotification[] getActiveNotifications() {
- final INotificationManager service = getService();
+ final INotificationManager service = service();
final String pkg = mContext.getPackageName();
try {
final ParceledListSlice<StatusBarNotification> parceledList
@@ -2940,7 +2996,7 @@ public class NotificationManager {
* globally.
*/
public final @InterruptionFilter int getCurrentInterruptionFilter() {
- final INotificationManager service = getService();
+ final INotificationManager service = service();
try {
return zenModeToInterruptionFilter(service.getZenMode());
} catch (RemoteException e) {
@@ -2972,7 +3028,7 @@ public class NotificationManager {
/** @hide */
public final void setInterruptionFilter(@InterruptionFilter int interruptionFilter,
boolean fromUser) {
- final INotificationManager service = getService();
+ final INotificationManager service = service();
try {
service.setInterruptionFilter(mContext.getOpPackageName(), interruptionFilter,
fromUser);
@@ -3130,7 +3186,7 @@ public class NotificationManager {
checkRequired("userHandle", userHandle);
checkRequired("executor", executor);
checkRequired("listener", listener);
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
synchronized (mCallNotificationEventCallbacks) {
CallNotificationEventCallbackStub callbackStub =
@@ -3161,7 +3217,7 @@ public class NotificationManager {
public void unregisterCallNotificationEventListener(
@NonNull CallNotificationEventListener listener) {
checkRequired("listener", listener);
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
synchronized (mCallNotificationEventCallbacks) {
CallNotificationEventCallbackStub callbackStub =
@@ -3184,7 +3240,7 @@ public class NotificationManager {
@TestApi
@FlaggedApi(android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION)
public @NonNull Set<String> getUnsupportedAdjustmentTypes() {
- INotificationManager service = getService();
+ INotificationManager service = service();
try {
return new HashSet<>(service.getUnsupportedAdjustmentTypes());
} catch (RemoteException e) {
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 248e0433232a..920b19cd8f78 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -289,6 +289,7 @@ import com.android.internal.os.IDropBoxManagerService;
import com.android.internal.policy.PhoneLayoutInflater;
import com.android.internal.util.Preconditions;
+import java.time.InstantSource;
import java.util.Map;
import java.util.Objects;
@@ -625,7 +626,7 @@ public final class SystemServiceRegistry {
com.android.internal.R.style.Theme_Holo_Dialog,
com.android.internal.R.style.Theme_DeviceDefault_Dialog,
com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog)),
- ctx.mMainThread.getHandler());
+ InstantSource.system());
}});
registerService(Context.PEOPLE_SERVICE, PeopleManager.class,
diff --git a/core/java/android/app/appfunctions/AppFunctionManager.java b/core/java/android/app/appfunctions/AppFunctionManager.java
index ed088fed41c2..a731e5085466 100644
--- a/core/java/android/app/appfunctions/AppFunctionManager.java
+++ b/core/java/android/app/appfunctions/AppFunctionManager.java
@@ -34,6 +34,7 @@ import android.os.ICancellationSignal;
import android.os.OutcomeReceiver;
import android.os.ParcelableException;
import android.os.RemoteException;
+import android.os.SystemClock;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -179,7 +180,8 @@ public final class AppFunctionManager {
ExecuteAppFunctionAidlRequest aidlRequest =
new ExecuteAppFunctionAidlRequest(
- request, mContext.getUser(), mContext.getPackageName());
+ request, mContext.getUser(), mContext.getPackageName(),
+ /* requestTime= */ SystemClock.elapsedRealtime());
try {
ICancellationSignal cancellationTransport =
diff --git a/core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java b/core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java
index e623fa10f474..707d1fc0473e 100644
--- a/core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java
+++ b/core/java/android/app/appfunctions/ExecuteAppFunctionAidlRequest.java
@@ -41,8 +41,9 @@ public final class ExecuteAppFunctionAidlRequest implements Parcelable {
ExecuteAppFunctionRequest.CREATOR.createFromParcel(in);
UserHandle userHandle = UserHandle.CREATOR.createFromParcel(in);
String callingPackage = in.readString8();
+ long requestTime = in.readLong();
return new ExecuteAppFunctionAidlRequest(
- clientRequest, userHandle, callingPackage);
+ clientRequest, userHandle, callingPackage, requestTime);
}
@Override
@@ -60,11 +61,15 @@ public final class ExecuteAppFunctionAidlRequest implements Parcelable {
/** The package name of the app that is requesting to execute the app function. */
private final String mCallingPackage;
- public ExecuteAppFunctionAidlRequest(
- ExecuteAppFunctionRequest clientRequest, UserHandle userHandle, String callingPackage) {
+ /** The time of calling executeAppFunction(). */
+ private final long mRequestTime;
+
+ public ExecuteAppFunctionAidlRequest(ExecuteAppFunctionRequest clientRequest,
+ UserHandle userHandle, String callingPackage, long requestTime) {
this.mClientRequest = Objects.requireNonNull(clientRequest);
this.mUserHandle = Objects.requireNonNull(userHandle);
this.mCallingPackage = Objects.requireNonNull(callingPackage);
+ this.mRequestTime = requestTime;
}
@Override
@@ -77,6 +82,7 @@ public final class ExecuteAppFunctionAidlRequest implements Parcelable {
mClientRequest.writeToParcel(dest, flags);
mUserHandle.writeToParcel(dest, flags);
dest.writeString8(mCallingPackage);
+ dest.writeLong(mRequestTime);
}
/** Returns the client request to execute an app function. */
@@ -96,4 +102,9 @@ public final class ExecuteAppFunctionAidlRequest implements Parcelable {
public String getCallingPackage() {
return mCallingPackage;
}
+
+ /** Returns the time of calling executeAppFunction(). */
+ public long getRequestTime() {
+ return mRequestTime;
+ }
}
diff --git a/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java b/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java
index 2426daf5c9f2..e290169bdea8 100644
--- a/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java
+++ b/core/java/android/app/appfunctions/SafeOneTimeExecuteAppFunctionCallback.java
@@ -17,6 +17,7 @@
package android.app.appfunctions;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.RemoteException;
import android.util.Log;
@@ -37,8 +38,16 @@ public class SafeOneTimeExecuteAppFunctionCallback {
@NonNull private final IExecuteAppFunctionCallback mCallback;
+ @Nullable CompletionCallback mCompletionCallback;
+
public SafeOneTimeExecuteAppFunctionCallback(@NonNull IExecuteAppFunctionCallback callback) {
+ this(callback, /* completionCallback= */ null);
+ }
+
+ public SafeOneTimeExecuteAppFunctionCallback(@NonNull IExecuteAppFunctionCallback callback,
+ @Nullable CompletionCallback completionCallback) {
mCallback = Objects.requireNonNull(callback);
+ mCompletionCallback = completionCallback;
}
/** Invoke wrapped callback with the result. */
@@ -49,6 +58,9 @@ public class SafeOneTimeExecuteAppFunctionCallback {
}
try {
mCallback.onSuccess(result);
+ if (mCompletionCallback != null) {
+ mCompletionCallback.finalizeOnSuccess(result);
+ }
} catch (RemoteException ex) {
// Failed to notify the other end. Ignore.
Log.w(TAG, "Failed to invoke the callback", ex);
@@ -63,6 +75,9 @@ public class SafeOneTimeExecuteAppFunctionCallback {
}
try {
mCallback.onError(error);
+ if (mCompletionCallback != null) {
+ mCompletionCallback.finalizeOnError(error);
+ }
} catch (RemoteException ex) {
// Failed to notify the other end. Ignore.
Log.w(TAG, "Failed to invoke the callback", ex);
@@ -76,4 +91,16 @@ public class SafeOneTimeExecuteAppFunctionCallback {
public void disable() {
mOnResultCalled.set(true);
}
+
+ /**
+ * Provides a hook to execute additional actions after the {@link IExecuteAppFunctionCallback}
+ * has been invoked.
+ */
+ public interface CompletionCallback {
+ /** Called after {@link IExecuteAppFunctionCallback#onSuccess}. */
+ void finalizeOnSuccess(@NonNull ExecuteAppFunctionResponse result);
+
+ /** Called after {@link IExecuteAppFunctionCallback#onError}. */
+ void finalizeOnError(@NonNull AppFunctionException error);
+ }
}
diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig
index 7543fa9f581f..b1db1379e400 100644
--- a/core/java/android/app/notification.aconfig
+++ b/core/java/android/app/notification.aconfig
@@ -291,6 +291,13 @@ flag {
}
flag {
+ name: "nm_binder_perf_throttle_notify"
+ namespace: "systemui"
+ description: "Rate-limit calls to enqueueNotificationWithTag client-side"
+ bug: "362981561"
+}
+
+flag {
name: "no_sbnholder"
namespace: "systemui"
description: "removes sbnholder from NLS"
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index b3f09a98d623..ed2fd99c55c5 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -1290,7 +1290,11 @@ public final class VirtualDeviceManager {
@NonNull UserHandle user) {}
/**
- * Called when a window with a secure surface is no longer shown on the device.
+ * Called when there is no longer any window with a secure surface shown on the device.
+ *
+ * <p>This is only called once there are no more secure windows shown on the device. If
+ * there are multiple secure windows shown on the device, this callback will be called only
+ * once all of them are hidden.</p>
*
* @param displayId The display ID on which the window was shown before.
*
diff --git a/core/java/android/content/EventLogTags.logtags b/core/java/android/content/EventLogTags.logtags
index 21ea90ad2e1e..861a5b72c86c 100644
--- a/core/java/android/content/EventLogTags.logtags
+++ b/core/java/android/content/EventLogTags.logtags
@@ -1,4 +1,4 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
+# See system/logging/logcat/event.logtags for a description of the format of this file.
option java_package android.content;
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index a6492d36cf8f..3d75423edfa9 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -12291,7 +12291,6 @@ public class Intent implements Parcelable, Cloneable {
private IBinder mCreatorToken;
// Stores all extra keys whose values are intents for a top level intent.
private ArraySet<NestedIntentKey> mNestedIntentKeys;
-
}
/**
@@ -12353,6 +12352,7 @@ public class Intent implements Parcelable, Cloneable {
public int hashCode() {
return Objects.hash(mType, mKey, mIndex);
}
+
}
private @Nullable CreatorTokenInfo mCreatorTokenInfo;
@@ -12416,7 +12416,7 @@ public class Intent implements Parcelable, Cloneable {
// removeLaunchSecurityProtection() is called before it is launched.
value = null;
}
- if (value instanceof Intent intent && !visited.contains(intent)) {
+ if (value instanceof Intent intent) {
handleNestedIntent(intent, visited, new NestedIntentKey(
NestedIntentKey.NESTED_INTENT_KEY_TYPE_EXTRA_PARCEL, key, 0));
} else if (value instanceof Parcelable[] parcelables) {
@@ -12439,7 +12439,6 @@ public class Intent implements Parcelable, Cloneable {
}
private void handleNestedIntent(Intent intent, Set<Intent> visited, NestedIntentKey key) {
- visited.add(intent);
if (mCreatorTokenInfo == null) {
mCreatorTokenInfo = new CreatorTokenInfo();
}
@@ -12447,7 +12446,10 @@ public class Intent implements Parcelable, Cloneable {
mCreatorTokenInfo.mNestedIntentKeys = new ArraySet<>();
}
mCreatorTokenInfo.mNestedIntentKeys.add(key);
- intent.collectNestedIntentKeysRecur(visited);
+ if (!visited.contains(intent)) {
+ visited.add(intent);
+ intent.collectNestedIntentKeysRecur(visited);
+ }
}
private void handleParcelableArray(Parcelable[] parcelables, String key, Set<Intent> visited) {
diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
index 18a45d8d442e..53813012b4b3 100644
--- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
+++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
@@ -539,9 +539,6 @@ public class ApkLiteParseUtils {
hasBindDeviceAdminPermission);
break;
case TAG_USES_SDK_LIBRARY:
- if (!android.content.pm.Flags.sdkDependencyInstaller()) {
- break;
- }
String usesSdkLibName = parser.getAttributeValue(
ANDROID_RES_NAMESPACE, "name");
// TODO(b/379219371): Due to a bug in bundletool, some apps can use
diff --git a/core/java/android/content/res/flags.aconfig b/core/java/android/content/res/flags.aconfig
index 6fc7d90a8237..ecb4bb1394b6 100644
--- a/core/java/android/content/res/flags.aconfig
+++ b/core/java/android/content/res/flags.aconfig
@@ -114,3 +114,11 @@ flag {
bug: "373535266"
is_fixed_read_only: true
}
+
+flag {
+ name: "self_targeting_android_resource_frro"
+ is_exported: true
+ namespace: "customization_picker"
+ description: "Fixes bug in Launcher preview by enabling overlays targeting 'android'"
+ bug: "377545987"
+} \ No newline at end of file
diff --git a/core/java/android/content/res/loader/ResourcesProvider.java b/core/java/android/content/res/loader/ResourcesProvider.java
index 830b7e0fa2d0..7eba1819d148 100644
--- a/core/java/android/content/res/loader/ResourcesProvider.java
+++ b/core/java/android/content/res/loader/ResourcesProvider.java
@@ -25,6 +25,7 @@ import android.content.om.OverlayManager;
import android.content.pm.ApplicationInfo;
import android.content.res.ApkAssets;
import android.content.res.AssetFileDescriptor;
+import android.content.res.Flags;
import android.os.ParcelFileDescriptor;
import android.util.Log;
@@ -90,6 +91,10 @@ public class ResourcesProvider implements AutoCloseable, Closeable {
throws IOException {
Objects.requireNonNull(overlayInfo);
Preconditions.checkArgument(overlayInfo.isFabricated(), "Not accepted overlay");
+ if (!Flags.selfTargetingAndroidResourceFrro()) {
+ Preconditions.checkStringNotEmpty(
+ overlayInfo.getTargetOverlayableName(), "Without overlayable name");
+ }
final String overlayName =
OverlayManagerImpl.checkOverlayNameValid(overlayInfo.getOverlayName());
final String path =
diff --git a/core/java/android/credentials/flags.aconfig b/core/java/android/credentials/flags.aconfig
index d8d4e161006c..9c811fb84da3 100644
--- a/core/java/android/credentials/flags.aconfig
+++ b/core/java/android/credentials/flags.aconfig
@@ -124,3 +124,13 @@ flag {
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ namespace: "credential_manager"
+ name: "settings_w_fixes"
+ description: "Settings improvements for credential manager"
+ bug: "373711451"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/core/java/android/credentials/selection/IntentFactory.java b/core/java/android/credentials/selection/IntentFactory.java
index c521b96fd8ee..59539c40d636 100644
--- a/core/java/android/credentials/selection/IntentFactory.java
+++ b/core/java/android/credentials/selection/IntentFactory.java
@@ -16,7 +16,7 @@
package android.credentials.selection;
-import static android.credentials.flags.Flags.FLAG_CONFIGURABLE_SELECTOR_UI_ENABLED;
+import static android.credentials.flags.Flags.FLAG_PROPAGATE_USER_CONTEXT_FOR_INTENT_CREATION;
import static android.credentials.flags.Flags.configurableSelectorUiEnabled;
import android.annotation.FlaggedApi;
@@ -24,6 +24,8 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
+import android.annotation.UserIdInt;
+import android.app.AppGlobals;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -32,6 +34,7 @@ import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.IBinder;
import android.os.Parcel;
+import android.os.RemoteException;
import android.os.ResultReceiver;
import android.text.TextUtils;
import android.util.Slog;
@@ -46,7 +49,7 @@ import java.util.ArrayList;
* @hide
*/
@TestApi
-@FlaggedApi(FLAG_CONFIGURABLE_SELECTOR_UI_ENABLED)
+@FlaggedApi(FLAG_PROPAGATE_USER_CONTEXT_FOR_INTENT_CREATION)
public class IntentFactory {
/**
@@ -65,9 +68,10 @@ public class IntentFactory {
@SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling.
@NonNull
ArrayList<DisabledProviderData> disabledProviderDataList,
- @NonNull ResultReceiver resultReceiver) {
+ @NonNull ResultReceiver resultReceiver,
+ @UserIdInt int userId) {
return createCredentialSelectorIntentInternal(context, requestInfo,
- disabledProviderDataList, resultReceiver);
+ disabledProviderDataList, resultReceiver, userId);
}
/**
@@ -96,9 +100,10 @@ public class IntentFactory {
@SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling.
@NonNull
ArrayList<DisabledProviderData> disabledProviderDataList,
- @NonNull ResultReceiver resultReceiver) {
+ @NonNull ResultReceiver resultReceiver,
+ @UserIdInt int userId) {
IntentCreationResult result = createCredentialSelectorIntentInternal(context, requestInfo,
- disabledProviderDataList, resultReceiver);
+ disabledProviderDataList, resultReceiver, userId);
result.getIntent().putParcelableArrayListExtra(
ProviderData.EXTRA_ENABLED_PROVIDER_DATA_LIST, enabledProviderDataList);
return result;
@@ -130,9 +135,10 @@ public class IntentFactory {
@SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling.
@NonNull
ArrayList<DisabledProviderData> disabledProviderDataList,
- @NonNull ResultReceiver resultReceiver) {
+ @NonNull ResultReceiver resultReceiver, @UserIdInt int userId) {
return createCredentialSelectorIntentForCredMan(context, requestInfo,
- enabledProviderDataList, disabledProviderDataList, resultReceiver).getIntent();
+ enabledProviderDataList, disabledProviderDataList, resultReceiver,
+ userId).getIntent();
}
/**
@@ -142,10 +148,10 @@ public class IntentFactory {
@NonNull
public static Intent createCancelUiIntent(@NonNull Context context,
@NonNull IBinder requestToken, boolean shouldShowCancellationUi,
- @NonNull String appPackageName) {
+ @NonNull String appPackageName, @UserIdInt int userId) {
Intent intent = new Intent();
IntentCreationResult.Builder intentResultBuilder = new IntentCreationResult.Builder(intent);
- setCredentialSelectorUiComponentName(context, intent, intentResultBuilder);
+ setCredentialSelectorUiComponentName(context, intent, intentResultBuilder, userId);
intent.putExtra(CancelSelectionRequest.EXTRA_CANCEL_UI_REQUEST,
new CancelSelectionRequest(new RequestToken(requestToken), shouldShowCancellationUi,
appPackageName));
@@ -162,10 +168,10 @@ public class IntentFactory {
@SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling.
@NonNull
ArrayList<DisabledProviderData> disabledProviderDataList,
- @NonNull ResultReceiver resultReceiver) {
+ @NonNull ResultReceiver resultReceiver, @UserIdInt int userId) {
Intent intent = new Intent();
IntentCreationResult.Builder intentResultBuilder = new IntentCreationResult.Builder(intent);
- setCredentialSelectorUiComponentName(context, intent, intentResultBuilder);
+ setCredentialSelectorUiComponentName(context, intent, intentResultBuilder, userId);
intent.putParcelableArrayListExtra(
ProviderData.EXTRA_DISABLED_PROVIDER_DATA_LIST, disabledProviderDataList);
intent.putExtra(RequestInfo.EXTRA_REQUEST_INFO, requestInfo);
@@ -175,9 +181,11 @@ public class IntentFactory {
}
private static void setCredentialSelectorUiComponentName(@NonNull Context context,
- @NonNull Intent intent, @NonNull IntentCreationResult.Builder intentResultBuilder) {
+ @NonNull Intent intent, @NonNull IntentCreationResult.Builder intentResultBuilder,
+ @UserIdInt int userId) {
if (configurableSelectorUiEnabled()) {
- ComponentName componentName = getOemOverrideComponentName(context, intentResultBuilder);
+ ComponentName componentName = getOemOverrideComponentName(context,
+ intentResultBuilder, userId);
ComponentName fallbackUiComponentName = null;
try {
@@ -210,7 +218,7 @@ public class IntentFactory {
*/
@Nullable
private static ComponentName getOemOverrideComponentName(@NonNull Context context,
- @NonNull IntentCreationResult.Builder intentResultBuilder) {
+ @NonNull IntentCreationResult.Builder intentResultBuilder, @UserIdInt int userId) {
ComponentName result = null;
String oemComponentString =
Resources.getSystem()
@@ -228,35 +236,43 @@ public class IntentFactory {
if (oemComponentName != null) {
try {
intentResultBuilder.setOemUiPackageName(oemComponentName.getPackageName());
- ActivityInfo info = context.getPackageManager().getActivityInfo(
- oemComponentName,
- PackageManager.ComponentInfoFlags.of(
- PackageManager.MATCH_SYSTEM_ONLY));
- boolean oemComponentEnabled = info.enabled;
- int runtimeComponentEnabledState = context.getPackageManager()
+ ActivityInfo info;
+ if (android.credentials.flags.Flags.propagateUserContextForIntentCreation()) {
+ info = context.getPackageManager().getActivityInfo(oemComponentName,
+ PackageManager.ComponentInfoFlags.of(
+ PackageManager.MATCH_SYSTEM_ONLY));
+ } else {
+ info = AppGlobals.getPackageManager().getActivityInfo(
+ oemComponentName, 0, userId);
+ }
+ boolean oemComponentEnabled = false;
+ if (info != null) {
+ oemComponentEnabled = info.enabled;
+ int runtimeComponentEnabledState = context.getPackageManager()
.getComponentEnabledSetting(oemComponentName);
- if (runtimeComponentEnabledState == PackageManager
+ if (runtimeComponentEnabledState == PackageManager
.COMPONENT_ENABLED_STATE_ENABLED) {
- oemComponentEnabled = true;
- } else if (runtimeComponentEnabledState == PackageManager
+ oemComponentEnabled = true;
+ } else if (runtimeComponentEnabledState == PackageManager
.COMPONENT_ENABLED_STATE_DISABLED) {
oemComponentEnabled = false;
- }
- if (oemComponentEnabled && info.exported) {
+ }
+ if (oemComponentEnabled && info.exported) {
intentResultBuilder.setOemUiUsageStatus(IntentCreationResult
- .OemUiUsageStatus.SUCCESS);
+ .OemUiUsageStatus.SUCCESS);
Slog.i(TAG,
- "Found enabled oem CredMan UI component."
- + oemComponentString);
+ "Found enabled oem CredMan UI component."
+ + oemComponentString);
result = oemComponentName;
- } else {
- intentResultBuilder.setOemUiUsageStatus(IntentCreationResult
- .OemUiUsageStatus.OEM_UI_CONFIG_SPECIFIED_FOUND_BUT_NOT_ENABLED);
- Slog.i(TAG,
- "Found enabled oem CredMan UI component but it was not "
- + "enabled.");
+ } else {
+ intentResultBuilder.setOemUiUsageStatus(IntentCreationResult
+ .OemUiUsageStatus.OEM_UI_CONFIG_SPECIFIED_FOUND_BUT_NOT_ENABLED);
+ Slog.i(TAG,
+ "Found enabled oem CredMan UI component but it was not "
+ + "enabled.");
+ }
}
- } catch (PackageManager.NameNotFoundException e) {
+ } catch (RemoteException | PackageManager.NameNotFoundException e) {
intentResultBuilder.setOemUiUsageStatus(IntentCreationResult.OemUiUsageStatus
.OEM_UI_CONFIG_SPECIFIED_BUT_NOT_FOUND);
Slog.i(TAG, "Unable to find oem CredMan UI component: "
diff --git a/core/java/android/hardware/contexthub/HubEndpoint.java b/core/java/android/hardware/contexthub/HubEndpoint.java
index 1f12bbf4d074..ee4675c6a46f 100644
--- a/core/java/android/hardware/contexthub/HubEndpoint.java
+++ b/core/java/android/hardware/contexthub/HubEndpoint.java
@@ -66,13 +66,14 @@ public class HubEndpoint {
REASON_CLOSE_ENDPOINT_SESSION_REQUESTED,
REASON_ENDPOINT_INVALID,
REASON_ENDPOINT_STOPPED,
+ REASON_PERMISSION_DENIED,
})
public @interface Reason {}
/** Unclassified failure */
public static final int REASON_FAILURE = 0;
- // The values 1 and 2 are reserved at the Context Hub HAL but not exposed to apps.
+ // The values 1-2 are reserved at the Context Hub HAL but not exposed to apps.
/** The peer rejected the request to open this endpoint session. */
public static final int REASON_OPEN_ENDPOINT_SESSION_REQUEST_REJECTED = 3;
@@ -83,6 +84,11 @@ public class HubEndpoint {
/** The peer endpoint is invalid. */
public static final int REASON_ENDPOINT_INVALID = 5;
+ // The values 6-8 are reserved at the Context Hub HAL but not exposed to apps.
+
+ /** The endpoint did not have the required permissions. */
+ public static final int REASON_PERMISSION_DENIED = 9;
+
/**
* The endpoint is now stopped. The app should retrieve the endpoint info using {@link
* android.hardware.location.ContextHubManager#findEndpoints} or register updates through
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 5f3c15d1842e..4c9e73c8b21f 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -3202,7 +3202,8 @@ public class InputMethodService extends AbstractInputMethodService {
*/
@FlaggedApi(Flags.FLAG_ADAPTIVE_HANDWRITING_BOUNDS)
public final void setStylusHandwritingRegion(@NonNull Region handwritingRegion) {
- if (handwritingRegion.equals(mLastHandwritingRegion)) {
+ final Region immutableHandwritingRegion = new Region(handwritingRegion);
+ if (immutableHandwritingRegion.equals(mLastHandwritingRegion)) {
Log.v(TAG, "Failed to set setStylusHandwritingRegion():"
+ " same region set twice.");
return;
@@ -3210,10 +3211,10 @@ public class InputMethodService extends AbstractInputMethodService {
if (DEBUG) {
Log.d(TAG, "Setting new handwriting region for stylus handwriting "
- + handwritingRegion + " from last " + mLastHandwritingRegion);
+ + immutableHandwritingRegion + " from last " + mLastHandwritingRegion);
}
- mPrivOps.setHandwritingTouchableRegion(handwritingRegion);
- mLastHandwritingRegion = handwritingRegion;
+ mPrivOps.setHandwritingTouchableRegion(immutableHandwritingRegion);
+ mLastHandwritingRegion = immutableHandwritingRegion;
}
/**
diff --git a/core/java/android/net/http/X509TrustManagerExtensions.java b/core/java/android/net/http/X509TrustManagerExtensions.java
index b44f75a585d5..3425b77be954 100644
--- a/core/java/android/net/http/X509TrustManagerExtensions.java
+++ b/core/java/android/net/http/X509TrustManagerExtensions.java
@@ -22,7 +22,7 @@ import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
-import android.net.platform.flags.Flags;
+import android.security.Flags;
import android.security.net.config.UserCertificateSource;
import com.android.org.conscrypt.TrustManagerImpl;
@@ -152,7 +152,7 @@ public class X509TrustManagerExtensions {
* @throws IllegalArgumentException if the TrustManager is not compatible.
* @return the properly ordered chain used for verification as a list of X509Certificates.
*/
- @FlaggedApi(Flags.FLAG_X509_EXTENSIONS_CERTIFICATE_TRANSPARENCY)
+ @FlaggedApi(Flags.FLAG_CERTIFICATE_TRANSPARENCY_CONFIGURATION)
@NonNull
public List<X509Certificate> checkServerTrusted(
@SuppressLint("ArrayReturn") @NonNull X509Certificate[] chain,
diff --git a/core/java/android/os/CombinedMessageQueue/MessageQueue.java b/core/java/android/os/CombinedMessageQueue/MessageQueue.java
index b509c7a441d3..230fa3fec930 100644
--- a/core/java/android/os/CombinedMessageQueue/MessageQueue.java
+++ b/core/java/android/os/CombinedMessageQueue/MessageQueue.java
@@ -1355,14 +1355,21 @@ public final class MessageQueue {
/**
* @return true if we are blocked on a sync barrier
+ *
+ * Calls to this method must not be allowed to race with `next`.
+ * Specifically, the Looper thread must be paused before calling this method,
+ * and may not be resumed until after returning from this method.
*/
boolean isBlockedOnSyncBarrier() {
throwIfNotTest();
if (mUseConcurrent) {
+ // Call nextMessage to get the stack drained into our priority queues
+ nextMessage(true);
+
Iterator<MessageNode> queueIter = mPriorityQueue.iterator();
MessageNode queueNode = iterateNext(queueIter);
- if (queueNode.isBarrier()) {
+ if (queueNode != null && queueNode.isBarrier()) {
long now = SystemClock.uptimeMillis();
/* Look for a deliverable async node. If one exists we are not blocked. */
@@ -1375,14 +1382,12 @@ public final class MessageQueue {
* Look for a deliverable sync node. In this case, if one exists we are blocked
* since the barrier prevents delivery of the Message.
*/
- while (queueNode.isBarrier()) {
+ while (queueNode != null && queueNode.isBarrier()) {
queueNode = iterateNext(queueIter);
}
if (queueNode != null && now >= queueNode.getWhen()) {
return true;
}
-
- return false;
}
} else {
Message msg = mMessages;
@@ -1409,10 +1414,8 @@ public final class MessageQueue {
if (iter != null && now >= iter.when) {
return true;
}
- return false;
}
}
- /* No barrier was found. */
return false;
}
diff --git a/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java b/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java
index de0259eb1e36..d7d8e4199b33 100644
--- a/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java
+++ b/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java
@@ -19,6 +19,7 @@ package android.os;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.TestApi;
import android.app.ActivityThread;
import android.app.Instrumentation;
@@ -784,7 +785,7 @@ public final class MessageQueue {
mMessageDirectlyQueued = false;
nativePollOnce(ptr, mNextPollTimeoutMillis);
- Message msg = nextMessage();
+ Message msg = nextMessage(false);
if (msg != null) {
msg.markInUse();
return msg;
@@ -1087,7 +1088,6 @@ public final class MessageQueue {
*
* Caller must ensure that this doesn't race 'next' from the Looper thread.
*/
- @SuppressLint("VisiblySynchronized") // Legacy MessageQueue synchronizes on this
Long peekWhenForTest() {
throwIfNotTest();
Message ret = nextMessage(true);
@@ -1100,7 +1100,6 @@ public final class MessageQueue {
*
* Caller must ensure that this doesn't race 'next' from the Looper thread.
*/
- @SuppressLint("VisiblySynchronized") // Legacy MessageQueue synchronizes on this
@Nullable
Message pollForTest() {
throwIfNotTest();
@@ -1109,13 +1108,21 @@ public final class MessageQueue {
/**
* @return true if we are blocked on a sync barrier
+ *
+ * Calls to this method must not be allowed to race with `next`.
+ * Specifically, the Looper thread must be paused before calling this method,
+ * and may not be resumed until after returning from this method.
*/
boolean isBlockedOnSyncBarrier() {
throwIfNotTest();
+
+ // Call nextMessage to get the stack drained into our priority queues
+ nextMessage(true);
+
Iterator<MessageNode> queueIter = mPriorityQueue.iterator();
MessageNode queueNode = iterateNext(queueIter);
- if (queueNode.isBarrier()) {
+ if (queueNode != null && queueNode.isBarrier()) {
long now = SystemClock.uptimeMillis();
/* Look for a deliverable async node. If one exists we are not blocked. */
@@ -1128,15 +1135,14 @@ public final class MessageQueue {
* Look for a deliverable sync node. In this case, if one exists we are blocked
* since the barrier prevents delivery of the Message.
*/
- while (queueNode.isBarrier()) {
+ while (queueNode != null && queueNode.isBarrier()) {
queueNode = iterateNext(queueIter);
}
if (queueNode != null && now >= queueNode.getWhen()) {
return true;
}
-
- return false;
}
+ return false;
}
private StateNode getStateNode(StackNode node) {
@@ -1193,7 +1199,7 @@ public final class MessageQueue {
MessageNode p = (MessageNode) top;
while (true) {
- if (compare.compareMessage(p.mMessage, h, what, object, r, when)) {
+ if (compare.compareMessage(p, h, what, object, r, when)) {
found = true;
if (DEBUG) {
Log.w(TAG, "stackHasMessages node matches");
@@ -1238,7 +1244,7 @@ public final class MessageQueue {
while (iterator.hasNext()) {
MessageNode msg = iterator.next();
- if (compare.compareMessage(msg.mMessage, h, what, object, r, when)) {
+ if (compare.compareMessage(msg, h, what, object, r, when)) {
if (removeMatches) {
found = true;
if (queue.remove(msg)) {
diff --git a/core/java/android/os/EventLogTags.logtags b/core/java/android/os/EventLogTags.logtags
index b143a7443066..f57aad00e591 100644
--- a/core/java/android/os/EventLogTags.logtags
+++ b/core/java/android/os/EventLogTags.logtags
@@ -1,4 +1,4 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
+# See system/logging/logcat/event.logtags for a description of the format of this file.
option java_package android.os
diff --git a/core/java/android/os/IHintManager.aidl b/core/java/android/os/IHintManager.aidl
index 4a14a8d0faf8..56a089aff78a 100644
--- a/core/java/android/os/IHintManager.aidl
+++ b/core/java/android/os/IHintManager.aidl
@@ -21,11 +21,13 @@ import android.os.CpuHeadroomParamsInternal;
import android.os.GpuHeadroomParamsInternal;
import android.os.IHintSession;
import android.os.SessionCreationConfig;
-import android.hardware.power.CpuHeadroomResult;
+
import android.hardware.power.ChannelConfig;
+import android.hardware.power.CpuHeadroomResult;
import android.hardware.power.GpuHeadroomResult;
import android.hardware.power.SessionConfig;
import android.hardware.power.SessionTag;
+import android.hardware.power.SupportInfo;
/** {@hide} */
interface IHintManager {
@@ -40,11 +42,6 @@ interface IHintManager {
IHintSession createHintSessionWithConfig(in IBinder token, in SessionTag tag,
in SessionCreationConfig creationConfig, out SessionConfig config);
- /**
- * Get preferred rate limit in nanoseconds.
- */
- long getHintSessionPreferredRate();
-
void setHintSessionThreads(in IHintSession hintSession, in int[] tids);
int[] getHintSessionThreadIds(in IHintSession hintSession);
@@ -61,13 +58,28 @@ interface IHintManager {
long getGpuHeadroomMinIntervalMillis();
/**
- * Get Maximum number of graphics pipeline threads allowed per-app.
- */
- int getMaxGraphicsPipelineThreadsCount();
-
- /**
* Used by the JNI to pass an interface to the SessionManager;
* for internal use only.
*/
oneway void passSessionManagerBinder(in IBinder sessionManager);
+
+ parcelable HintManagerClientData {
+ int powerHalVersion;
+ int maxGraphicsPipelineThreads;
+ long preferredRateNanos;
+ SupportInfo supportInfo;
+ }
+
+ interface IHintManagerClient {
+ /**
+ * Returns FMQ channel information for the caller, which it associates to the callback binder lifespan.
+ */
+ oneway void receiveChannelConfig(in ChannelConfig config);
+ }
+
+ /**
+ * Set up an ADPF client, receiving a remote client binder interface and
+ * passing back a bundle of support and configuration information.
+ */
+ HintManagerClientData registerClient(in IHintManagerClient client);
}
diff --git a/core/java/android/os/LegacyMessageQueue/MessageQueue.java b/core/java/android/os/LegacyMessageQueue/MessageQueue.java
index 5e1e1fdca5c8..c0333e914b4d 100644
--- a/core/java/android/os/LegacyMessageQueue/MessageQueue.java
+++ b/core/java/android/os/LegacyMessageQueue/MessageQueue.java
@@ -814,6 +814,10 @@ public final class MessageQueue {
/**
* @return true if we are blocked on a sync barrier
+ *
+ * Calls to this method must not be allowed to race with `next`.
+ * Specifically, the Looper thread must be paused before calling this method,
+ * and may not be resumed until after returning from this method.
*/
boolean isBlockedOnSyncBarrier() {
throwIfNotTest();
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 7e73a5d04866..b9f2cfcd8ca8 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -6501,7 +6501,11 @@ public class UserManager {
* @hide
*/
public static final void invalidateCacheOnUserDataChanged() {
- if (android.multiuser.Flags.cacheProfilesReadOnly()) {
+ if (android.multiuser.Flags.cacheProfilesReadOnly()
+ || android.multiuser.Flags.cacheUserInfoReadOnly()) {
+ // TODO(b/383175685): Rename the invalidation call to make it clearer that it
+ // invalidates the caches for both getProfiles and getUserInfo (since they both use the
+ // same user_manager_user_data CachedProperty.api).
UserManagerCache.invalidateProfiles();
}
}
diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig
index aacc6e2a3156..af96ccfee787 100644
--- a/core/java/android/permission/flags.aconfig
+++ b/core/java/android/permission/flags.aconfig
@@ -57,7 +57,7 @@ flag {
is_exported: true
is_fixed_read_only: true
namespace: "permissions"
- description: "enable enhanced confirmation incall apis"
+ description: "DEPRECATED, does not gate any apis"
bug: "364535720"
}
diff --git a/services/core/java/com/android/server/notification/RateEstimator.java b/core/java/android/service/notification/RateEstimator.java
index eda96ac84b16..04789c18ffe4 100644
--- a/services/core/java/com/android/server/notification/RateEstimator.java
+++ b/core/java/android/service/notification/RateEstimator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -11,10 +11,10 @@
* 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
+ * limitations under the License.
*/
-package com.android.server.notification;
+package android.service.notification;
/**
@@ -22,7 +22,7 @@ package com.android.server.notification;
*
* {@hide}
*/
-class RateEstimator {
+public class RateEstimator {
private static final double RATE_ALPHA = 0.7;
private static final double MINIMUM_DT = 0.0005;
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 802bddd76e30..1ea226b013d6 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -19,6 +19,7 @@ package android.view;
import static android.Manifest.permission.CONFIGURE_DISPLAY_COLOR_MODE;
import static android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS;
import static android.hardware.flags.Flags.FLAG_OVERLAYPROPERTIES_CLASS_API;
+import static android.util.TypedValue.COMPLEX_UNIT_DIP;
import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_GET_SUPPORTED_REFRESH_RATES;
import static com.android.server.display.feature.flags.Flags.FLAG_HIGHEST_HDR_SDR_RATIO_API;
@@ -58,6 +59,7 @@ import android.os.SystemClock;
import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.Log;
+import android.util.TypedValue;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -1048,6 +1050,19 @@ public final class Display {
}
/**
+ * Returns the smallest size of the display in dp
+ * @hide
+ */
+ public float getMinSizeDimensionDp() {
+ synchronized (mLock) {
+ updateDisplayInfoLocked();
+ mDisplayInfo.getAppMetrics(mTempMetrics);
+ return TypedValue.deriveDimension(COMPLEX_UNIT_DIP,
+ Math.min(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight), mTempMetrics);
+ }
+ }
+
+ /**
* @deprecated Use {@link WindowMetrics#getBounds#width()} instead.
*/
@Deprecated
diff --git a/core/java/android/view/EventLogTags.logtags b/core/java/android/view/EventLogTags.logtags
index f3792930647a..95894fa32d6b 100644
--- a/core/java/android/view/EventLogTags.logtags
+++ b/core/java/android/view/EventLogTags.logtags
@@ -1,4 +1,4 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
+# See system/logging/logcat/event.logtags for a description of the format of this file.
option java_package android.view
@@ -35,7 +35,7 @@ option java_package android.view
# 6: Percent
# Default value for data of type int/long is 2 (bytes).
#
-# See system/core/logcat/event.logtags for the master copy of the tags.
+# See system/logging/logcat/event.logtags for the master copy of the tags.
# 32000 - 32999 reserved for input method framework
# IME animation is started.
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d15b0f518f83..d13f0e21bf80 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -28277,28 +28277,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mPrivateFlags |= PFLAG_FORCE_LAYOUT;
mPrivateFlags |= PFLAG_INVALIDATED;
- if (mParent != null) {
- if (!mParent.isLayoutRequested()) {
- mParent.requestLayout();
- } else {
- clearMeasureCacheOfAncestors();
- }
+ if (mParent != null && !mParent.isLayoutRequested()) {
+ mParent.requestLayout();
}
if (mAttachInfo != null && mAttachInfo.mViewRequestingLayout == this) {
mAttachInfo.mViewRequestingLayout = null;
}
}
- private void clearMeasureCacheOfAncestors() {
- ViewParent parent = mParent;
- while (parent instanceof View view) {
- if (view.mMeasureCache != null) {
- view.mMeasureCache.clear();
- }
- parent = view.mParent;
- }
- }
-
/**
* Forces this view to be laid out during the next layout pass.
* This method does not call requestLayout() or forceLayout()
@@ -28654,10 +28640,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
@RemotableViewMethod
public void setMinimumHeight(int minHeight) {
- if (mMinHeight != minHeight) {
- mMinHeight = minHeight;
- requestLayout();
- }
+ mMinHeight = minHeight;
+ requestLayout();
}
/**
@@ -28687,10 +28671,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
@RemotableViewMethod
public void setMinimumWidth(int minWidth) {
- if (mMinWidth != minWidth) {
- mMinWidth = minWidth;
- requestLayout();
- }
+ mMinWidth = minWidth;
+ requestLayout();
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 1596b85bb461..c1b92ee3f74e 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -17,6 +17,7 @@
package android.view;
import static android.adpf.Flags.adpfViewrootimplActionDownBoost;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.content.pm.ActivityInfo.OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS;
import static android.graphics.HardwareRenderer.SYNC_CONTEXT_IS_STOPPED;
@@ -7977,8 +7978,9 @@ public final class ViewRootImpl implements ViewParent,
}
private boolean moveFocusToAdjacentWindow(@FocusDirection int direction) {
- if (getConfiguration().windowConfiguration.getWindowingMode()
- != WINDOWING_MODE_MULTI_WINDOW) {
+ final int windowingMode = getConfiguration().windowConfiguration.getWindowingMode();
+ if (windowingMode != WINDOWING_MODE_MULTI_WINDOW
+ && windowingMode != WINDOWING_MODE_FREEFORM) {
return false;
}
try {
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 6d89f3d89077..f82e5f984f5d 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -948,7 +948,7 @@ public final class InputMethodManager {
// requestedVisibleTypes of WindowInsetsController by hiding the IME
final var statsToken = ImeTracker.forLogging().onStart(
ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_CLIENT,
- SoftInputShowHideReason.REASON_HIDE_WINDOW_LOST_FOCUS,
+ SoftInputShowHideReason.HIDE_WINDOW_LOST_FOCUS,
false /* fromUser */);
if (DEBUG) {
Log.d(TAG, "onWindowLostFocus, hiding IME because "
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 9c2833b91a2b..9fe3fd6ddc1a 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -20,6 +20,7 @@ import static android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL;
import static android.appwidget.flags.Flags.FLAG_REMOTE_VIEWS_PROTO;
import static android.appwidget.flags.Flags.drawDataParcel;
import static android.appwidget.flags.Flags.remoteAdapterConversion;
+import static android.content.res.Flags.FLAG_SELF_TARGETING_ANDROID_RESOURCE_FRRO;
import static android.util.TypedValue.TYPE_INT_COLOR_ARGB8;
import static android.util.proto.ProtoInputStream.NO_MORE_FIELDS;
import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR;
@@ -8698,6 +8699,7 @@ public class RemoteViews implements Parcelable, Filter {
*
* @hide
*/
+ @FlaggedApi(FLAG_SELF_TARGETING_ANDROID_RESOURCE_FRRO)
@Nullable
public static ColorResources createWithOverlay(Context context,
SparseIntArray colorMapping) {
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java
index a88a17283482..c8001198bdf6 100644
--- a/core/java/android/window/WindowContainerTransaction.java
+++ b/core/java/android/window/WindowContainerTransaction.java
@@ -486,7 +486,7 @@ public final class WindowContainerTransaction implements Parcelable {
}
/**
- * Sets to containers adjacent to each other. Containers below two visible adjacent roots will
+ * Sets two containers adjacent to each other. Containers below two visible adjacent roots will
* be made invisible. This currently only applies to TaskFragment containers created by
* organizer.
* @param root1 the first root.
@@ -495,9 +495,64 @@ public final class WindowContainerTransaction implements Parcelable {
@NonNull
public WindowContainerTransaction setAdjacentRoots(
@NonNull WindowContainerToken root1, @NonNull WindowContainerToken root2) {
- mHierarchyOps.add(HierarchyOp.createForAdjacentRoots(
- root1.asBinder(),
- root2.asBinder()));
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ mHierarchyOps.add(HierarchyOp.createForAdjacentRoots(
+ root1.asBinder(),
+ root2.asBinder()));
+ return this;
+ }
+ return setAdjacentRootSet(root1, root2);
+ }
+
+ /**
+ * Sets multiple containers adjacent to each other. Containers below the visible adjacent roots
+ * will be made invisible. This currently only applies to Task containers created by organizer.
+ *
+ * To remove one container from the adjacent roots, one can call {@link #clearAdjacentRoots}
+ * with the target container.
+ * To remove all containers from the adjacent roots, one much call {@link #clearAdjacentRoots}
+ * on each container if there were more than two containers in the set.
+ *
+ * For non-Task TaskFragment, use {@link #setAdjacentTaskFragments} instead.
+ *
+ * @param roots the Tasks that should be adjacent to each other.
+ * @throws IllegalArgumentException if roots have size < 2.
+ * @hide // TODO(b/373709676) Rename to setAdjacentRoots and update CTS.
+ */
+ @NonNull
+ public WindowContainerTransaction setAdjacentRootSet(
+ @NonNull WindowContainerToken... roots) {
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ throw new IllegalArgumentException("allowMultipleAdjacentTaskFragments is not enabled."
+ + " Use #setAdjacentRoots instead.");
+ }
+ if (roots.length < 2) {
+ throw new IllegalArgumentException("setAdjacentRootSet must have size >= 2");
+ }
+ final IBinder[] rootTokens = new IBinder[roots.length];
+ for (int i = 0; i < roots.length; i++) {
+ rootTokens[i] = roots[i].asBinder();
+ }
+ mHierarchyOps.add(
+ new HierarchyOp.Builder(HierarchyOp.HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS)
+ .setContainers(rootTokens)
+ .build());
+ return this;
+ }
+
+ /**
+ * Clears container adjacent.
+ * If {@link #setAdjacentRootSet} is called with more than 2 roots, calling this will only
+ * remove the given root from the adjacent set. The rest of roots will stay adjacent to each
+ * other.
+ *
+ * @param root the root container to clear the adjacent roots for.
+ * @hide
+ */
+ @NonNull
+ public WindowContainerTransaction clearAdjacentRoots(
+ @NonNull WindowContainerToken root) {
+ mHierarchyOps.add(HierarchyOp.createForClearAdjacentRoots(root.asBinder()));
return this;
}
@@ -967,18 +1022,6 @@ public final class WindowContainerTransaction implements Parcelable {
}
/**
- * Clears container adjacent.
- * @param root the root container to clear the adjacent roots for.
- * @hide
- */
- @NonNull
- public WindowContainerTransaction clearAdjacentRoots(
- @NonNull WindowContainerToken root) {
- mHierarchyOps.add(HierarchyOp.createForClearAdjacentRoots(root.asBinder()));
- return this;
- }
-
- /**
* Sets/removes the reparent leaf task flag for this {@code windowContainer}.
* When this is set, the server side will try to reparent the leaf task to task display area
* if there is an existing activity in history during the activity launch. This operation only
@@ -1520,6 +1563,9 @@ public final class WindowContainerTransaction implements Parcelable {
@Nullable
private IBinder mContainer;
+ @Nullable
+ private IBinder[] mContainers;
+
// If this is same as mContainer, then only change position, don't reparent.
@Nullable
private IBinder mReparent;
@@ -1704,6 +1750,7 @@ public final class WindowContainerTransaction implements Parcelable {
public HierarchyOp(@NonNull HierarchyOp copy) {
mType = copy.mType;
mContainer = copy.mContainer;
+ mContainers = copy.mContainers;
mBounds = copy.mBounds;
mIncludingParents = copy.mIncludingParents;
mReparent = copy.mReparent;
@@ -1729,6 +1776,7 @@ public final class WindowContainerTransaction implements Parcelable {
protected HierarchyOp(Parcel in) {
mType = in.readInt();
mContainer = in.readStrongBinder();
+ mContainers = in.createBinderArray();
mBounds = in.readTypedObject(Rect.CREATOR);
mIncludingParents = in.readBoolean();
mReparent = in.readStrongBinder();
@@ -1780,6 +1828,13 @@ public final class WindowContainerTransaction implements Parcelable {
}
@NonNull
+ public IBinder[] getContainers() {
+ return mContainers;
+ }
+
+ /** @deprecated b/373709676 replace with {@link #getContainers()}. */
+ @Deprecated
+ @NonNull
public IBinder getAdjacentRoot() {
return mReparent;
}
@@ -1869,7 +1924,7 @@ public final class WindowContainerTransaction implements Parcelable {
case HIERARCHY_OP_TYPE_REORDER: return "reorder";
case HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT: return "childrenTasksReparent";
case HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT: return "setLaunchRoot";
- case HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS: return "setAdjacentRoot";
+ case HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS: return "setAdjacentRoots";
case HIERARCHY_OP_TYPE_LAUNCH_TASK: return "launchTask";
case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT: return "setAdjacentFlagRoot";
case HIERARCHY_OP_TYPE_SET_DISABLE_LAUNCH_ADJACENT:
@@ -1883,7 +1938,7 @@ public final class WindowContainerTransaction implements Parcelable {
case HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP: return "setAlwaysOnTop";
case HIERARCHY_OP_TYPE_REMOVE_TASK: return "removeTask";
case HIERARCHY_OP_TYPE_FINISH_ACTIVITY: return "finishActivity";
- case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS: return "clearAdjacentRoot";
+ case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS: return "clearAdjacentRoots";
case HIERARCHY_OP_TYPE_SET_REPARENT_LEAF_TASK_IF_RELAUNCH:
return "setReparentLeafTaskIfRelaunch";
case HIERARCHY_OP_TYPE_ADD_TASK_FRAGMENT_OPERATION:
@@ -1923,8 +1978,18 @@ public final class WindowContainerTransaction implements Parcelable {
sb.append(mContainer).append(" to ").append(mToTop ? "top" : "bottom");
break;
case HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS:
- sb.append("container=").append(mContainer)
- .append(" adjacentRoot=").append(mReparent);
+ if (Flags.allowMultipleAdjacentTaskFragments()) {
+ for (IBinder container : mContainers) {
+ if (container == mContainers[0]) {
+ sb.append("adjacentRoots=").append(container);
+ } else {
+ sb.append(", ").append(container);
+ }
+ }
+ } else {
+ sb.append("container=").append(mContainer)
+ .append(" adjacentRoot=").append(mReparent);
+ }
break;
case HIERARCHY_OP_TYPE_LAUNCH_TASK:
sb.append(mLaunchOptions);
@@ -1997,6 +2062,7 @@ public final class WindowContainerTransaction implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mType);
dest.writeStrongBinder(mContainer);
+ dest.writeBinderArray(mContainers);
dest.writeTypedObject(mBounds, flags);
dest.writeBoolean(mIncludingParents);
dest.writeStrongBinder(mReparent);
@@ -2044,6 +2110,9 @@ public final class WindowContainerTransaction implements Parcelable {
private IBinder mContainer;
@Nullable
+ private IBinder[] mContainers;
+
+ @Nullable
private IBinder mReparent;
@Nullable
@@ -2104,6 +2173,11 @@ public final class WindowContainerTransaction implements Parcelable {
return this;
}
+ Builder setContainers(@Nullable IBinder[] containers) {
+ mContainers = containers;
+ return this;
+ }
+
Builder setReparentContainer(@Nullable IBinder reparentContainer) {
mReparent = reparentContainer;
return this;
@@ -2209,6 +2283,7 @@ public final class WindowContainerTransaction implements Parcelable {
HierarchyOp build() {
final HierarchyOp hierarchyOp = new HierarchyOp(mType);
hierarchyOp.mContainer = mContainer;
+ hierarchyOp.mContainers = mContainers;
hierarchyOp.mReparent = mReparent;
hierarchyOp.mWindowingModes = mWindowingModes != null
? Arrays.copyOf(mWindowingModes, mWindowingModes.length)
diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig
index a04071a5997b..6caa20e29c17 100644
--- a/core/java/android/window/flags/lse_desktop_experience.aconfig
+++ b/core/java/android/window/flags/lse_desktop_experience.aconfig
@@ -414,6 +414,16 @@ flag {
}
flag {
+ name: "enable_desktop_recents_transitions_corners_bugfix"
+ namespace: "lse_desktop_experience"
+ description: "Enables rounded corners bugfix for Recents transitions."
+ bug: "383079261"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "enable_move_to_next_display_shortcut"
namespace: "lse_desktop_experience"
description: "Add new keyboard shortcut of moving a task into next display"
@@ -489,4 +499,22 @@ flag {
namespace: "lse_desktop_experience"
description: "Bugfixes / papercuts to bring Desktop Windowing to secondary displays."
bug: "382023296"
+}
+
+flag {
+ name: "enable_top_visible_root_task_per_user_tracking"
+ namespace: "lse_desktop_experience"
+ description: "Enables tracking the top visible root tasks for a user."
+ bug: "381038076"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
+ name: "enable_per_display_desktop_wallpaper_activity"
+ namespace: "lse_desktop_experience"
+ description: "Enables having a DesktopWallpaperActivity at a per-display level."
+ bug: "381935663"
} \ No newline at end of file
diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig
index 30f0c7371270..1c27515b06f0 100644
--- a/core/java/android/window/flags/windowing_frontend.aconfig
+++ b/core/java/android/window/flags/windowing_frontend.aconfig
@@ -455,6 +455,17 @@ flag {
}
flag {
+ name: "remove_defer_hiding_client"
+ namespace: "windowing_frontend"
+ description: "Remove mDeferHidingClient since everything is in shell-transition."
+ is_fixed_read_only: true
+ bug: "382485959"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "relative_insets"
namespace: "windowing_frontend"
description: "Support insets definition and calculation relative to task bounds."
diff --git a/core/java/com/android/internal/app/EventLogTags.logtags b/core/java/com/android/internal/app/EventLogTags.logtags
index d681a8d26e8e..a18a8243305b 100644
--- a/core/java/com/android/internal/app/EventLogTags.logtags
+++ b/core/java/com/android/internal/app/EventLogTags.logtags
@@ -1,4 +1,4 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
+# See system/logging/logcat/event.logtags for a description of the format of this file.
option java_package com.android.internal.app;
diff --git a/core/java/com/android/internal/content/om/OverlayManagerImpl.java b/core/java/com/android/internal/content/om/OverlayManagerImpl.java
index fa5cf2a396b9..5d4e6a083af4 100644
--- a/core/java/com/android/internal/content/om/OverlayManagerImpl.java
+++ b/core/java/com/android/internal/content/om/OverlayManagerImpl.java
@@ -36,6 +36,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.parsing.FrameworkParsingPackageUtils;
import android.content.res.AssetManager;
+import android.content.res.Flags;
import android.os.FabricatedOverlayInfo;
import android.os.FabricatedOverlayInternal;
import android.os.FabricatedOverlayInternalEntry;
@@ -235,17 +236,24 @@ public class OverlayManagerImpl {
Preconditions.checkArgument(!entryList.isEmpty(), "overlay entries shouldn't be empty");
final String overlayName = checkOverlayNameValid(overlayInternal.overlayName);
checkPackageName(overlayInternal.packageName);
- Preconditions.checkStringNotEmpty(overlayInternal.targetPackageName);
+ if (Flags.selfTargetingAndroidResourceFrro()) {
+ Preconditions.checkStringNotEmpty(overlayInternal.targetPackageName);
+ } else {
+ checkPackageName(overlayInternal.targetPackageName);
+ Preconditions.checkStringNotEmpty(
+ overlayInternal.targetOverlayable,
+ "Target overlayable should be neither null nor empty string.");
+ }
final ApplicationInfo applicationInfo = mContext.getApplicationInfo();
String targetPackage = null;
- if (TextUtils.equals(overlayInternal.targetPackageName, "android")) {
+ if (Flags.selfTargetingAndroidResourceFrro() && TextUtils.equals(
+ overlayInternal.targetPackageName, "android")) {
targetPackage = AssetManager.FRAMEWORK_APK_PATH;
} else {
targetPackage = Preconditions.checkStringNotEmpty(
applicationInfo.getBaseCodePath());
}
-
final Path frroPath = mBasePath.resolve(overlayName + FRRO_EXTENSION);
final Path idmapPath = mBasePath.resolve(overlayName + IDMAP_EXTENSION);
diff --git a/core/java/com/android/internal/inputmethod/InputMethodDebug.java b/core/java/com/android/internal/inputmethod/InputMethodDebug.java
index 2a5593f6d584..4d5e67ab8fde 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodDebug.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodDebug.java
@@ -299,6 +299,12 @@ public final class InputMethodDebug {
return "SHOW_SOFT_INPUT_IMM_DEPRECATION";
case SoftInputShowHideReason.CONTROL_WINDOW_INSETS_ANIMATION:
return "CONTROL_WINDOW_INSETS_ANIMATION";
+ case SoftInputShowHideReason.SHOW_INPUT_TARGET_CHANGED:
+ return "SHOW_INPUT_TARGET_CHANGED";
+ case SoftInputShowHideReason.HIDE_INPUT_TARGET_CHANGED:
+ return "HIDE_INPUT_TARGET_CHANGED";
+ case SoftInputShowHideReason.HIDE_WINDOW_LOST_FOCUS:
+ return "HIDE_WINDOW_LOST_FOCUS";
default:
return "Unknown=" + reason;
}
diff --git a/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java b/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java
index 592ea9e5e600..cf0580c2f021 100644
--- a/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java
+++ b/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java
@@ -91,7 +91,7 @@ import java.lang.annotation.Retention;
SoftInputShowHideReason.CONTROL_WINDOW_INSETS_ANIMATION,
SoftInputShowHideReason.SHOW_INPUT_TARGET_CHANGED,
SoftInputShowHideReason.HIDE_INPUT_TARGET_CHANGED,
- SoftInputShowHideReason.REASON_HIDE_WINDOW_LOST_FOCUS,
+ SoftInputShowHideReason.HIDE_WINDOW_LOST_FOCUS,
})
public @interface SoftInputShowHideReason {
/** Default, undefined reason. */
@@ -340,18 +340,6 @@ public @interface SoftInputShowHideReason {
int HIDE_WINDOW_LEGACY_DIRECT = ImeProtoEnums.REASON_HIDE_WINDOW_LEGACY_DIRECT;
/**
- * Show soft input because the input target changed
- * {@link com.android.server.wm.ImeInsetsSourceProvider#onInputTargetChanged}.
- */
- int SHOW_INPUT_TARGET_CHANGED = ImeProtoEnums.REASON_SHOW_INPUT_TARGET_CHANGED;
-
- /**
- * Hide soft input because the input target changed by
- * {@link com.android.server.wm.ImeInsetsSourceProvider#onInputTargetChanged}.
- */
- int HIDE_INPUT_TARGET_CHANGED = ImeProtoEnums.REASON_HIDE_INPUT_TARGET_CHANGED;
-
- /**
* Show / Hide soft input by
* {@link android.inputmethodservice.InputMethodService#resetStateForNewConfiguration}.
*/
@@ -420,6 +408,18 @@ public @interface SoftInputShowHideReason {
*/
int CONTROL_WINDOW_INSETS_ANIMATION = ImeProtoEnums.REASON_CONTROL_WINDOW_INSETS_ANIMATION;
+ /**
+ * Show soft input because the input target changed
+ * {@link com.android.server.wm.ImeInsetsSourceProvider#onInputTargetChanged}.
+ */
+ int SHOW_INPUT_TARGET_CHANGED = ImeProtoEnums.REASON_SHOW_INPUT_TARGET_CHANGED;
+
+ /**
+ * Hide soft input because the input target changed by
+ * {@link com.android.server.wm.ImeInsetsSourceProvider#onInputTargetChanged}.
+ */
+ int HIDE_INPUT_TARGET_CHANGED = ImeProtoEnums.REASON_HIDE_INPUT_TARGET_CHANGED;
+
/** Hide soft input when the window lost focus. */
- int REASON_HIDE_WINDOW_LOST_FOCUS = ImeProtoEnums.REASON_HIDE_WINDOW_LOST_FOCUS;
+ int HIDE_WINDOW_LOST_FOCUS = ImeProtoEnums.REASON_HIDE_WINDOW_LOST_FOCUS;
}
diff --git a/core/java/com/android/internal/logging/EventLogTags.logtags b/core/java/com/android/internal/logging/EventLogTags.logtags
index 693bd16e6170..db47797cb03d 100644
--- a/core/java/com/android/internal/logging/EventLogTags.logtags
+++ b/core/java/com/android/internal/logging/EventLogTags.logtags
@@ -1,4 +1,4 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
+# See system/logging/logcat/event.logtags for a description of the format of this file.
option java_package com.android.internal.logging;
diff --git a/core/java/com/android/internal/policy/KeyInterceptionInfo.java b/core/java/com/android/internal/policy/KeyInterceptionInfo.java
index fed8fe3b4cc0..b20f6d225b69 100644
--- a/core/java/com/android/internal/policy/KeyInterceptionInfo.java
+++ b/core/java/com/android/internal/policy/KeyInterceptionInfo.java
@@ -27,13 +27,11 @@ public class KeyInterceptionInfo {
// Debug friendly name to help identify the window
public final String windowTitle;
public final int windowOwnerUid;
- public final int inputFeaturesFlags;
- public KeyInterceptionInfo(int type, int flags, String title, int uid, int inputFeaturesFlags) {
+ public KeyInterceptionInfo(int type, int flags, String title, int uid) {
layoutParamsType = type;
layoutParamsPrivateFlags = flags;
windowTitle = title;
windowOwnerUid = uid;
- this.inputFeaturesFlags = inputFeaturesFlags;
}
}
diff --git a/core/java/com/android/internal/widget/CallLayout.java b/core/java/com/android/internal/widget/CallLayout.java
index c85257578492..3a7c75afdd14 100644
--- a/core/java/com/android/internal/widget/CallLayout.java
+++ b/core/java/com/android/internal/widget/CallLayout.java
@@ -30,7 +30,6 @@ import android.util.AttributeSet;
import android.view.RemotableViewMethod;
import android.widget.FrameLayout;
import android.widget.RemoteViews;
-import android.widget.TextView;
import android.widget.flags.Flags;
import com.android.internal.R;
@@ -59,7 +58,6 @@ public class CallLayout extends FrameLayout {
private CachingIconView mConversationIconView;
private CachingIconView mIcon;
private CachingIconView mConversationIconBadgeBg;
- private TextView mConversationText;
public CallLayout(@NonNull Context context) {
super(context);
@@ -83,7 +81,6 @@ public class CallLayout extends FrameLayout {
protected void onFinishInflate() {
super.onFinishInflate();
mPeopleHelper.init(getContext());
- mConversationText = findViewById(R.id.conversation_text);
mConversationIconView = findViewById(R.id.conversation_icon);
mIcon = findViewById(R.id.icon);
mConversationIconBadgeBg = findViewById(R.id.conversation_icon_badge_bg);
diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java
index 4b90420a75ee..b3ab5d3cd258 100644
--- a/core/java/com/android/internal/widget/ConversationLayout.java
+++ b/core/java/com/android/internal/widget/ConversationLayout.java
@@ -777,37 +777,40 @@ public class ConversationLayout extends FrameLayout
}
- int conversationAvatarSize;
- int facepileAvatarSize;
- int facePileBackgroundSize;
- if (mIsCollapsed) {
- conversationAvatarSize = mConversationAvatarSize;
- facepileAvatarSize = mFacePileAvatarSize;
- facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidth;
- } else {
- conversationAvatarSize = mConversationAvatarSizeExpanded;
- facepileAvatarSize = mFacePileAvatarSizeExpandedGroup;
- facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidthExpanded;
- }
- LayoutParams layoutParams = (LayoutParams) mConversationFacePile.getLayoutParams();
- layoutParams.width = conversationAvatarSize;
- layoutParams.height = conversationAvatarSize;
- mConversationFacePile.setLayoutParams(layoutParams);
+ if (!notificationsRedesignTemplates()) {
+ // We no longer need to update the size based on expansion state.
+ int conversationAvatarSize;
+ int facepileAvatarSize;
+ int facePileBackgroundSize;
+ if (mIsCollapsed) {
+ conversationAvatarSize = mConversationAvatarSize;
+ facepileAvatarSize = mFacePileAvatarSize;
+ facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidth;
+ } else {
+ conversationAvatarSize = mConversationAvatarSizeExpanded;
+ facepileAvatarSize = mFacePileAvatarSizeExpandedGroup;
+ facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidthExpanded;
+ }
+ LayoutParams layoutParams = (LayoutParams) mConversationFacePile.getLayoutParams();
+ layoutParams.width = conversationAvatarSize;
+ layoutParams.height = conversationAvatarSize;
+ mConversationFacePile.setLayoutParams(layoutParams);
- layoutParams = (LayoutParams) bottomView.getLayoutParams();
- layoutParams.width = facepileAvatarSize;
- layoutParams.height = facepileAvatarSize;
- bottomView.setLayoutParams(layoutParams);
+ layoutParams = (LayoutParams) bottomView.getLayoutParams();
+ layoutParams.width = facepileAvatarSize;
+ layoutParams.height = facepileAvatarSize;
+ bottomView.setLayoutParams(layoutParams);
- layoutParams = (LayoutParams) topView.getLayoutParams();
- layoutParams.width = facepileAvatarSize;
- layoutParams.height = facepileAvatarSize;
- topView.setLayoutParams(layoutParams);
+ layoutParams = (LayoutParams) topView.getLayoutParams();
+ layoutParams.width = facepileAvatarSize;
+ layoutParams.height = facepileAvatarSize;
+ topView.setLayoutParams(layoutParams);
- layoutParams = (LayoutParams) bottomBackground.getLayoutParams();
- layoutParams.width = facePileBackgroundSize;
- layoutParams.height = facePileBackgroundSize;
- bottomBackground.setLayoutParams(layoutParams);
+ layoutParams = (LayoutParams) bottomBackground.getLayoutParams();
+ layoutParams.width = facePileBackgroundSize;
+ layoutParams.height = facePileBackgroundSize;
+ bottomBackground.setLayoutParams(layoutParams);
+ }
}
/**
@@ -832,6 +835,11 @@ public class ConversationLayout extends FrameLayout
* update the icon position and sizing
*/
private void updateIconPositionAndSize() {
+ if (notificationsRedesignTemplates()) {
+ // Icon size is fixed in the redesign.
+ return;
+ }
+
int badgeProtrusion;
int conversationAvatarSize;
if (mIsOneToOne || mIsCollapsed) {
@@ -864,6 +872,11 @@ public class ConversationLayout extends FrameLayout
}
private void updatePaddingsBasedOnContentAvailability() {
+ if (notificationsRedesignTemplates()) {
+ // group icons have the same size as 1:1 conversations
+ return;
+ }
+
// groups have avatars that need more spacing
mMessagingLinearLayout.setSpacing(
mIsOneToOne ? mMessageSpacingStandard : mMessageSpacingGroup);
diff --git a/core/java/org/chromium/arc/EventLogTags.logtags b/core/java/org/chromium/arc/EventLogTags.logtags
index 1b7160e90224..8102d6f10ed4 100644
--- a/core/java/org/chromium/arc/EventLogTags.logtags
+++ b/core/java/org/chromium/arc/EventLogTags.logtags
@@ -1,4 +1,4 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
+# See system/logging/logcat/event.logtags for a description of the format of this file.
option java_package org.chromium.arc
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 8e3303a4ddbd..027113a75f6b 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -92,7 +92,6 @@ cc_library_shared_for_libandroid_runtime {
"android_view_VelocityTracker.cpp",
"android_view_VerifiedKeyEvent.cpp",
"android_view_VerifiedMotionEvent.cpp",
- "com_android_internal_util_ArrayUtils.cpp",
"com_android_internal_util_VirtualRefBasePtr.cpp",
"core_jni_helpers.cpp",
":deviceproductinfoconstants_aidl",
@@ -264,6 +263,7 @@ cc_library_shared_for_libandroid_runtime {
"com_android_internal_os_ZygoteCommandBuffer.cpp",
"com_android_internal_os_ZygoteInit.cpp",
"com_android_internal_security_VerityUtils.cpp",
+ "com_android_internal_util_ArrayUtils.cpp",
"hwbinder/EphemeralStorage.cpp",
"fd_utils.cpp",
"android_hardware_input_InputWindowHandle.cpp",
diff --git a/core/res/res/color-watch-v36/btn_material_filled_background_color.xml b/core/res/res/color-watch-v36/btn_material_filled_background_color.xml
index 70aace4e7d76..39b5b10a774d 100644
--- a/core/res/res/color-watch-v36/btn_material_filled_background_color.xml
+++ b/core/res/res/color-watch-v36/btn_material_filled_background_color.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:alpha="?attr/disabledAlpha"
- android:color="?attr/materialColorOnSurface" />
- <item android:color="?attr/materialColorPrimary" />
+ android:color="@color/materialColorOnSurface" />
+ <item android:color="@color/materialColorPrimary" />
</selector> \ No newline at end of file
diff --git a/core/res/res/color-watch-v36/btn_material_filled_content_color.xml b/core/res/res/color-watch-v36/btn_material_filled_content_color.xml
index 4cc8fe5ecb91..a70586b08bab 100644
--- a/core/res/res/color-watch-v36/btn_material_filled_content_color.xml
+++ b/core/res/res/color-watch-v36/btn_material_filled_content_color.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:alpha="?attr/primaryContentAlpha"
- android:color="?attr/materialColorOnSurface" />
- <item android:color="?attr/materialColorOnPrimary" />
+ android:color="@color/materialColorOnSurface" />
+ <item android:color="@color/materialColorOnPrimary" />
</selector> \ No newline at end of file
diff --git a/core/res/res/color-watch-v36/btn_material_filled_tonal_background_color.xml b/core/res/res/color-watch-v36/btn_material_filled_tonal_background_color.xml
index b2a25af0d670..e2e274efb2b1 100644
--- a/core/res/res/color-watch-v36/btn_material_filled_tonal_background_color.xml
+++ b/core/res/res/color-watch-v36/btn_material_filled_tonal_background_color.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:alpha="?attr/disabledAlpha"
- android:color="?attr/materialColorOnSurface" />
- <item android:color="?attr/materialColorSurfaceContainer" />
+ android:color="@color/materialColorOnSurface" />
+ <item android:color="@color/materialColorSurfaceContainer" />
</selector> \ No newline at end of file
diff --git a/core/res/res/color-watch-v36/btn_material_filled_tonal_content_color.xml b/core/res/res/color-watch-v36/btn_material_filled_tonal_content_color.xml
index 59810356c3b4..32de68868d53 100644
--- a/core/res/res/color-watch-v36/btn_material_filled_tonal_content_color.xml
+++ b/core/res/res/color-watch-v36/btn_material_filled_tonal_content_color.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:alpha="?attr/primaryContentAlpha"
- android:color="?attr/materialColorOnSurface" />
- <item android:color="?attr/materialColorOnSurface" />
+ android:color="@color/materialColorOnSurface" />
+ <item android:color="@color/materialColorOnSurface" />
</selector> \ No newline at end of file
diff --git a/core/res/res/color-watch-v36/btn_material_outlined_background_color.xml b/core/res/res/color-watch-v36/btn_material_outlined_background_color.xml
index 665f47faca0d..3f43ca7b91df 100644
--- a/core/res/res/color-watch-v36/btn_material_outlined_background_color.xml
+++ b/core/res/res/color-watch-v36/btn_material_outlined_background_color.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:alpha="?attr/disabledAlpha"
- android:color="?attr/materialColorOnSurface" />
- <item android:color="?attr/materialColorOutline" />
+ android:color="@color/materialColorOnSurface" />
+ <item android:color="@color/materialColorOutline" />
</selector>
diff --git a/core/res/res/color/input_method_switch_on_item.xml b/core/res/res/color/input_method_switch_on_item.xml
index 49fe0815c757..f38e0ac3454e 100644
--- a/core/res/res/color/input_method_switch_on_item.xml
+++ b/core/res/res/color/input_method_switch_on_item.xml
@@ -16,6 +16,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_activated="true" android:color="?attr/materialColorOnSecondaryContainer" />
- <item android:color="?attr/materialColorOnSurface" />
+ <item android:state_activated="true" android:color="@color/materialColorOnSecondaryContainer" />
+ <item android:color="@color/materialColorOnSurface" />
</selector>
diff --git a/core/res/res/color/notification_expand_button_state_tint.xml b/core/res/res/color/notification_expand_button_state_tint.xml
index 5a8594f0e461..3409a2c7ab14 100644
--- a/core/res/res/color/notification_expand_button_state_tint.xml
+++ b/core/res/res/color/notification_expand_button_state_tint.xml
@@ -16,9 +16,9 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:state_pressed="true" android:color="?androidprv:attr/materialColorOnPrimaryFixed"
+ <item android:state_pressed="true" android:color="@androidprv:color/materialColorOnPrimaryFixed"
android:alpha="0.15"/>
- <item android:state_hovered="true" android:color="?androidprv:attr/materialColorOnPrimaryFixed"
+ <item android:state_hovered="true" android:color="@androidprv:color/materialColorOnPrimaryFixed"
android:alpha="0.11"/>
<item android:color="@color/transparent" />
</selector> \ No newline at end of file
diff --git a/core/res/res/color/system_on_surface_disabled.xml b/core/res/res/color/system_on_surface_disabled.xml
index aba87f543c44..039ab024a32a 100644
--- a/core/res/res/color/system_on_surface_disabled.xml
+++ b/core/res/res/color/system_on_surface_disabled.xml
@@ -15,6 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="?attr/materialColorOnSurface"
+ <item android:color="@color/materialColorOnSurface"
android:alpha="?attr/disabledAlpha" />
</selector>
diff --git a/core/res/res/color/system_outline_disabled.xml b/core/res/res/color/system_outline_disabled.xml
index 0a67ce3bf186..b5a6b6bd8e25 100644
--- a/core/res/res/color/system_outline_disabled.xml
+++ b/core/res/res/color/system_outline_disabled.xml
@@ -15,6 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="?attr/materialColorOutline"
+ <item android:color="@color/materialColorOutline"
android:alpha="?attr/disabledAlpha" />
</selector>
diff --git a/core/res/res/color/system_surface_disabled.xml b/core/res/res/color/system_surface_disabled.xml
index 2d7fe7d727be..157227241d44 100644
--- a/core/res/res/color/system_surface_disabled.xml
+++ b/core/res/res/color/system_surface_disabled.xml
@@ -15,6 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="?attr/materialColorSurface"
+ <item android:color="@color/materialColorSurface"
android:alpha="?attr/disabledAlpha" />
</selector>
diff --git a/core/res/res/drawable-watch-v36/progress_ring_wear_material3.xml b/core/res/res/drawable-watch-v36/progress_ring_wear_material3.xml
index 5c0e5f606d81..8250ee600a8f 100644
--- a/core/res/res/drawable-watch-v36/progress_ring_wear_material3.xml
+++ b/core/res/res/drawable-watch-v36/progress_ring_wear_material3.xml
@@ -27,7 +27,7 @@
android:innerRadiusRatio="@dimen/progressbar_inner_radius_ratio"
android:thickness="@dimen/progressbar_thickness"
android:useLevel="false">
- <solid android:color="?attr/materialColorSurfaceContainer"/>
+ <solid android:color="@color/materialColorSurfaceContainer"/>
</shape>
</item>
<item>
@@ -36,7 +36,7 @@
android:innerRadiusRatio="@dimen/progressbar_inner_radius_ratio"
android:thickness="@dimen/progressbar_thickness"
android:useLevel="true">
- <solid android:color="?attr/materialColorPrimary"/>
+ <solid android:color="@color/materialColorPrimary"/>
</shape>
</item>
</layer-list>
diff --git a/core/res/res/drawable/floating_popup_background.xml b/core/res/res/drawable/floating_popup_background.xml
index 99acedf06e2d..7200954140b7 100644
--- a/core/res/res/drawable/floating_popup_background.xml
+++ b/core/res/res/drawable/floating_popup_background.xml
@@ -18,7 +18,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHighest"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHighest"/>
<corners android:radius="?android:attr/dialogCornerRadius" />
</shape>
diff --git a/core/res/res/drawable/immersive_cling_bg.xml b/core/res/res/drawable/immersive_cling_bg.xml
index de29c32390e1..b28a423ea06b 100644
--- a/core/res/res/drawable/immersive_cling_bg.xml
+++ b/core/res/res/drawable/immersive_cling_bg.xml
@@ -20,5 +20,5 @@
<corners
android:bottomLeftRadius="28dp"
android:bottomRightRadius="28dp"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer" />
</shape>
diff --git a/core/res/res/drawable/input_method_switch_button.xml b/core/res/res/drawable/input_method_switch_button.xml
index 396d81ed87f6..1ee9b81a855a 100644
--- a/core/res/res/drawable/input_method_switch_button.xml
+++ b/core/res/res/drawable/input_method_switch_button.xml
@@ -30,7 +30,7 @@
<shape android:shape="rectangle">
<corners android:radius="28dp"/>
<solid android:color="@color/transparent"/>
- <stroke android:color="?attr/materialColorPrimary"
+ <stroke android:color="@color/materialColorPrimary"
android:width="1dp"/>
<padding android:left="16dp"
android:top="8dp"
diff --git a/core/res/res/drawable/input_method_switch_item_background.xml b/core/res/res/drawable/input_method_switch_item_background.xml
index eb7a24691f37..ce5b6f92e539 100644
--- a/core/res/res/drawable/input_method_switch_item_background.xml
+++ b/core/res/res/drawable/input_method_switch_item_background.xml
@@ -29,7 +29,7 @@
<item android:state_activated="true">
<shape android:shape="rectangle">
<corners android:radius="28dp"/>
- <solid android:color="?attr/materialColorSecondaryContainer"/>
+ <solid android:color="@color/materialColorSecondaryContainer"/>
</shape>
</item>
</selector>
diff --git a/core/res/res/layout/floating_popup_menu_button.xml b/core/res/res/layout/floating_popup_menu_button.xml
index 0b3861cad252..f6e6adfb4b28 100644
--- a/core/res/res/layout/floating_popup_menu_button.xml
+++ b/core/res/res/layout/floating_popup_menu_button.xml
@@ -54,7 +54,7 @@
android:ellipsize="end"
android:fontFamily="@*android:string/config_bodyFontFamily"
android:textSize="@dimen/floating_toolbar_text_size"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:background="@null"
android:focusable="false"
android:focusableInTouchMode="false"
diff --git a/core/res/res/layout/floating_popup_overflow_button.xml b/core/res/res/layout/floating_popup_overflow_button.xml
index a51836b35057..5fd774f9c3af 100644
--- a/core/res/res/layout/floating_popup_overflow_button.xml
+++ b/core/res/res/layout/floating_popup_overflow_button.xml
@@ -26,4 +26,4 @@
android:paddingBottom="@dimen/floating_toolbar_menu_image_button_vertical_padding"
android:scaleType="centerInside"
android:background="?attr/actionBarItemBackground"
- android:tint="?androidprv:attr/materialColorOnSurface" />
+ android:tint="@androidprv:color/materialColorOnSurface" />
diff --git a/core/res/res/layout/immersive_mode_cling.xml b/core/res/res/layout/immersive_mode_cling.xml
index 2cde9e648276..4e869b76b510 100644
--- a/core/res/res/layout/immersive_mode_cling.xml
+++ b/core/res/res/layout/immersive_mode_cling.xml
@@ -42,7 +42,7 @@
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:text="@string/immersive_cling_title"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="24sp"
android:fontFamily="google-sans" />
@@ -54,7 +54,7 @@
android:paddingTop="14dp"
android:gravity="center_horizontal"
android:text="@string/immersive_cling_description"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textSize="14sp"
android:fontFamily="google-sans" />
@@ -72,7 +72,7 @@
android:minWidth="48dp"
android:minHeight="48dp"
android:text="@string/immersive_cling_positive"
- android:textColor="?androidprv:attr/materialColorOnPrimary"
+ android:textColor="@androidprv:color/materialColorOnPrimary"
android:textAllCaps="false"
android:textSize="14sp"
android:textFontWeight="500"
diff --git a/core/res/res/layout/input_method_switch_item_divider.xml b/core/res/res/layout/input_method_switch_item_divider.xml
index 4f8c963ff8cf..b56cfb7bf6bd 100644
--- a/core/res/res/layout/input_method_switch_item_divider.xml
+++ b/core/res/res/layout/input_method_switch_item_divider.xml
@@ -26,7 +26,7 @@
<View
android:layout_width="match_parent"
android:layout_height="1dp"
- android:background="?attr/materialColorOutlineVariant"
+ android:background="@color/materialColorOutlineVariant"
android:layout_marginStart="20dp"
android:layout_marginEnd="24dp"
android:importantForAccessibility="no"/>
diff --git a/core/res/res/layout/input_method_switch_item_header.xml b/core/res/res/layout/input_method_switch_item_header.xml
index f0080a630025..05c73d04d715 100644
--- a/core/res/res/layout/input_method_switch_item_header.xml
+++ b/core/res/res/layout/input_method_switch_item_header.xml
@@ -33,6 +33,6 @@
android:fontFamily="google-sans-text"
android:textAppearance="?attr/textAppearance"
android:accessibilityHeading="true"
- android:textColor="?attr/materialColorPrimary"/>
+ android:textColor="@color/materialColorPrimary"/>
</LinearLayout>
diff --git a/core/res/res/layout/input_method_switch_item_new.xml b/core/res/res/layout/input_method_switch_item_new.xml
index 7b241aff3fb1..368860848f5d 100644
--- a/core/res/res/layout/input_method_switch_item_new.xml
+++ b/core/res/res/layout/input_method_switch_item_new.xml
@@ -56,7 +56,7 @@
android:marqueeRepeatLimit="1"
android:singleLine="true"
android:fontFamily="google-sans-text"
- android:textColor="?attr/materialColorOnSurfaceVariant"
+ android:textColor="@color/materialColorOnSurfaceVariant"
android:textAppearance="?attr/textAppearanceListItemSecondary"
android:textAllCaps="true"
android:visibility="gone"/>
diff --git a/core/res/res/layout/notification_2025_conversation_face_pile_layout.xml b/core/res/res/layout/notification_2025_conversation_face_pile_layout.xml
index b25adaabf8e8..68eafee03848 100644
--- a/core/res/res/layout/notification_2025_conversation_face_pile_layout.xml
+++ b/core/res/res/layout/notification_2025_conversation_face_pile_layout.xml
@@ -18,14 +18,14 @@
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/conversation_face_pile"
- android:layout_width="@dimen/conversation_avatar_size"
- android:layout_height="@dimen/conversation_avatar_size"
+ android:layout_width="@dimen/notification_2025_icon_circle_size"
+ android:layout_height="@dimen/notification_2025_icon_circle_size"
android:forceHasOverlappingRendering="false"
>
<ImageView
android:id="@+id/conversation_face_pile_top"
- android:layout_width="@dimen/messaging_avatar_size"
- android:layout_height="@dimen/messaging_avatar_size"
+ android:layout_width="@dimen/notification_2025_face_pile_avatar_size"
+ android:layout_height="@dimen/notification_2025_face_pile_avatar_size"
android:scaleType="centerCrop"
android:layout_gravity="end|top"
android:background="@drawable/notification_icon_circle"
@@ -43,8 +43,8 @@
/>
<ImageView
android:id="@+id/conversation_face_pile_bottom"
- android:layout_width="@dimen/messaging_avatar_size"
- android:layout_height="@dimen/messaging_avatar_size"
+ android:layout_width="@dimen/notification_2025_face_pile_avatar_size"
+ android:layout_height="@dimen/notification_2025_face_pile_avatar_size"
android:scaleType="centerCrop"
android:layout_gravity="center"
android:background="@drawable/notification_icon_circle"
diff --git a/core/res/res/layout/notification_2025_conversation_header.xml b/core/res/res/layout/notification_2025_conversation_header.xml
new file mode 100644
index 000000000000..db79e79c96df
--- /dev/null
+++ b/core/res/res/layout/notification_2025_conversation_header.xml
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<com.android.internal.widget.ConversationHeaderLinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/conversation_header"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingTop="@dimen/notification_2025_margin"
+ >
+
+ <TextView
+ android:id="@+id/conversation_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title"
+ android:textSize="16sp"
+ android:singleLine="true"
+ android:layout_weight="1"
+ />
+
+ <TextView
+ android:id="@+id/app_name_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:text="@string/notification_header_divider_symbol"
+ android:singleLine="true"
+ android:visibility="gone"
+ />
+
+ <!-- App Name -->
+ <com.android.internal.widget.ObservableTextView
+ android:id="@+id/app_name_text"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:singleLine="true"
+ android:visibility="gone"
+ />
+
+ <TextView
+ android:id="@+id/time_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:text="@string/notification_header_divider_symbol"
+ android:singleLine="true"
+ android:visibility="gone"
+ />
+
+ <DateTimeView
+ android:id="@+id/time"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:showRelative="true"
+ android:singleLine="true"
+ android:visibility="gone"
+ />
+
+ <ViewStub
+ android:id="@+id/chronometer"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:layout="@layout/notification_template_part_chronometer"
+ android:visibility="gone"
+ />
+
+ <TextView
+ android:id="@+id/verification_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:text="@string/notification_header_divider_symbol"
+ android:singleLine="true"
+ android:visibility="gone"
+ />
+
+ <ImageView
+ android:id="@+id/verification_icon"
+ android:layout_width="@dimen/notification_verification_icon_size"
+ android:layout_height="@dimen/notification_verification_icon_size"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:baseline="10dp"
+ android:scaleType="fitCenter"
+ android:src="@drawable/ic_notifications_alerted"
+ android:visibility="gone"
+ />
+
+ <TextView
+ android:id="@+id/verification_text"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:layout_weight="100"
+ android:showRelative="true"
+ android:singleLine="true"
+ android:visibility="gone"
+ />
+
+ <ImageButton
+ android:id="@+id/feedback"
+ android:layout_width="@dimen/notification_feedback_size"
+ android:layout_height="@dimen/notification_feedback_size"
+ android:layout_marginStart="@dimen/notification_header_separating_margin"
+ android:background="?android:selectableItemBackgroundBorderless"
+ android:contentDescription="@string/notification_feedback_indicator"
+ android:baseline="13dp"
+ android:scaleType="fitCenter"
+ android:src="@drawable/ic_feedback_indicator"
+ android:visibility="gone"
+ />
+
+ <ImageView
+ android:id="@+id/phishing_alert"
+ android:layout_width="@dimen/notification_phishing_alert_size"
+ android:layout_height="@dimen/notification_phishing_alert_size"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:baseline="10dp"
+ android:scaleType="fitCenter"
+ android:src="@drawable/ic_dialog_alert_material"
+ android:visibility="gone"
+ android:contentDescription="@string/notification_phishing_alert_content_description"
+ />
+
+ <ImageView
+ android:id="@+id/profile_badge"
+ android:layout_width="@dimen/notification_badge_size"
+ android:layout_height="@dimen/notification_badge_size"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:baseline="10dp"
+ android:scaleType="fitCenter"
+ android:visibility="gone"
+ android:contentDescription="@string/notification_work_profile_content_description"
+ />
+
+ <ImageView
+ android:id="@+id/alerted_icon"
+ android:layout_width="@dimen/notification_alerted_size"
+ android:layout_height="@dimen/notification_alerted_size"
+ android:layout_marginStart="@dimen/notification_conversation_header_separating_margin"
+ android:baseline="10dp"
+ android:contentDescription="@string/notification_alerted_content_description"
+ android:scaleType="fitCenter"
+ android:src="@drawable/ic_notifications_alerted"
+ android:visibility="gone"
+ />
+</com.android.internal.widget.ConversationHeaderLinearLayout>
diff --git a/core/res/res/layout/notification_2025_conversation_icon_container.xml b/core/res/res/layout/notification_2025_conversation_icon_container.xml
index 90befd911bdf..7ec2450ceb71 100644
--- a/core/res/res/layout/notification_2025_conversation_icon_container.xml
+++ b/core/res/res/layout/notification_2025_conversation_icon_container.xml
@@ -18,32 +18,27 @@
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/conversation_icon_container"
- android:layout_width="@dimen/conversation_content_start"
+ android:layout_width="@dimen/notification_2025_content_margin_start"
android:layout_height="wrap_content"
android:gravity="start|top"
android:clipChildren="false"
android:clipToPadding="false"
- android:paddingTop="20dp"
- android:paddingBottom="16dp"
android:importantForAccessibility="no"
>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_margin="@dimen/notification_2025_margin"
android:clipChildren="false"
android:clipToPadding="false"
android:layout_gravity="top|center_horizontal"
>
- <!-- Big icon: 48x48, 12dp padding top, 16dp padding sides -->
<com.android.internal.widget.CachingIconView
android:id="@+id/conversation_icon"
- android:layout_width="@dimen/conversation_avatar_size"
- android:layout_height="@dimen/conversation_avatar_size"
- android:layout_marginLeft="@dimen/conversation_badge_protrusion"
- android:layout_marginRight="@dimen/conversation_badge_protrusion"
- android:layout_marginBottom="@dimen/conversation_badge_protrusion"
+ android:layout_width="@dimen/notification_2025_icon_circle_size"
+ android:layout_height="@dimen/notification_2025_icon_circle_size"
android:background="@drawable/notification_icon_circle"
android:clipToOutline="true"
android:scaleType="centerCrop"
@@ -52,19 +47,25 @@
<ViewStub
android:layout="@layout/notification_2025_conversation_face_pile_layout"
- android:layout_width="@dimen/conversation_avatar_size"
- android:layout_height="@dimen/conversation_avatar_size"
- android:layout_marginLeft="@dimen/conversation_badge_protrusion"
- android:layout_marginRight="@dimen/conversation_badge_protrusion"
- android:layout_marginBottom="@dimen/conversation_badge_protrusion"
+ android:layout_width="@dimen/notification_2025_icon_circle_size"
+ android:layout_height="@dimen/notification_2025_icon_circle_size"
android:id="@+id/conversation_face_pile"
/>
+ <!-- The badge icon is visually aligned to the square containing the conversation icon,
+ but it has a border in the color of the background that is meant to delimit it from the
+ conversation icon. This border, although not visible due to the color, is technically
+ outside these bounds.
+ In order to align the badge properly to the bottom end of the square, we use a top/start
+ margin that is equal to (size of the conversation icon - size of the badge - size of the
+ border on one side).
+ -->
<FrameLayout
android:id="@+id/conversation_icon_badge"
- android:layout_width="@dimen/conversation_icon_size_badged"
- android:layout_height="@dimen/conversation_icon_size_badged"
- android:layout_gravity="end|bottom"
+ android:layout_width="@dimen/notification_2025_conversation_icon_badge_size"
+ android:layout_height="@dimen/notification_2025_conversation_icon_badge_size"
+ android:layout_marginTop="@dimen/notification_2025_conversation_icon_badge_position"
+ android:layout_marginStart="@dimen/notification_2025_conversation_icon_badge_position"
android:clipChildren="false"
android:clipToPadding="false"
>
@@ -83,7 +84,7 @@
android:id="@+id/icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_margin="4dp"
+ android:layout_margin="@dimen/notification_2025_conversation_icon_badge_padding"
android:layout_gravity="center"
android:forceHasOverlappingRendering="false"
/>
diff --git a/core/res/res/layout/notification_2025_template_collapsed_call.xml b/core/res/res/layout/notification_2025_template_collapsed_call.xml
index 614444d6b2f0..c4bca1142ece 100644
--- a/core/res/res/layout/notification_2025_template_collapsed_call.xml
+++ b/core/res/res/layout/notification_2025_template_collapsed_call.xml
@@ -41,13 +41,13 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:layout_marginStart="@dimen/conversation_content_start"
+ android:layout_marginStart="@dimen/notification_2025_content_margin_start"
android:orientation="vertical"
android:paddingBottom="@dimen/notification_2025_margin"
>
<include
- layout="@layout/notification_template_conversation_header"
+ layout="@layout/notification_2025_conversation_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
diff --git a/core/res/res/layout/notification_2025_template_conversation.xml b/core/res/res/layout/notification_2025_template_conversation.xml
index 0c4c7fba90b1..f31f65e90950 100644
--- a/core/res/res/layout/notification_2025_template_conversation.xml
+++ b/core/res/res/layout/notification_2025_template_conversation.xml
@@ -60,11 +60,11 @@
<!-- Use layout_marginStart instead of paddingStart to work around strange
measurement behavior on lower display densities. -->
<include
- layout="@layout/notification_template_conversation_header"
+ layout="@layout/notification_2025_conversation_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
- android:layout_marginStart="@dimen/conversation_content_start"
+ android:layout_marginStart="@dimen/notification_2025_content_margin_start"
/>
<!-- Messages -->
@@ -86,7 +86,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/notification_content_margin"
- android:layout_marginStart="@dimen/conversation_content_start"
+ android:layout_marginStart="@dimen/notification_2025_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end" />
<include layout="@layout/notification_material_action_list" />
</com.android.internal.widget.RemeasuringLinearLayout>
diff --git a/core/res/res/layout/notification_2025_template_expanded_call.xml b/core/res/res/layout/notification_2025_template_expanded_call.xml
index 3ff71b78835d..2af0ec2972df 100644
--- a/core/res/res/layout/notification_2025_template_expanded_call.xml
+++ b/core/res/res/layout/notification_2025_template_expanded_call.xml
@@ -49,13 +49,13 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:layout_marginStart="@dimen/conversation_content_start"
+ android:layout_marginStart="@dimen/notification_2025_content_margin_start"
android:orientation="vertical"
android:minHeight="68dp"
>
<include
- layout="@layout/notification_template_conversation_header"
+ layout="@layout/notification_2025_conversation_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
@@ -97,7 +97,7 @@
layout="@layout/notification_template_smart_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/notification_content_margin_start"
+ android:layout_marginStart="@dimen/notification_2025_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin"
/>
diff --git a/core/res/res/layout/notification_2025_text.xml b/core/res/res/layout/notification_2025_text.xml
index 48b1083a5e53..474f6d2099c6 100644
--- a/core/res/res/layout/notification_2025_text.xml
+++ b/core/res/res/layout/notification_2025_text.xml
@@ -21,6 +21,7 @@
android:layout_height="@dimen/notification_text_height"
android:layout_gravity="top"
android:layout_marginTop="@dimen/notification_text_margin_top"
+ android:ellipsize="end"
android:fadingEdge="horizontal"
android:gravity="top"
android:maxLines="1"
diff --git a/core/res/res/values-watch/themes_device_defaults.xml b/core/res/res/values-watch/themes_device_defaults.xml
index 7ac17595a278..60aec5342b4f 100644
--- a/core/res/res/values-watch/themes_device_defaults.xml
+++ b/core/res/res/values-watch/themes_device_defaults.xml
@@ -226,52 +226,6 @@ a similar way.
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorInverseOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorInversePrimary">@color/system_primary_light</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorInverseSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
</style>
<!-- DeviceDefault theme for a window that should look like the Settings app. -->
@@ -376,8 +330,8 @@ a similar way.
<item name="secondaryContentAlpha">@dimen/secondary_content_alpha_device_default</item>
</style>
- <!-- DeviceDefault theme for a window that will be displayed either full-screen on smaller
- screens (small, normal) or as a dialog on larger screens (large, xlarge). -->
+ <!-- DeviceDefault theme for a window that will be displayed either full-screen on smaller
+ screens (small, normal) or as a dialog on larger screens (large, xlarge). -->
<style name="Theme.DeviceDefault.DialogWhenLarge" parent="Theme.Material.DialogWhenLarge">
<!-- Color palette Dark -->
<item name="colorPrimary">@color/primary_device_default_dark</item>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 238aca556003..792974defe07 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1217,178 +1217,6 @@
a value of 'true' will not override any 'false' value in its parent chain nor will
it prevent any 'false' in any of its children. -->
<attr name="forceDarkAllowed" format="boolean" />
-
- <!-- Dynamic Tokens -->
-
- <!-- @hide -->
- <attr name="materialColorBackground" format="color"/>
- <!-- @hide -->
- <attr name="materialColorControlActivated" format="color"/>
- <!-- @hide -->
- <attr name="materialColorControlHighlight" format="color"/>
- <!-- @hide -->
- <attr name="materialColorControlNormal" format="color"/>
- <!-- @hide -->
- <attr name="materialColorError" format="color"/>
- <!-- @hide -->
- <attr name="materialColorErrorContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorInverseOnSurface" format="color"/>
- <!-- @hide -->
- <attr name="materialColorInversePrimary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorInverseSurface" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnBackground" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnError" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnErrorContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnPrimary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnPrimaryContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnSecondary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnSecondaryContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnSurface" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnSurfaceVariant" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnTertiary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnTertiaryContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOutline" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOutlineVariant" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPaletteKeyColorNeutral" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPaletteKeyColorNeutralVariant" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPaletteKeyColorPrimary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPaletteKeyColorSecondary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPaletteKeyColorTertiary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPrimary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPrimaryContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorScrim" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSecondary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSecondaryContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorShadow" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurface" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceBright" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceContainerHigh" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceContainerHighest" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceContainerLow" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceContainerLowest" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceDim" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceTint" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSurfaceVariant" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTertiary" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTertiaryContainer" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTextHintInverse" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTextPrimaryInverse" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTextPrimaryInverseDisableOnly" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTextSecondaryAndTertiaryInverse" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTextSecondaryAndTertiaryInverseDisabled" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnPrimaryFixed" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnPrimaryFixedVariant" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnSecondaryFixed" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnSecondaryFixedVariant" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnTertiaryFixed" format="color"/>
- <!-- @hide -->
- <attr name="materialColorOnTertiaryFixedVariant" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPrimaryFixed" format="color"/>
- <!-- @hide -->
- <attr name="materialColorPrimaryFixedDim" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSecondaryFixed" format="color"/>
- <!-- @hide -->
- <attr name="materialColorSecondaryFixedDim" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTertiaryFixed" format="color"/>
- <!-- @hide -->
- <attr name="materialColorTertiaryFixedDim" format="color"/>
- <!-- @hide -->
- <attr name="customColorBrandA" format="color"/>
- <!-- @hide -->
- <attr name="customColorBrandB" format="color"/>
- <!-- @hide -->
- <attr name="customColorBrandC" format="color"/>
- <!-- @hide -->
- <attr name="customColorBrandD" format="color"/>
- <!-- @hide -->
- <attr name="customColorClockHour" format="color"/>
- <!-- @hide -->
- <attr name="customColorClockMinute" format="color"/>
- <!-- @hide -->
- <attr name="customColorClockSecond" format="color"/>
- <!-- @hide -->
- <attr name="customColorOnShadeActive" format="color"/>
- <!-- @hide -->
- <attr name="customColorOnShadeActiveVariant" format="color"/>
- <!-- @hide -->
- <attr name="customColorOnShadeInactive" format="color"/>
- <!-- @hide -->
- <attr name="customColorOnShadeInactiveVariant" format="color"/>
- <!-- @hide -->
- <attr name="customColorOnThemeApp" format="color"/>
- <!-- @hide -->
- <attr name="customColorOverviewBackground" format="color"/>
- <!-- @hide -->
- <attr name="customColorShadeActive" format="color"/>
- <!-- @hide -->
- <attr name="customColorShadeDisabled" format="color"/>
- <!-- @hide -->
- <attr name="customColorShadeInactive" format="color"/>
- <!-- @hide -->
- <attr name="customColorThemeApp" format="color"/>
- <!-- @hide -->
- <attr name="customColorThemeAppRing" format="color"/>
- <!-- @hide -->
- <attr name="customColorThemeNotif" format="color"/>
- <!-- @hide -->
- <attr name="customColorUnderSurface" format="color"/>
- <!-- @hide -->
- <attr name="customColorWeatherTemp" format="color"/>
- <!-- @hide -->
- <attr name="customColorWidgetBackground" format="color"/>
-
</declare-styleable>
<!-- **************************************************************** -->
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 00c59c6c0edc..a06d184fd147 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -2572,7 +2572,9 @@
against a development branch, in which case it will only work against
the development builds. -->
<attr name="minSdkVersion" format="integer|string" />
- <!-- @FlaggedApi(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) -->
+ <!-- This is the minimum SDK major and minor version (e.g. "36.1") that
+ the application requires. Verified independently of minSdkVersion.
+ @FlaggedApi(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) -->
<attr name="minSdkVersionFull" format="string" />
<!-- This is the SDK version number that the application is targeting.
It is able to run on older versions (down to minSdkVersion), but
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 53b47622e8ae..89184bcc3721 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -7212,10 +7212,6 @@
screen. -->
<bool name="config_dragToMaximizeInDesktopMode">false</bool>
- <!-- Whether showing the app handle is supported on this device.
- If config_isDesktopModeSupported, then this has no effect -->
- <bool name="config_enableAppHandle">false</bool>
-
<!-- Frame rate compatibility value for Wallpaper
FRAME_RATE_COMPATIBILITY_MIN (102) is used by default for lower power consumption -->
<integer name="config_wallpaperFrameRateCompatibility">102</integer>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index f53acbfac71d..51bd4cc6cc8a 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -912,6 +912,8 @@
<dimen name="conversation_icon_size_badged">20dp</dimen>
<!-- size of the conversation avatar in an expanded group -->
<dimen name="conversation_avatar_size_group_expanded">@dimen/messaging_avatar_size</dimen>
+ <!-- size of the face pile icons (2025 redesign version) -->
+ <dimen name="notification_2025_face_pile_avatar_size">24dp</dimen>
<!-- size of the face pile icons -->
<dimen name="conversation_face_pile_avatar_size">32dp</dimen>
<!-- size of the face pile icons when the group is expanded -->
@@ -939,6 +941,18 @@
<!-- The size of the importance ring -->
<dimen name="importance_ring_size">20dp</dimen>
+ <!-- The spacing around the app icon badge shown next to the conversation icon -->
+ <dimen name="notification_2025_conversation_icon_badge_padding">2dp</dimen>
+
+ <!-- Top and start margin for the app icon badge shown next to the conversation icon, to align
+ it to the bottom end corner.
+ 40dp (conversation icon size) - 16dp (actual size of badge) - 2dp (badge padding) -->
+ <dimen name="notification_2025_conversation_icon_badge_position">22dp</dimen>
+
+ <!-- The size of the app icon badge shown next to the conversation icon, including its padding.
+ The actual size of the icon is 16dp, plus 2dp for each side for the padding. -->
+ <dimen name="notification_2025_conversation_icon_badge_size">20dp</dimen>
+
<!-- The top padding of the conversation icon container in the regular state-->
<dimen name="conversation_icon_container_top_padding">20dp</dimen>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 28de553f6063..6c01994b3c93 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -5445,133 +5445,51 @@
<java-symbol name="customColorWeatherTemp" type="color"/>
<java-symbol name="customColorWidgetBackground" type="color"/>
- <java-symbol type="attr" name="materialColorBackground"/>
- <java-symbol type="attr" name="materialColorControlActivated"/>
- <java-symbol type="attr" name="materialColorControlHighlight"/>
- <java-symbol type="attr" name="materialColorControlNormal"/>
- <java-symbol type="attr" name="materialColorError"/>
- <java-symbol type="attr" name="materialColorErrorContainer"/>
- <java-symbol type="attr" name="materialColorInverseOnSurface"/>
- <java-symbol type="attr" name="materialColorInversePrimary"/>
- <java-symbol type="attr" name="materialColorInverseSurface"/>
- <java-symbol type="attr" name="materialColorOnBackground"/>
- <java-symbol type="attr" name="materialColorOnError"/>
- <java-symbol type="attr" name="materialColorOnErrorContainer"/>
- <java-symbol type="attr" name="materialColorOnPrimary"/>
- <java-symbol type="attr" name="materialColorOnPrimaryContainer"/>
- <java-symbol type="attr" name="materialColorOnSecondary"/>
- <java-symbol type="attr" name="materialColorOnSecondaryContainer"/>
- <java-symbol type="attr" name="materialColorOnSurface"/>
- <java-symbol type="attr" name="materialColorOnSurfaceVariant"/>
- <java-symbol type="attr" name="materialColorOnTertiary"/>
- <java-symbol type="attr" name="materialColorOnTertiaryContainer"/>
- <java-symbol type="attr" name="materialColorOutline"/>
- <java-symbol type="attr" name="materialColorOutlineVariant"/>
- <java-symbol type="attr" name="materialColorPaletteKeyColorNeutral"/>
- <java-symbol type="attr" name="materialColorPaletteKeyColorNeutralVariant"/>
- <java-symbol type="attr" name="materialColorPaletteKeyColorPrimary"/>
- <java-symbol type="attr" name="materialColorPaletteKeyColorSecondary"/>
- <java-symbol type="attr" name="materialColorPaletteKeyColorTertiary"/>
- <java-symbol type="attr" name="materialColorPrimary"/>
- <java-symbol type="attr" name="materialColorPrimaryContainer"/>
- <java-symbol type="attr" name="materialColorScrim"/>
- <java-symbol type="attr" name="materialColorSecondary"/>
- <java-symbol type="attr" name="materialColorSecondaryContainer"/>
- <java-symbol type="attr" name="materialColorShadow"/>
- <java-symbol type="attr" name="materialColorSurface"/>
- <java-symbol type="attr" name="materialColorSurfaceBright"/>
- <java-symbol type="attr" name="materialColorSurfaceContainer"/>
- <java-symbol type="attr" name="materialColorSurfaceContainerHigh"/>
- <java-symbol type="attr" name="materialColorSurfaceContainerHighest"/>
- <java-symbol type="attr" name="materialColorSurfaceContainerLow"/>
- <java-symbol type="attr" name="materialColorSurfaceContainerLowest"/>
- <java-symbol type="attr" name="materialColorSurfaceDim"/>
- <java-symbol type="attr" name="materialColorSurfaceTint"/>
- <java-symbol type="attr" name="materialColorSurfaceVariant"/>
- <java-symbol type="attr" name="materialColorTertiary"/>
- <java-symbol type="attr" name="materialColorTertiaryContainer"/>
- <java-symbol type="attr" name="materialColorTextHintInverse"/>
- <java-symbol type="attr" name="materialColorTextPrimaryInverse"/>
- <java-symbol type="attr" name="materialColorTextPrimaryInverseDisableOnly"/>
- <java-symbol type="attr" name="materialColorTextSecondaryAndTertiaryInverse"/>
- <java-symbol type="attr" name="materialColorTextSecondaryAndTertiaryInverseDisabled"/>
- <java-symbol type="attr" name="materialColorOnPrimaryFixed"/>
- <java-symbol type="attr" name="materialColorOnPrimaryFixedVariant"/>
- <java-symbol type="attr" name="materialColorOnSecondaryFixed"/>
- <java-symbol type="attr" name="materialColorOnSecondaryFixedVariant"/>
- <java-symbol type="attr" name="materialColorOnTertiaryFixed"/>
- <java-symbol type="attr" name="materialColorOnTertiaryFixedVariant"/>
- <java-symbol type="attr" name="materialColorPrimaryFixed"/>
- <java-symbol type="attr" name="materialColorPrimaryFixedDim"/>
- <java-symbol type="attr" name="materialColorSecondaryFixed"/>
- <java-symbol type="attr" name="materialColorSecondaryFixedDim"/>
- <java-symbol type="attr" name="materialColorTertiaryFixed"/>
- <java-symbol type="attr" name="materialColorTertiaryFixedDim"/>
- <java-symbol type="attr" name="customColorBrandA"/>
- <java-symbol type="attr" name="customColorBrandB"/>
- <java-symbol type="attr" name="customColorBrandC"/>
- <java-symbol type="attr" name="customColorBrandD"/>
- <java-symbol type="attr" name="customColorClockHour"/>
- <java-symbol type="attr" name="customColorClockMinute"/>
- <java-symbol type="attr" name="customColorClockSecond"/>
- <java-symbol type="attr" name="customColorOnShadeActive"/>
- <java-symbol type="attr" name="customColorOnShadeActiveVariant"/>
- <java-symbol type="attr" name="customColorOnShadeInactive"/>
- <java-symbol type="attr" name="customColorOnShadeInactiveVariant"/>
- <java-symbol type="attr" name="customColorOnThemeApp"/>
- <java-symbol type="attr" name="customColorOverviewBackground"/>
- <java-symbol type="attr" name="customColorShadeActive"/>
- <java-symbol type="attr" name="customColorShadeDisabled"/>
- <java-symbol type="attr" name="customColorShadeInactive"/>
- <java-symbol type="attr" name="customColorThemeApp"/>
- <java-symbol type="attr" name="customColorThemeAppRing"/>
- <java-symbol type="attr" name="customColorThemeNotif"/>
- <java-symbol type="attr" name="customColorUnderSurface"/>
- <java-symbol type="attr" name="customColorWeatherTemp"/>
- <java-symbol type="attr" name="customColorWidgetBackground"/>
-
- <java-symbol name="system_widget_background_light" type="color"/>
- <java-symbol name="system_clock_hour_light" type="color"/>
- <java-symbol name="system_clock_minute_light" type="color"/>
- <java-symbol name="system_clock_second_light" type="color"/>
- <java-symbol name="system_theme_app_light" type="color"/>
- <java-symbol name="system_on_theme_app_light" type="color"/>
- <java-symbol name="system_theme_app_ring_light" type="color"/>
- <java-symbol name="system_theme_notif_light" type="color"/>
<java-symbol name="system_brand_a_light" type="color"/>
<java-symbol name="system_brand_b_light" type="color"/>
<java-symbol name="system_brand_c_light" type="color"/>
<java-symbol name="system_brand_d_light" type="color"/>
- <java-symbol name="system_under_surface_light" type="color"/>
- <java-symbol name="system_shade_active_light" type="color"/>
+ <java-symbol name="system_clock_hour_light" type="color"/>
+ <java-symbol name="system_clock_minute_light" type="color"/>
+ <java-symbol name="system_clock_second_light" type="color"/>
<java-symbol name="system_on_shade_active_light" type="color"/>
<java-symbol name="system_on_shade_active_variant_light" type="color"/>
- <java-symbol name="system_shade_inactive_light" type="color"/>
<java-symbol name="system_on_shade_inactive_light" type="color"/>
<java-symbol name="system_on_shade_inactive_variant_light" type="color"/>
- <java-symbol name="system_shade_disabled_light" type="color"/>
+ <java-symbol name="system_on_theme_app_light" type="color"/>
<java-symbol name="system_overview_background_light" type="color"/>
- <java-symbol name="system_widget_background_dark" type="color"/>
- <java-symbol name="system_clock_hour_dark" type="color"/>
- <java-symbol name="system_clock_minute_dark" type="color"/>
- <java-symbol name="system_clock_second_dark" type="color"/>
- <java-symbol name="system_theme_app_dark" type="color"/>
- <java-symbol name="system_on_theme_app_dark" type="color"/>
- <java-symbol name="system_theme_app_ring_dark" type="color"/>
- <java-symbol name="system_theme_notif_dark" type="color"/>
+ <java-symbol name="system_shade_active_light" type="color"/>
+ <java-symbol name="system_shade_disabled_light" type="color"/>
+ <java-symbol name="system_shade_inactive_light" type="color"/>
+ <java-symbol name="system_theme_app_light" type="color"/>
+ <java-symbol name="system_theme_app_ring_light" type="color"/>
+ <java-symbol name="system_theme_notif_light" type="color"/>
+ <java-symbol name="system_under_surface_light" type="color"/>
+ <java-symbol name="system_weather_temp_light" type="color"/>
+ <java-symbol name="system_widget_background_light" type="color"/>
+
<java-symbol name="system_brand_a_dark" type="color"/>
<java-symbol name="system_brand_b_dark" type="color"/>
<java-symbol name="system_brand_c_dark" type="color"/>
<java-symbol name="system_brand_d_dark" type="color"/>
- <java-symbol name="system_under_surface_dark" type="color"/>
- <java-symbol name="system_shade_active_dark" type="color"/>
+ <java-symbol name="system_clock_hour_dark" type="color"/>
+ <java-symbol name="system_clock_minute_dark" type="color"/>
+ <java-symbol name="system_clock_second_dark" type="color"/>
<java-symbol name="system_on_shade_active_dark" type="color"/>
<java-symbol name="system_on_shade_active_variant_dark" type="color"/>
- <java-symbol name="system_shade_inactive_dark" type="color"/>
<java-symbol name="system_on_shade_inactive_dark" type="color"/>
<java-symbol name="system_on_shade_inactive_variant_dark" type="color"/>
- <java-symbol name="system_shade_disabled_dark" type="color"/>
+ <java-symbol name="system_on_theme_app_dark" type="color"/>
<java-symbol name="system_overview_background_dark" type="color"/>
+ <java-symbol name="system_shade_active_dark" type="color"/>
+ <java-symbol name="system_shade_disabled_dark" type="color"/>
+ <java-symbol name="system_shade_inactive_dark" type="color"/>
+ <java-symbol name="system_theme_app_dark" type="color"/>
+ <java-symbol name="system_theme_app_ring_dark" type="color"/>
+ <java-symbol name="system_theme_notif_dark" type="color"/>
+ <java-symbol name="system_under_surface_dark" type="color"/>
+ <java-symbol name="system_weather_temp_dark" type="color"/>
+ <java-symbol name="system_widget_background_dark" type="color"/>
<java-symbol type="attr" name="actionModeUndoDrawable" />
<java-symbol type="attr" name="actionModeRedoDrawable" />
@@ -5763,9 +5681,6 @@
screen. -->
<java-symbol type="bool" name="config_dragToMaximizeInDesktopMode" />
- <!-- Whether showing the app handle is supported on this device -->
- <java-symbol type="bool" name="config_enableAppHandle" />
-
<!-- Frame rate compatibility value for Wallpaper -->
<java-symbol type="integer" name="config_wallpaperFrameRateCompatibility" />
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index d8346d87f624..6b3d4271a609 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -131,7 +131,7 @@ easier.
<item name="progressBarStyleSmallInverse">@style/Widget.DeviceDefault.ProgressBar.Small.Inverse</item>
<item name="progressBarStyleLargeInverse">@style/Widget.DeviceDefault.ProgressBar.Large.Inverse</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="seekBarStyle">@style/Widget.DeviceDefault.SeekBar</item>
<item name="ratingBarStyle">@style/Widget.DeviceDefault.RatingBar</item>
<item name="ratingBarStyleIndicator">@style/Widget.DeviceDefault.RatingBar.Indicator</item>
@@ -238,91 +238,6 @@ easier.
<item name="textColorOnAccent">@color/system_on_primary_dark</item>
<item name="colorForeground">@color/foreground_device_default_dark</item>
<item name="colorForegroundInverse">@color/foreground_device_default_light</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<style name="Theme.DeviceDefault" parent="Theme.DeviceDefaultBase" />
@@ -368,96 +283,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar. This theme
@@ -502,96 +332,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar and
@@ -638,96 +383,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent
@@ -773,96 +433,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- DeviceDefault theme for dialog windows and activities. This changes the window to be
@@ -916,96 +491,11 @@ easier.
<item name="alertDialogTheme">@style/Theme.DeviceDefault.Dialog.Alert</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Dialog} that has a nice minimum width for a
@@ -1050,96 +540,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Dialog} without an action bar -->
@@ -1183,96 +588,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Dialog_NoActionBar} that has a nice minimum width
@@ -1317,96 +637,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Variant of Theme.DeviceDefault.Dialog that has a fixed size. -->
@@ -1467,96 +702,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- DeviceDefault theme for a window without an action bar that will be displayed either
@@ -1602,96 +752,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- DeviceDefault theme for a presentation window on a secondary display. -->
@@ -1735,96 +800,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- DeviceDefault theme for panel windows. This removes all extraneous window
@@ -1870,96 +850,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear
@@ -2004,96 +899,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear
@@ -2138,96 +948,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- DeviceDefault style for input methods, which is used by the
@@ -2272,96 +997,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- DeviceDefault style for input methods, which is used by the
@@ -2406,96 +1046,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Material.Dialog.Alert">
@@ -2540,96 +1095,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Theme for the dialog shown when an app crashes or ANRs. -->
@@ -2679,96 +1149,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Material.Dialog.NoFrame">
@@ -2811,96 +1196,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style -->
@@ -2982,7 +1282,7 @@ easier.
<item name="progressBarStyleSmallInverse">@style/Widget.DeviceDefault.Light.ProgressBar.Small.Inverse</item>
<item name="progressBarStyleLargeInverse">@style/Widget.DeviceDefault.Light.ProgressBar.Large.Inverse</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="seekBarStyle">@style/Widget.DeviceDefault.Light.SeekBar</item>
<item name="ratingBarStyle">@style/Widget.DeviceDefault.Light.RatingBar</item>
<item name="ratingBarStyleIndicator">@style/Widget.DeviceDefault.Light.RatingBar.Indicator</item>
@@ -3086,91 +1386,6 @@ easier.
<item name="colorForegroundInverse">@color/foreground_device_default_dark</item>
<item name="colorPopupBackground">?attr/colorBackgroundFloating</item>
<item name="panelColorBackground">?attr/colorBackgroundFloating</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of the DeviceDefault (light) theme that has a solid (opaque) action bar with an
@@ -3215,96 +1430,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar -->
@@ -3348,96 +1478,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar.
@@ -3482,96 +1527,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar
@@ -3618,96 +1578,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent
@@ -3753,96 +1628,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- DeviceDefault light theme for dialog windows and activities. This changes the window to be
@@ -3894,96 +1684,11 @@ easier.
<item name="colorForegroundInverse">@color/foreground_device_default_dark</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} that has a nice minimum width for a
@@ -4031,96 +1736,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} without an action bar -->
@@ -4167,96 +1787,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog_NoActionBar} that has a nice minimum
@@ -4304,96 +1839,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of Theme.DeviceDefault.Dialog that has a fixed size. -->
@@ -4427,91 +1877,6 @@ easier.
<item name="textColorOnAccent">@color/system_on_primary_dark</item>
<item name="colorForeground">@color/foreground_device_default_light</item>
<item name="colorForegroundInverse">@color/foreground_device_default_dark</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of Theme.DeviceDefault.Dialog.NoActionBar that has a fixed size. -->
@@ -4545,91 +1910,6 @@ easier.
<item name="textColorOnAccent">@color/system_on_primary_dark</item>
<item name="colorForeground">@color/foreground_device_default_light</item>
<item name="colorForegroundInverse">@color/foreground_device_default_dark</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- DeviceDefault light theme for a window that will be displayed either full-screen on smaller
@@ -4677,96 +1957,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- DeviceDefault light theme for a window without an action bar that will be displayed either
@@ -4815,96 +2010,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- DeviceDefault light theme for a presentation window on a secondary display. -->
@@ -4951,96 +2061,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- DeviceDefault light theme for panel windows. This removes all extraneous window
@@ -5086,96 +2111,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Material.Light.Dialog.Alert">
@@ -5220,96 +2160,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.Dialog.Alert.DayNight" parent="Theme.DeviceDefault.Light.Dialog.Alert" />
@@ -5354,96 +2209,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.Light.Voice" parent="Theme.Material.Light.Voice">
@@ -5486,96 +2256,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- DeviceDefault theme for a window that should look like the Settings app. -->
@@ -5631,90 +2316,6 @@ easier.
<item name="colorListDivider">@color/list_divider_color_light</item>
<item name="opacityListDivider">@color/list_divider_opacity_device_default_light</item>
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.SystemUI" parent="Theme.DeviceDefault.Light">
@@ -5745,96 +2346,12 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.SystemUI.Dialog" parent="Theme.DeviceDefault.Light.Dialog">
@@ -5857,96 +2374,12 @@ easier.
<item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Variant of {@link #Theme_DeviceDefault_Settings_Dark} with no action bar -->
@@ -5991,96 +2424,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<style name="Theme.DeviceDefault.Settings.DialogBase" parent="Theme.Material.Light.BaseDialog">
@@ -6114,91 +2462,6 @@ easier.
<!-- Dialog attributes -->
<item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.Settings.Dialog" parent="Theme.DeviceDefault.Settings.DialogBase">
@@ -6216,7 +2479,7 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
@@ -6267,96 +2530,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.Settings.Dialog.Alert" parent="Theme.Material.Settings.Dialog.Alert">
@@ -6403,96 +2581,11 @@ easier.
<item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
<!-- Progress bar attributes -->
- <item name="colorProgressBackgroundNormal">?attr/materialColorOutline</item>
+ <item name="colorProgressBackgroundNormal">@color/materialColorOutline</item>
<item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
<!-- Toolbar attributes -->
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.Settings.Dialog.NoActionBar" parent="Theme.DeviceDefault.Light.Dialog.NoActionBar" />
@@ -6570,91 +2663,6 @@ easier.
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/system_secondary_dark</item>
<item name="colorAccentTertiary">@color/system_tertiary_dark</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<style name="ThemeOverlay.DeviceDefault.Accent.Light">
@@ -6662,91 +2670,6 @@ easier.
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/system_secondary_dark</item>
<item name="colorAccentTertiary">@color/system_tertiary_dark</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<!-- Theme overlay that replaces colorAccent with the colorAccent from {@link #Theme_DeviceDefault_DayNight}. -->
@@ -6758,91 +2681,6 @@ easier.
<item name="colorAccentPrimary">@color/accent_primary_device_default</item>
<item name="colorAccentSecondary">@color/system_secondary_dark</item>
<item name="colorAccentTertiary">@color/system_tertiary_dark</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<style name="Theme.DeviceDefault.Light.Dialog.Alert.UserSwitchingDialog" parent="Theme.DeviceDefault.NoActionBar.Fullscreen">
@@ -6850,91 +2688,6 @@ easier.
<item name="colorBackgroundFloating">@color/background_device_default_light</item>
<item name="layout_gravity">center</item>
<item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
-
- <item name="materialColorBackground">@color/system_background_light</item>
- <item name="materialColorControlActivated">@color/system_control_activated_light</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_light</item>
- <item name="materialColorControlNormal">@color/system_control_normal_light</item>
- <item name="materialColorError">@color/system_error_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_light</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_light</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_light</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_light</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_light</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_light</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorScrim">@color/system_scrim_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorShadow">@color/system_shadow_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_light</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_light</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_light</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_light</item>
- <item name="customColorBrandB">@color/system_brand_b_light</item>
- <item name="customColorBrandC">@color/system_brand_c_light</item>
- <item name="customColorBrandD">@color/system_brand_d_light</item>
- <item name="customColorClockHour">@color/system_clock_hour_light</item>
- <item name="customColorClockMinute">@color/system_clock_minute_light</item>
- <item name="customColorClockSecond">@color/system_clock_second_light</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_light</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_light</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_light</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_light</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_light</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_light</item>
- <item name="customColorShadeActive">@color/system_shade_active_light</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_light</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_light</item>
- <item name="customColorThemeApp">@color/system_theme_app_light</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_light</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_light</item>
- <item name="customColorUnderSurface">@color/system_under_surface_light</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_light</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_light</item>
</style>
<style name="Theme.DeviceDefault.Notification" parent="@style/Theme.Material.Notification">
@@ -6953,91 +2706,6 @@ easier.
<item name="colorAccentPrimary">@color/system_accent1_100</item>
<item name="textColorPrimary">@color/system_neutral1_900</item>
<item name="textColorSecondary">@color/system_neutral2_700</item>
-
- <item name="materialColorBackground">@color/system_background_dark</item>
- <item name="materialColorControlActivated">@color/system_control_activated_dark</item>
- <item name="materialColorControlHighlight">@color/system_control_highlight_dark</item>
- <item name="materialColorControlNormal">@color/system_control_normal_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorInverseOnSurface">@color/system_inverse_on_surface_dark</item>
- <item name="materialColorInversePrimary">@color/system_inverse_primary_dark</item>
- <item name="materialColorInverseSurface">@color/system_inverse_surface_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorPaletteKeyColorNeutral">@color/system_palette_key_color_neutral_dark</item>
- <item name="materialColorPaletteKeyColorNeutralVariant">@color/system_palette_key_color_neutral_variant_dark</item>
- <item name="materialColorPaletteKeyColorPrimary">@color/system_palette_key_color_primary_dark</item>
- <item name="materialColorPaletteKeyColorSecondary">@color/system_palette_key_color_secondary_dark</item>
- <item name="materialColorPaletteKeyColorTertiary">@color/system_palette_key_color_tertiary_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorScrim">@color/system_scrim_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorShadow">@color/system_shadow_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceTint">@color/system_surface_tint_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTextHintInverse">@color/system_text_hint_inverse_dark</item>
- <item name="materialColorTextPrimaryInverse">@color/system_text_primary_inverse_dark</item>
- <item name="materialColorTextPrimaryInverseDisableOnly">@color/system_text_primary_inverse_disable_only_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverse">@color/system_text_secondary_and_tertiary_inverse_dark</item>
- <item name="materialColorTextSecondaryAndTertiaryInverseDisabled">@color/system_text_secondary_and_tertiary_inverse_disabled_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="customColorBrandA">@color/system_brand_a_dark</item>
- <item name="customColorBrandB">@color/system_brand_b_dark</item>
- <item name="customColorBrandC">@color/system_brand_c_dark</item>
- <item name="customColorBrandD">@color/system_brand_d_dark</item>
- <item name="customColorClockHour">@color/system_clock_hour_dark</item>
- <item name="customColorClockMinute">@color/system_clock_minute_dark</item>
- <item name="customColorClockSecond">@color/system_clock_second_dark</item>
- <item name="customColorOnShadeActive">@color/system_on_shade_active_dark</item>
- <item name="customColorOnShadeActiveVariant">@color/system_on_shade_active_variant_dark</item>
- <item name="customColorOnShadeInactive">@color/system_on_shade_inactive_dark</item>
- <item name="customColorOnShadeInactiveVariant">@color/system_on_shade_inactive_variant_dark</item>
- <item name="customColorOnThemeApp">@color/system_on_theme_app_dark</item>
- <item name="customColorOverviewBackground">@color/system_overview_background_dark</item>
- <item name="customColorShadeActive">@color/system_shade_active_dark</item>
- <item name="customColorShadeDisabled">@color/system_shade_disabled_dark</item>
- <item name="customColorShadeInactive">@color/system_shade_inactive_dark</item>
- <item name="customColorThemeApp">@color/system_theme_app_dark</item>
- <item name="customColorThemeAppRing">@color/system_theme_app_ring_dark</item>
- <item name="customColorThemeNotif">@color/system_theme_notif_dark</item>
- <item name="customColorUnderSurface">@color/system_under_surface_dark</item>
- <item name="customColorWeatherTemp">@color/system_weather_temp_dark</item>
- <item name="customColorWidgetBackground">@color/system_widget_background_dark</item>
</style>
<style name="Theme.DeviceDefault.AutofillHalfScreenDialogList" parent="Theme.DeviceDefault.DayNight">
<item name="colorListDivider">@color/list_divider_opacity_device_default_light</item>
diff --git a/core/tests/coretests/src/android/app/NotificationManagerTest.java b/core/tests/coretests/src/android/app/NotificationManagerTest.java
new file mode 100644
index 000000000000..3213abe13d8a
--- /dev/null
+++ b/core/tests/coretests/src/android/app/NotificationManagerTest.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.atMost;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.annotations.Presubmit;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.time.Instant;
+import java.time.InstantSource;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+@Presubmit
+public class NotificationManagerTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+ private Context mContext;
+ private NotificationManagerWithMockService mNotificationManager;
+ private final FakeClock mClock = new FakeClock();
+
+ @Before
+ public void setUp() {
+ mContext = ApplicationProvider.getApplicationContext();
+ mNotificationManager = new NotificationManagerWithMockService(mContext, mClock);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY)
+ public void notify_rapidUpdate_isThrottled() throws Exception {
+ Notification n = exampleNotification();
+
+ for (int i = 0; i < 100; i++) {
+ mNotificationManager.notify(1, n);
+ mClock.advanceByMillis(5);
+ }
+
+ verify(mNotificationManager.mBackendService, atMost(30)).enqueueNotificationWithTag(any(),
+ any(), any(), anyInt(), any(), anyInt());
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY)
+ public void notify_reasonableUpdate_isNotThrottled() throws Exception {
+ Notification n = exampleNotification();
+
+ for (int i = 0; i < 100; i++) {
+ mNotificationManager.notify(1, n);
+ mClock.advanceByMillis(300);
+ }
+
+ verify(mNotificationManager.mBackendService, times(100)).enqueueNotificationWithTag(any(),
+ any(), any(), anyInt(), any(), anyInt());
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY)
+ public void notify_rapidAdd_isNotThrottled() throws Exception {
+ Notification n = exampleNotification();
+
+ for (int i = 0; i < 100; i++) {
+ mNotificationManager.notify(i, n);
+ mClock.advanceByMillis(5);
+ }
+
+ verify(mNotificationManager.mBackendService, times(100)).enqueueNotificationWithTag(any(),
+ any(), any(), anyInt(), any(), anyInt());
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY)
+ public void notify_rapidAddAndCancel_isNotThrottled() throws Exception {
+ Notification n = exampleNotification();
+
+ for (int i = 0; i < 100; i++) {
+ mNotificationManager.notify(1, n);
+ mNotificationManager.cancel(1);
+ mClock.advanceByMillis(5);
+ }
+
+ verify(mNotificationManager.mBackendService, times(100)).enqueueNotificationWithTag(any(),
+ any(), any(), anyInt(), any(), anyInt());
+ }
+
+ private Notification exampleNotification() {
+ return new Notification.Builder(mContext, "channel")
+ .setSmallIcon(android.R.drawable.star_big_on)
+ .build();
+ }
+
+ private static class NotificationManagerWithMockService extends NotificationManager {
+
+ private final INotificationManager mBackendService;
+
+ NotificationManagerWithMockService(Context context, InstantSource clock) {
+ super(context, clock);
+ mBackendService = mock(INotificationManager.class);
+ }
+
+ @Override
+ public INotificationManager service() {
+ return mBackendService;
+ }
+ }
+
+ private static class FakeClock implements InstantSource {
+
+ private long mNowMillis = 441644400000L;
+
+ @Override
+ public Instant instant() {
+ return Instant.ofEpochMilli(mNowMillis);
+ }
+
+ private void advanceByMillis(long millis) {
+ mNowMillis += millis;
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java b/core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java
index 6d2dd5355ff0..ff3abae29b4a 100644
--- a/core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java
+++ b/core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java
@@ -33,7 +33,6 @@ import android.content.pm.parsing.result.ParseTypeImpl;
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
import android.platform.test.annotations.Presubmit;
-import android.platform.test.annotations.RequiresFlagsEnabled;
import android.util.ArraySet;
import android.util.PackageUtils;
@@ -62,7 +61,6 @@ import java.util.List;
import java.util.Set;
@Presubmit
-@RequiresFlagsEnabled(android.content.pm.Flags.FLAG_SDK_DEPENDENCY_INSTALLER)
public class ApkLiteParseUtilsTest {
@Rule
diff --git a/core/tests/coretests/src/android/view/ViewGroupTest.java b/core/tests/coretests/src/android/view/ViewGroupTest.java
index 43c404e849fe..ae3ad36b532c 100644
--- a/core/tests/coretests/src/android/view/ViewGroupTest.java
+++ b/core/tests/coretests/src/android/view/ViewGroupTest.java
@@ -213,35 +213,6 @@ public class ViewGroupTest {
assertTrue(autofillableViews.containsAll(Arrays.asList(viewA, viewC)));
}
- @Test
- public void testMeasureCache() {
- final int spec1 = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.AT_MOST);
- final int spec2 = View.MeasureSpec.makeMeasureSpec(50, View.MeasureSpec.AT_MOST);
- final Context context = getInstrumentation().getContext();
- final View child = new View(context);
- final TestView parent = new TestView(context, 0);
- parent.addView(child);
-
- child.setPadding(1, 2, 3, 4);
- parent.measure(spec1, spec1);
- assertEquals(4, parent.getMeasuredWidth());
- assertEquals(6, parent.getMeasuredHeight());
-
- child.setPadding(5, 6, 7, 8);
- parent.measure(spec2, spec2);
- assertEquals(12, parent.getMeasuredWidth());
- assertEquals(14, parent.getMeasuredHeight());
-
- // This ends the state of forceLayout.
- parent.layout(0, 0, 50, 50);
-
- // The cached values should be cleared after the new setPadding is called. And the measured
- // width and height should be up-to-date.
- parent.measure(spec1, spec1);
- assertEquals(12, parent.getMeasuredWidth());
- assertEquals(14, parent.getMeasuredHeight());
- }
-
private static void getUnobscuredTouchableRegion(Region outRegion, View view) {
outRegion.set(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
final ViewParent parent = view.getParent();
@@ -269,19 +240,6 @@ public class ViewGroupTest {
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// We don't layout this view.
}
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int measuredWidth = 0;
- int measuredHeight = 0;
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
- final View child = getChildAt(i);
- measuredWidth += child.getPaddingLeft() + child.getPaddingRight();
- measuredHeight += child.getPaddingTop() + child.getPaddingBottom();
- }
- setMeasuredDimension(measuredWidth, measuredHeight);
- }
}
public static class AutofillableTestView extends TestView {
diff --git a/core/tests/overlaytests/device_self_targeting/Android.bp b/core/tests/overlaytests/device_self_targeting/Android.bp
index 931eac515e31..14a3cdf98436 100644
--- a/core/tests/overlaytests/device_self_targeting/Android.bp
+++ b/core/tests/overlaytests/device_self_targeting/Android.bp
@@ -31,6 +31,7 @@ android_test {
"androidx.test.ext.junit",
"mockito-target-minus-junit4",
"truth",
+ "flag-junit",
],
optimize: {
diff --git a/core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java b/core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java
index 28d6545c8a5b..bcf1446b3467 100644
--- a/core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java
+++ b/core/tests/overlaytests/device_self_targeting/src/com/android/overlaytest/OverlayManagerImplTest.java
@@ -16,6 +16,7 @@
package com.android.overlaytest;
+import static android.content.res.Flags.FLAG_SELF_TARGETING_ANDROID_RESOURCE_FRRO;
import static android.content.Context.MODE_PRIVATE;
import static android.content.pm.PackageManager.SIGNATURE_NO_MATCH;
@@ -41,6 +42,8 @@ import android.os.FabricatedOverlayInternal;
import android.os.FabricatedOverlayInternalEntry;
import android.os.ParcelFileDescriptor;
import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.util.Log;
import android.util.Pair;
import android.util.TypedValue;
@@ -76,6 +79,8 @@ import java.util.List;
*/
@RunWith(AndroidJUnit4.class)
public class OverlayManagerImplTest {
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
private static final String TAG = "OverlayManagerImplTest";
private static final String TARGET_COLOR_RES = "color/mycolor";
@@ -210,6 +215,22 @@ public class OverlayManagerImplTest {
}
@Test
+ @DisableFlags(FLAG_SELF_TARGETING_ANDROID_RESOURCE_FRRO)
+ public void registerOverlay_forAndroidPackage_shouldFail() {
+ FabricatedOverlayInternal overlayInternal =
+ createOverlayWithName(
+ mOverlayName,
+ SYSTEM_APP_OVERLAYABLE,
+ "android",
+ List.of(Pair.create("color/white", Pair.create(null, Color.BLACK))));
+
+ assertThrows(
+ "Wrong target package name",
+ IllegalArgumentException.class,
+ () -> mOverlayManagerImpl.registerFabricatedOverlay(overlayInternal));
+ }
+
+ @Test
public void getOverlayInfosForTarget_defaultShouldBeZero() {
List<OverlayInfo> overlayInfos =
mOverlayManagerImpl.getOverlayInfosForTarget(mContext.getPackageName());
diff --git a/core/tests/overlaytests/host/Android.bp b/core/tests/overlaytests/host/Android.bp
index 634098074cca..9b7200436f02 100644
--- a/core/tests/overlaytests/host/Android.bp
+++ b/core/tests/overlaytests/host/Android.bp
@@ -28,14 +28,14 @@ java_test_host {
test_suites: [
"device-tests",
],
- target_required: [
- "OverlayHostTests_NonPlatformSignatureOverlay",
- "OverlayHostTests_PlatformSignatureStaticOverlay",
- "OverlayHostTests_PlatformSignatureOverlay",
- "OverlayHostTests_UpdateOverlay",
- "OverlayHostTests_FrameworkOverlayV1",
- "OverlayHostTests_FrameworkOverlayV2",
- "OverlayHostTests_AppOverlayV1",
- "OverlayHostTests_AppOverlayV2",
+ device_common_data: [
+ ":OverlayHostTests_NonPlatformSignatureOverlay",
+ ":OverlayHostTests_PlatformSignatureStaticOverlay",
+ ":OverlayHostTests_PlatformSignatureOverlay",
+ ":OverlayHostTests_UpdateOverlay",
+ ":OverlayHostTests_FrameworkOverlayV1",
+ ":OverlayHostTests_FrameworkOverlayV2",
+ ":OverlayHostTests_AppOverlayV1",
+ ":OverlayHostTests_AppOverlayV2",
],
}
diff --git a/libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml b/libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml
index ab1ab984fd5f..87d36288cfd5 100644
--- a/libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml
+++ b/libs/WindowManager/Shell/res/color/bubble_drop_target_background_color.xml
@@ -16,5 +16,5 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:alpha="0.35" android:color="?androidprv:attr/materialColorPrimaryContainer" />
+ <item android:alpha="0.35" android:color="@androidprv:color/materialColorPrimaryContainer" />
</selector> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
index 640d184e641c..047f22fe0383 100644
--- a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
+++ b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
@@ -22,5 +22,5 @@
android:color="?androidprv:attr/colorAccentPrimary"/>
<item android:state_selected="true"
android:color="?androidprv:attr/colorAccentPrimary"/>
- <item android:color="?androidprv:attr/materialColorOutlineVariant"/>
+ <item android:color="@androidprv:color/materialColorOutlineVariant"/>
</selector> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml b/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml
index 0f9b28a07bde..9741b94f3ddb 100644
--- a/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml
+++ b/libs/WindowManager/Shell/res/color/open_by_default_settings_dialog_radio_button_color.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_checked="true"
- android:color="?androidprv:attr/materialColorPrimaryContainer"/>
- <item android:color="?androidprv:attr/materialColorSurfaceContainer"/>
+ android:color="@androidprv:color/materialColorPrimaryContainer"/>
+ <item android:color="@androidprv:color/materialColorSurfaceContainer"/>
</selector>
diff --git a/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml b/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml
index b928a0b20764..20e00e1a9b90 100644
--- a/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml
@@ -21,6 +21,6 @@
<solid android:color="@color/bubble_drop_target_background_color" />
<stroke
android:width="1dp"
- android:color="?androidprv:attr/materialColorPrimaryContainer" />
+ android:color="@androidprv:color/materialColorPrimaryContainer" />
</shape>
</inset>
diff --git a/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml b/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml
index 657720ee6088..5acca45654f0 100644
--- a/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml
+++ b/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml
@@ -19,7 +19,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
<solid
- android:color="?androidprv:attr/materialColorSurfaceContainerHigh"
+ android:color="@androidprv:color/materialColorSurfaceContainerHigh"
/>
<corners android:radius="18sp" />
diff --git a/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml b/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml
index 8fd2e68f6451..f4d1de89d7a3 100644
--- a/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml
+++ b/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml
@@ -17,7 +17,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceBright" />
+ <solid android:color="@androidprv:color/materialColorSurfaceBright" />
<corners
android:bottomLeftRadius="?android:attr/dialogCornerRadius"
android:topLeftRadius="?android:attr/dialogCornerRadius"
diff --git a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml
deleted file mode 100644
index f3800e05148e..000000000000
--- a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_button_dark.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2024 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
- android:width="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:fillColor="#000000"
- android:pathData="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"/>
-</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_or_maximize_exit_button_dark.xml
index 5260450e8a13..b6289e2d6dd7 100644
--- a/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml
+++ b/libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_or_maximize_exit_button_dark.xml
@@ -21,6 +21,6 @@
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
- android:fillColor="@android:color/white"
- android:pathData="M240,840L240,720L120,720L120,640L320,640L320,840L240,840ZM640,840L640,640L840,640L840,720L720,720L720,840L640,840ZM120,320L120,240L240,240L240,120L320,120L320,320L120,320ZM640,320L640,120L720,120L720,240L840,240L840,320L640,320Z"/>
+ android:fillColor="@android:color/black"
+ android:pathData="M520,560L600,560L600,560ZM320,720Q287,720 263.5,696.5Q240,673 240,640L240,160Q240,127 263.5,103.5Q287,80 320,80L800,80Q833,80 856.5,103.5Q880,127 880,160L880,640Q880,673 856.5,696.5Q833,720 800,720L320,720ZM320,640L800,640Q800,640 800,640Q800,640 800,640L800,160Q800,160 800,160Q800,160 800,160L320,160Q320,160 320,160Q320,160 320,160L320,640Q320,640 320,640Q320,640 320,640ZM160,880Q127,880 103.5,856.5Q80,833 80,800L80,240L160,240L160,800Q160,800 160,800Q160,800 160,800L720,800L720,880L160,880ZM320,160L320,160Q320,160 320,160Q320,160 320,160L320,640Q320,640 320,640Q320,640 320,640L320,640Q320,640 320,640Q320,640 320,640L320,160Q320,160 320,160Q320,160 320,160Z"/>
</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml
index 15837adc2c77..5769a851a8f0 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_handle_menu_background.xml
@@ -18,5 +18,5 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<corners android:radius="@dimen/desktop_mode_handle_menu_corner_radius" />
- <solid android:color="?androidprv:attr/materialColorSurfaceBright" />
+ <solid android:color="@androidprv:color/materialColorSurfaceBright" />
</shape>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml
index 9566f2f140c7..bab2c9582089 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_background.xml
@@ -17,6 +17,6 @@
<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerLow" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerLow" />
<corners android:radius="@dimen/desktop_mode_maximize_menu_corner_radius" />
</shape>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
index a30cfb74bf4a..b03b13427630 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
@@ -20,6 +20,6 @@
android:shape="rectangle">
<corners
android:radius="@dimen/desktop_mode_maximize_menu_buttons_outline_radius"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerLow"/>
- <stroke android:width="1dp" android:color="?androidprv:attr/materialColorOutlineVariant"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerLow"/>
+ <stroke android:width="1dp" android:color="@androidprv:color/materialColorOutlineVariant"/>
</shape> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml
index 645d24df7c26..b24d432cece0 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_windowing_education_promo_background.xml
@@ -17,6 +17,6 @@
<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerLow" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerLow" />
<corners android:radius="@dimen/desktop_windowing_education_promo_corner_radius" />
</shape>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml
index 4e673e65e053..dd1a1b1dca13 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_windowing_transition_background.xml
@@ -18,7 +18,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:id="@+id/indicator_solid">
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorPrimaryContainer" />
+ <solid android:color="@androidprv:color/materialColorPrimaryContainer" />
<corners android:radius="28dp" />
</shape>
</item>
@@ -26,7 +26,7 @@
<shape android:shape="rectangle">
<corners android:radius="28dp" />
<stroke android:width="1dp"
- android:color="?androidprv:attr/materialColorPrimaryContainer"/>
+ android:color="@androidprv:color/materialColorPrimaryContainer"/>
</shape>
</item>
</layer-list>
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml
index f37fb8dbe118..527cc31f2f76 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml
@@ -17,6 +17,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/>
<corners android:radius="@dimen/letterbox_education_dialog_corner_radius"/>
</shape> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml
index 3fdd059ca982..5336b3a22897 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml
@@ -32,7 +32,7 @@
</item>
<item>
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorPrimary"/>
+ <solid android:color="@androidprv:color/materialColorPrimary"/>
<corners android:radius="@dimen/letterbox_education_dialog_button_radius"/>
<padding android:left="@dimen/letterbox_education_dialog_horizontal_padding"
android:top="@dimen/letterbox_education_dialog_vertical_padding"
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml
index 67929dfc5f71..f45d7044423f 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_light_bulb.xml
@@ -25,6 +25,6 @@
android:pathData="M0,0h32v32h-32z"/>
<path
android:pathData="M5.867,22.667C4.489,21.844 3.389,20.733 2.567,19.333C1.744,17.933 1.333,16.378 1.333,14.667C1.333,12.067 2.233,9.867 4.033,8.067C5.856,6.244 8.067,5.333 10.667,5.333C13.267,5.333 15.467,6.244 17.267,8.067C19.089,9.867 20,12.067 20,14.667C20,16.378 19.589,17.933 18.767,19.333C17.944,20.733 16.844,21.844 15.467,22.667H5.867ZM6.667,20H14.667C15.511,19.356 16.167,18.578 16.633,17.667C17.1,16.733 17.333,15.733 17.333,14.667C17.333,12.822 16.678,11.256 15.367,9.967C14.078,8.656 12.511,8 10.667,8C8.822,8 7.244,8.656 5.933,9.967C4.644,11.256 4,12.822 4,14.667C4,15.733 4.233,16.733 4.7,17.667C5.167,18.578 5.822,19.356 6.667,20ZM7.2,26.667C6.822,26.667 6.5,26.544 6.233,26.3C5.989,26.033 5.867,25.711 5.867,25.333C5.867,24.956 5.989,24.644 6.233,24.4C6.5,24.133 6.822,24 7.2,24H14.133C14.511,24 14.822,24.133 15.067,24.4C15.333,24.644 15.467,24.956 15.467,25.333C15.467,25.711 15.333,26.033 15.067,26.3C14.822,26.544 14.511,26.667 14.133,26.667H7.2ZM10.667,30.667C9.933,30.667 9.3,30.411 8.767,29.9C8.256,29.367 8,28.733 8,28H13.333C13.333,28.733 13.067,29.367 12.533,29.9C12.022,30.411 11.4,30.667 10.667,30.667ZM24.667,13.367C24.667,11.7 24.078,10.278 22.9,9.1C21.722,7.922 20.3,7.333 18.633,7.333C20.3,7.333 21.722,6.756 22.9,5.6C24.078,4.422 24.667,3 24.667,1.333C24.667,3 25.244,4.422 26.4,5.6C27.578,6.756 29,7.333 30.667,7.333C29,7.333 27.578,7.922 26.4,9.1C25.244,10.278 24.667,11.7 24.667,13.367Z"
- android:fillColor="?androidprv:attr/materialColorPrimary"/>
+ android:fillColor="@androidprv:color/materialColorPrimary"/>
</group>
</vector> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml
index 4207482260ba..4e77720bd18d 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml
@@ -32,7 +32,7 @@
</item>
<item>
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorPrimary"/>
+ <solid android:color="@androidprv:color/materialColorPrimary"/>
<corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/>
<padding android:left="@dimen/letterbox_restart_dialog_horizontal_padding"
android:top="@dimen/letterbox_restart_dialog_vertical_padding"
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml
index 72cfeefceffb..90b314a58b8f 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dialog_background.xml
@@ -17,6 +17,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/>
<corners android:radius="@dimen/letterbox_restart_dialog_corner_radius"/>
</shape> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml
index 816b35063b00..d64e63261ac9 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml
@@ -32,9 +32,9 @@
</item>
<item>
<shape android:shape="rectangle">
- <stroke android:color="?androidprv:attr/materialColorOutlineVariant"
+ <stroke android:color="@androidprv:color/materialColorOutlineVariant"
android:width="1dp"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/>
<corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/>
<padding android:left="@dimen/letterbox_restart_dialog_horizontal_padding"
android:top="@dimen/letterbox_restart_dialog_vertical_padding"
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml
index f13d26c7f89e..53b4a4b70ed3 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_header_ic_arrows.xml
@@ -25,6 +25,6 @@
android:pathData="M0,0h32v32h-32z"/>
<path
android:pathData="M8.533,25.333H10.667C11.044,25.333 11.356,25.467 11.6,25.733C11.867,25.978 12,26.289 12,26.667C12,27.044 11.867,27.367 11.6,27.633C11.356,27.878 11.044,28 10.667,28H5.333C4.956,28 4.633,27.878 4.367,27.633C4.122,27.367 4,27.044 4,26.667V21.333C4,20.956 4.122,20.644 4.367,20.4C4.633,20.133 4.956,20 5.333,20C5.711,20 6.022,20.133 6.267,20.4C6.533,20.644 6.667,20.956 6.667,21.333V23.467L9.867,20.267C10.111,20.022 10.422,19.9 10.8,19.9C11.178,19.9 11.489,20.022 11.733,20.267C11.978,20.511 12.1,20.822 12.1,21.2C12.1,21.578 11.978,21.889 11.733,22.133L8.533,25.333ZM23.467,25.333L20.267,22.133C20.022,21.889 19.9,21.578 19.9,21.2C19.9,20.822 20.022,20.511 20.267,20.267C20.511,20.022 20.822,19.9 21.2,19.9C21.578,19.9 21.889,20.022 22.133,20.267L25.333,23.467V21.333C25.333,20.956 25.456,20.644 25.7,20.4C25.967,20.133 26.289,20 26.667,20C27.044,20 27.356,20.133 27.6,20.4C27.867,20.644 28,20.956 28,21.333V26.667C28,27.044 27.867,27.367 27.6,27.633C27.356,27.878 27.044,28 26.667,28H21.333C20.956,28 20.633,27.878 20.367,27.633C20.122,27.367 20,27.044 20,26.667C20,26.289 20.122,25.978 20.367,25.733C20.633,25.467 20.956,25.333 21.333,25.333H23.467ZM6.667,8.533V10.667C6.667,11.044 6.533,11.367 6.267,11.633C6.022,11.878 5.711,12 5.333,12C4.956,12 4.633,11.878 4.367,11.633C4.122,11.367 4,11.044 4,10.667V5.333C4,4.956 4.122,4.644 4.367,4.4C4.633,4.133 4.956,4 5.333,4H10.667C11.044,4 11.356,4.133 11.6,4.4C11.867,4.644 12,4.956 12,5.333C12,5.711 11.867,6.033 11.6,6.3C11.356,6.544 11.044,6.667 10.667,6.667H8.533L11.733,9.867C11.978,10.111 12.1,10.422 12.1,10.8C12.1,11.178 11.978,11.489 11.733,11.733C11.489,11.978 11.178,12.1 10.8,12.1C10.422,12.1 10.111,11.978 9.867,11.733L6.667,8.533ZM25.333,8.533L22.133,11.733C21.889,11.978 21.578,12.1 21.2,12.1C20.822,12.1 20.511,11.978 20.267,11.733C20.022,11.489 19.9,11.178 19.9,10.8C19.9,10.422 20.022,10.111 20.267,9.867L23.467,6.667H21.333C20.956,6.667 20.633,6.544 20.367,6.3C20.122,6.033 20,5.711 20,5.333C20,4.956 20.122,4.644 20.367,4.4C20.633,4.133 20.956,4 21.333,4H26.667C27.044,4 27.356,4.133 27.6,4.4C27.867,4.644 28,4.956 28,5.333V10.667C28,11.044 27.867,11.367 27.6,11.633C27.356,11.878 27.044,12 26.667,12C26.289,12 25.967,11.878 25.7,11.633C25.456,11.367 25.333,11.044 25.333,10.667V8.533Z"
- android:fillColor="?androidprv:attr/materialColorPrimary"/>
+ android:fillColor="@androidprv:color/materialColorPrimary"/>
</group>
</vector> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml
index 4eb22712f5e1..d1a510a03674 100644
--- a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_background.xml
@@ -17,6 +17,6 @@
<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer"/>
<corners android:radius="28dp"/>
</shape>
diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml
index 2b2e9df07dce..20e2e7e5a832 100644
--- a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml
@@ -17,6 +17,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorPrimary"/>
+ <solid android:color="@androidprv:color/materialColorPrimary"/>
<corners android:radius="50dp"/>
</shape>
diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml
index 4c7d1c7339fb..7347fbad5f5d 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_bar_manage_education.xml
@@ -29,7 +29,7 @@
<ImageView
android:layout_width="@dimen/bubble_popup_icon_size"
android:layout_height="@dimen/bubble_popup_icon_size"
- android:tint="?androidprv:attr/materialColorOutline"
+ android:tint="@androidprv:color/materialColorOutline"
android:contentDescription="@null"
android:src="@drawable/pip_ic_settings"/>
@@ -41,7 +41,7 @@
android:maxLines="1"
android:ellipsize="end"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Headline"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:text="@string/bubble_bar_education_manage_title"/>
<TextView
@@ -51,7 +51,7 @@
android:paddingBottom="@dimen/bubble_popup_padding_bottom"
android:maxWidth="@dimen/bubble_popup_content_max_width"
android:textAppearance="@android:style/TextAppearance.DeviceDefault"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textAlignment="center"
android:text="@string/bubble_bar_education_manage_text"/>
diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml
index e3217811ca29..5750ed7bf8d6 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_bar_menu_item.xml
@@ -36,7 +36,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault" />
</com.android.wm.shell.bubbles.bar.BubbleBarMenuItemView> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml
index 7aca921dccc7..27e3b006b961 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_bar_menu_view.xml
@@ -50,7 +50,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_weight="1"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault" />
<ImageView
@@ -60,7 +60,7 @@
android:layout_marginStart="8dp"
android:contentDescription="@null"
android:src="@drawable/ic_expand_less"
- app:tint="?androidprv:attr/materialColorOnSurface" />
+ app:tint="@androidprv:color/materialColorOnSurface" />
</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml
index 345c399652f9..f0e1871168dd 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml
@@ -29,7 +29,7 @@
<ImageView
android:layout_width="@dimen/bubble_popup_icon_size"
android:layout_height="@dimen/bubble_popup_icon_size"
- android:tint="?androidprv:attr/materialColorOutline"
+ android:tint="@androidprv:color/materialColorOutline"
android:contentDescription="@null"
android:src="@drawable/ic_floating_landscape"/>
@@ -41,7 +41,7 @@
android:maxLines="1"
android:ellipsize="end"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Headline"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:text="@string/bubble_bar_education_stack_title"/>
<TextView
@@ -51,7 +51,7 @@
android:paddingBottom="@dimen/bubble_popup_padding_bottom"
android:maxWidth="@dimen/bubble_popup_content_max_width"
android:textAppearance="@android:style/TextAppearance.DeviceDefault"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textAlignment="center"
android:text="@string/bubble_bar_education_stack_text"/>
diff --git a/libs/WindowManager/Shell/res/layout/bubble_flyout.xml b/libs/WindowManager/Shell/res/layout/bubble_flyout.xml
index 65a07a718677..deabd564d80a 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_flyout.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_flyout.xml
@@ -49,7 +49,7 @@
android:fontFamily="@*android:string/config_bodyFontFamilyMedium"
android:maxLines="1"
android:ellipsize="end"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"/>
<TextView
@@ -59,7 +59,7 @@
android:fontFamily="@*android:string/config_bodyFontFamily"
android:maxLines="2"
android:ellipsize="end"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"/>
</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml b/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml
index f88d63d796ea..0c446df69563 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml
@@ -28,6 +28,6 @@
android:focusable="true"
android:text="@string/manage_bubbles_text"
android:textSize="@*android:dimen/text_size_body_2_material"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:background="@drawable/bubble_manage_btn_bg"
/> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml b/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml
index d8ae9c8c64a6..4daaf9c6b57f 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml
@@ -43,7 +43,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault"
android:text="@string/bubble_dismiss_text" />
@@ -70,7 +70,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault"
android:text="@string/bubbles_dont_bubble_conversation" />
@@ -98,7 +98,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault" />
</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
index bfd9c818a96e..b69563b46e06 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
@@ -52,7 +52,7 @@
android:layout_height="wrap_content"
tools:text="Gmail"
android:importantForAccessibility="no"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="14sp"
android:textFontWeight="500"
android:lineHeight="20dp"
@@ -69,7 +69,7 @@
android:contentDescription="@string/collapse_menu_text"
android:src="@drawable/ic_baseline_expand_more_24"
android:rotation="180"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:background="?android:selectableItemBackgroundBorderless"/>
</LinearLayout>
@@ -89,7 +89,7 @@
android:layout_marginEnd="4dp"
android:contentDescription="@string/fullscreen_text"
android:src="@drawable/desktop_mode_ic_handle_menu_fullscreen"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:layout_weight="1"
style="@style/DesktopModeHandleMenuWindowingButton"/>
@@ -99,7 +99,7 @@
android:layout_marginEnd="4dp"
android:contentDescription="@string/split_screen_text"
android:src="@drawable/desktop_mode_ic_handle_menu_splitscreen"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:layout_weight="1"
style="@style/DesktopModeHandleMenuWindowingButton"/>
@@ -109,7 +109,7 @@
android:layout_marginEnd="4dp"
android:contentDescription="@string/float_button_text"
android:src="@drawable/desktop_mode_ic_handle_menu_floating"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:layout_weight="1"
style="@style/DesktopModeHandleMenuWindowingButton"/>
@@ -118,7 +118,7 @@
android:layout_marginStart="4dp"
android:contentDescription="@string/desktop_text"
android:src="@drawable/desktop_mode_ic_handle_menu_desktop"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:layout_weight="1"
style="@style/DesktopModeHandleMenuWindowingButton"/>
@@ -139,7 +139,7 @@
android:contentDescription="@string/screenshot_text"
android:text="@string/screenshot_text"
android:drawableStart="@drawable/desktop_mode_ic_handle_menu_screenshot"
- android:drawableTint="?androidprv:attr/materialColorOnSurface"
+ android:drawableTint="@androidprv:color/materialColorOnSurface"
style="@style/DesktopModeHandleMenuActionButton"/>
<Button
@@ -147,7 +147,7 @@
android:contentDescription="@string/new_window_text"
android:text="@string/new_window_text"
android:drawableStart="@drawable/desktop_mode_ic_handle_menu_new_window"
- android:drawableTint="?androidprv:attr/materialColorOnSurface"
+ android:drawableTint="@androidprv:color/materialColorOnSurface"
style="@style/DesktopModeHandleMenuActionButton" />
<Button
@@ -155,7 +155,7 @@
android:contentDescription="@string/manage_windows_text"
android:text="@string/manage_windows_text"
android:drawableStart="@drawable/desktop_mode_ic_handle_menu_manage_windows"
- android:drawableTint="?androidprv:attr/materialColorOnSurface"
+ android:drawableTint="@androidprv:color/materialColorOnSurface"
style="@style/DesktopModeHandleMenuActionButton" />
<Button
@@ -163,7 +163,7 @@
android:contentDescription="@string/change_aspect_ratio_text"
android:text="@string/change_aspect_ratio_text"
android:drawableStart="@drawable/desktop_mode_ic_handle_menu_change_aspect_ratio"
- android:drawableTint="?androidprv:attr/materialColorOnSurface"
+ android:drawableTint="@androidprv:color/materialColorOnSurface"
style="@style/DesktopModeHandleMenuActionButton" />
</LinearLayout>
@@ -183,7 +183,7 @@
android:contentDescription="@string/open_in_browser_text"
android:text="@string/open_in_browser_text"
android:drawableStart="@drawable/desktop_mode_ic_handle_menu_open_in_browser"
- android:drawableTint="?androidprv:attr/materialColorOnSurface"
+ android:drawableTint="@androidprv:color/materialColorOnSurface"
style="@style/DesktopModeHandleMenuActionButton"/>
<ImageButton
@@ -195,7 +195,7 @@
android:layout_marginStart="10dp"
android:contentDescription="@string/open_by_default_settings_text"
android:src="@drawable/desktop_mode_ic_handle_menu_open_by_default_settings"
- android:tint="?androidprv:attr/materialColorOnSurface"/>
+ android:tint="@androidprv:color/materialColorOnSurface"/>
</LinearLayout>
</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
index 375968ab0ad2..8d7e5fd95957 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
@@ -58,7 +58,7 @@
android:fontFamily="google-sans-text"
android:importantForAccessibility="no"
android:text="@string/desktop_mode_maximize_menu_immersive_button_text"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:alpha="0"/>
</LinearLayout>
@@ -89,7 +89,7 @@
android:fontFamily="google-sans-text"
android:importantForAccessibility="no"
android:text="@string/desktop_mode_maximize_menu_maximize_text"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:alpha="0"/>
</LinearLayout>
@@ -140,7 +140,7 @@
android:importantForAccessibility="no"
android:fontFamily="google-sans-text"
android:text="@string/desktop_mode_maximize_menu_snap_text"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:alpha="0"/>
</LinearLayout>
</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml
index bda087b143d0..0a44cd42e790 100644
--- a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml
+++ b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml
@@ -37,7 +37,7 @@
android:layout_height="wrap_content"
android:lineSpacingExtra="4sp"
android:textAlignment="center"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="14sp"/>
</LinearLayout> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
index 488123ad7b0c..cd36983aff2d 100644
--- a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
+++ b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
@@ -64,7 +64,7 @@
android:lineSpacingExtra="4sp"
android:text="@string/letterbox_education_dialog_title"
android:textAlignment="center"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:fontFamily="@*android:string/config_headlineFontFamily"
android:textSize="24sp"/>
@@ -104,7 +104,7 @@
android:background=
"@drawable/letterbox_education_dismiss_button_background_ripple"
android:text="@string/letterbox_education_got_it"
- android:textColor="?androidprv:attr/materialColorOnPrimary"
+ android:textColor="@androidprv:color/materialColorOnPrimary"
android:textAlignment="center"
android:contentDescription="@string/letterbox_education_got_it"/>
diff --git a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml
index b5bceda9a623..f6256e6bc5e7 100644
--- a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml
+++ b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml
@@ -64,7 +64,7 @@
android:lineHeight="32dp"
android:textFontWeight="400"
android:textSize="24sp"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
tools:text="Gmail" />
<TextView
@@ -75,7 +75,7 @@
android:lineHeight="16dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="16dp"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:text="@string/open_by_default_dialog_subheader_text"/>
<RadioGroup
@@ -121,7 +121,7 @@
android:layout_marginBottom="24dp"
android:textSize="14sp"
android:textFontWeight="500"
- android:textColor="?androidprv:attr/materialColorOnPrimary"
+ android:textColor="@androidprv:color/materialColorOnPrimary"
android:background="@drawable/open_by_default_settings_dialog_confirm_button_background"/>
</LinearLayout>
</ScrollView>
diff --git a/libs/WindowManager/Shell/res/values/colors.xml b/libs/WindowManager/Shell/res/values/colors.xml
index b7aa1581a5c1..d754243a2b07 100644
--- a/libs/WindowManager/Shell/res/values/colors.xml
+++ b/libs/WindowManager/Shell/res/values/colors.xml
@@ -43,7 +43,7 @@
<color name="compat_controls_text">@android:color/system_neutral1_50</color>
<!-- Letterbox Education -->
- <color name="letterbox_education_text_secondary">?androidprv:attr/materialColorSecondary</color>
+ <color name="letterbox_education_text_secondary">@androidprv:color/materialColorSecondary</color>
<!-- Letterbox Dialog -->
<color name="letterbox_dialog_background">@android:color/system_neutral1_900</color>
diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml
index 597a921302b7..8a4a7023b8e8 100644
--- a/libs/WindowManager/Shell/res/values/styles.xml
+++ b/libs/WindowManager/Shell/res/values/styles.xml
@@ -48,7 +48,7 @@
<item name="android:paddingEnd">0dp</item>
<item name="android:textSize">14sp</item>
<item name="android:textFontWeight">500</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:drawablePadding">16dp</item>
<item name="android:background">?android:selectableItemBackground</item>
</style>
@@ -92,7 +92,7 @@
<style name="RestartDialogTitleText">
<item name="android:textSize">24sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:lineSpacingExtra">8sp</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
</style>
@@ -104,23 +104,23 @@
<style name="RestartDialogBodyText" parent="RestartDialogBodyStyle">
<item name="android:letterSpacing">0.02</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
<item name="android:lineSpacingExtra">6sp</item>
</style>
<style name="RestartDialogCheckboxText" parent="RestartDialogBodyStyle">
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:lineSpacingExtra">6sp</item>
</style>
<style name="RestartDialogDismissButton" parent="RestartDialogBodyStyle">
<item name="android:lineSpacingExtra">2sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorPrimary</item>
+ <item name="android:textColor">@androidprv:color/materialColorPrimary</item>
</style>
<style name="RestartDialogConfirmButton" parent="RestartDialogBodyStyle">
<item name="android:lineSpacingExtra">2sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnPrimary</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnPrimary</item>
</style>
<style name="ReachabilityEduHandLayout" parent="Theme.AppCompat.Light">
diff --git a/libs/WindowManager/Shell/shared/Android.bp b/libs/WindowManager/Shell/shared/Android.bp
index 5113d980fb7d..5bbda95c466f 100644
--- a/libs/WindowManager/Shell/shared/Android.bp
+++ b/libs/WindowManager/Shell/shared/Android.bp
@@ -26,6 +26,7 @@ filegroup {
name: "wm_shell-shared-utils",
srcs: [
"src/com/android/wm/shell/shared/TransitionUtil.java",
+ "src/com/android/wm/shell/shared/Utils.java",
],
}
@@ -71,6 +72,7 @@ java_library {
srcs: [
"**/desktopmode/*.java",
"**/desktopmode/*.kt",
+ ":wm_shell-shared-utils",
],
static_libs: [
"com.android.window.flags.window-aconfig-java",
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/Utils.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/Utils.java
new file mode 100644
index 000000000000..e19027a352f7
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/Utils.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.shared;
+
+import android.annotation.NonNull;
+
+import java.util.function.Supplier;
+
+/**
+ * This class provides generic utility methods and classes for shell
+ */
+public class Utils {
+
+ /**
+ * Lazily returns object from a supplier with caching
+ * @param <T> type of object to get
+ */
+ public static class Lazy<T> {
+ private T mInstance;
+
+ /**
+ * @param supplier the supplier to use, when the instance has not yet been initialized
+ * @return the cached value or the value from the supplier
+ */
+ public final T get(@NonNull Supplier<T> supplier) {
+ if (mInstance == null) {
+ mInstance = supplier.get();
+ }
+ return mInstance;
+ }
+ }
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java
index 4c77eaf80a29..a5d698aff2a2 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java
@@ -16,16 +16,23 @@
package com.android.wm.shell.shared.desktopmode;
+import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED;
+
import android.annotation.NonNull;
import android.content.Context;
+import android.hardware.display.DisplayManager;
import android.os.SystemProperties;
+import android.view.Display;
+import android.view.WindowManager;
import android.window.DesktopModeFlags;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.window.flags.Flags;
+import com.android.wm.shell.shared.Utils.Lazy;
import java.io.PrintWriter;
+import java.util.Arrays;
/**
* Constants for desktop mode feature
@@ -35,6 +42,8 @@ public class DesktopModeStatus {
private static final String TAG = "DesktopModeStatus";
+ private static Lazy<Boolean> sIsLargeScreenDevice = new Lazy<>();
+
/**
* Flag to indicate whether task resizing is veiled.
*/
@@ -227,13 +236,12 @@ public class DesktopModeStatus {
* necessarily enabling desktop mode
*/
public static boolean overridesShowAppHandle(@NonNull Context context) {
- return Flags.showAppHandleLargeScreens()
- && context.getResources().getBoolean(R.bool.config_enableAppHandle);
+ return Flags.showAppHandleLargeScreens() && deviceHasLargeScreen(context);
}
/**
* @return {@code true} if the app handle should be shown because desktop mode is enabled or
- * the device is overriding {@code R.bool.config_enableAppHandle}
+ * the device has a large screen
*/
public static boolean canEnterDesktopModeOrShowAppHandle(@NonNull Context context) {
return canEnterDesktopMode(context) || overridesShowAppHandle(context);
@@ -276,6 +284,18 @@ public class DesktopModeStatus {
}
/**
+ * @return {@code true} if this device has an internal large screen
+ */
+ private static boolean deviceHasLargeScreen(@NonNull Context context) {
+ return sIsLargeScreenDevice.get(() -> Arrays.stream(
+ context.getSystemService(DisplayManager.class)
+ .getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED))
+ .filter(display -> display.getType() == Display.TYPE_INTERNAL)
+ .anyMatch(display -> display.getMinSizeDimensionDp()
+ >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP));
+ }
+
+ /**
* Return {@code true} if a display should enter desktop mode by default when the windowing mode
* of the display's root [TaskDisplayArea] is set to WINDOWING_MODE_FREEFORM.
*/
@@ -315,6 +335,6 @@ public class DesktopModeStatus {
pw.println(maxTaskLimitHandle == null ? "null" : maxTaskLimitHandle.getInt(/* def= */ -1));
pw.print(innerPrefix); pw.print("showAppHandle config override=");
- pw.print(context.getResources().getBoolean(R.bool.config_enableAppHandle));
+ pw.print(overridesShowAppHandle(context));
}
}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java
index f9f43bc8dfae..b48296f5f76a 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java
@@ -58,6 +58,11 @@ public class SplitScreenConstants {
*/
public static final int SPLIT_POSITION_BOTTOM_OR_RIGHT = 1;
+ /**
+ * Deprecated and will be replaced fully by @SplitIndex. With support for 3+ apps in split,
+ * existing references to top/left and bottom/right will be replaced by INDEX_0 and INDEX_1
+ * respectively. For now they can be used interchangeably, the underlying ints are the same.
+ */
@IntDef(prefix = {"SPLIT_POSITION_"}, value = {
SPLIT_POSITION_UNDEFINED,
SPLIT_POSITION_TOP_OR_LEFT,
@@ -85,6 +90,21 @@ public class SplitScreenConstants {
public @interface SplitIndex {
}
+ /**
+ * Return the @SplitIndex constant for a given integer index. @SplitIndex is the replacement
+ * for @SplitPosition, and will be used interchangeably with @SplitPosition to support 3+ apps
+ * in split.
+ */
+ public static int getIndex(int i) {
+ return switch (i) {
+ case 0 -> SPLIT_INDEX_0;
+ case 1 -> SPLIT_INDEX_1;
+ case 2 -> SPLIT_INDEX_2;
+ case 3 -> SPLIT_INDEX_3;
+ default -> SPLIT_INDEX_UNDEFINED;
+ };
+ }
+
/** Signifies that user is currently not in split screen. */
public static final int NOT_IN_SPLIT = -1;
@@ -159,7 +179,8 @@ public class SplitScreenConstants {
* {@link PersistentSnapPosition} + {@link #NOT_IN_SPLIT}.
*/
@IntDef(value = {
- NOT_IN_SPLIT,
+ NOT_IN_SPLIT, // user is not in split screen
+ SNAP_TO_NONE, // in "free snap mode," where apps are fully resizable
SNAP_TO_2_33_66,
SNAP_TO_2_50_50,
SNAP_TO_2_66_33,
@@ -171,6 +192,23 @@ public class SplitScreenConstants {
})
public @interface SplitScreenState {}
+ /** Converts a {@link SplitScreenState} to a human-readable string. */
+ public static String stateToString(@SplitScreenState int state) {
+ return switch (state) {
+ case NOT_IN_SPLIT -> "NOT_IN_SPLIT";
+ case SNAP_TO_NONE -> "SNAP_TO_NONE";
+ case SNAP_TO_2_33_66 -> "SNAP_TO_2_33_66";
+ case SNAP_TO_2_50_50 -> "SNAP_TO_2_50_50";
+ case SNAP_TO_2_66_33 -> "SNAP_TO_2_66_33";
+ case SNAP_TO_2_90_10 -> "SNAP_TO_2_90_10";
+ case SNAP_TO_2_10_90 -> "SNAP_TO_2_10_90";
+ case SNAP_TO_3_33_33_33 -> "SNAP_TO_3_33_33_33";
+ case SNAP_TO_3_45_45_10 -> "SNAP_TO_3_45_45_10";
+ case SNAP_TO_3_10_45_45 -> "SNAP_TO_3_10_45_45";
+ default -> "UNKNOWN";
+ };
+ }
+
/**
* Checks if the snapPosition in question is a {@link PersistentSnapPosition}.
*/
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
index 7243ea36b137..68c42d6a2648 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
@@ -18,6 +18,8 @@
package com.android.wm.shell.apptoweb
+import android.app.assist.AssistContent
+import android.app.assist.AssistContent.EXTRA_SESSION_TRANSFER_WEB_URI
import android.content.Context
import android.content.Intent
import android.content.Intent.ACTION_VIEW
@@ -102,3 +104,10 @@ fun getDomainVerificationUserState(
return null
}
}
+
+/**
+ * Returns the web uri from the given [AssistContent].
+ */
+fun AssistContent.getSessionWebUri(): Uri? {
+ return extras.getParcelable(EXTRA_SESSION_TRANSFER_WEB_URI) ?: webUri
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
index 60a52a808a54..56efdb885512 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
@@ -1314,7 +1314,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
}
}
- if (handlePrepareTransition(info, st, ft, finishCallback)) {
+ if (handlePrepareTransition(transition, info, st, ft, finishCallback)) {
if (checkTakeoverFlags()) {
mTakeoverHandler = mTransitions.getHandlerForTakeover(transition, info);
}
@@ -1630,7 +1630,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
* happen when core make an activity become visible.
*/
@VisibleForTesting
- boolean handlePrepareTransition(
+ boolean handlePrepareTransition(@NonNull IBinder transition,
@NonNull TransitionInfo info,
@NonNull SurfaceControl.Transaction st,
@NonNull SurfaceControl.Transaction ft,
@@ -1678,6 +1678,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
}
}
st.apply();
+ // In case other transition handler took the handleRequest before this class.
+ mPrepareOpenTransition = transition;
mFinishOpenTransaction = ft;
mFinishOpenTransitionCallback = finishCallback;
mOpenTransitionInfo = info;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
index 52955267a501..47032fd8616f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
@@ -38,7 +38,6 @@ import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
-import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.Outline;
import android.graphics.Paint;
@@ -543,15 +542,15 @@ public class BubbleExpandedView extends LinearLayout {
void applyThemeAttrs() {
final TypedArray ta = mContext.obtainStyledAttributes(new int[]{
- android.R.attr.dialogCornerRadius,
- com.android.internal.R.attr.materialColorSurfaceBright,
- com.android.internal.R.attr.materialColorSurfaceContainerHigh});
+ android.R.attr.dialogCornerRadius});
boolean supportsRoundedCorners = ScreenDecorationsUtils.supportsRoundedCornersOnWindows(
mContext.getResources());
mCornerRadius = supportsRoundedCorners ? ta.getDimensionPixelSize(0, 0) : 0;
- mBackgroundColorFloating = ta.getColor(1, Color.WHITE);
+ mBackgroundColorFloating = mContext.getColor(
+ com.android.internal.R.color.materialColorSurfaceBright);
mExpandedViewContainer.setBackgroundColor(mBackgroundColorFloating);
- final int manageMenuBg = ta.getColor(2, Color.WHITE);
+ final int manageMenuBg = mContext.getColor(
+ com.android.internal.R.color.materialColorSurfaceContainerHigh);
ta.recycle();
if (mManageButton != null) {
mManageButton.getBackground().setColorFilter(manageMenuBg, PorterDuff.Mode.SRC_IN);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
index 1711dca4a8a3..da6948d947d8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
@@ -28,7 +28,6 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
-import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Outline;
import android.graphics.Paint;
@@ -209,7 +208,7 @@ public class BubbleFlyoutView extends FrameLayout {
mPointerSize, mPointerSize, false /* isPointingLeft */));
mRightTriangleShape.setBounds(0, 0, mPointerSize, mPointerSize);
- applyConfigurationColors(getResources().getConfiguration());
+ applyConfigurationColors();
}
@Override
@@ -440,29 +439,23 @@ public class BubbleFlyoutView extends FrameLayout {
boolean flagsChanged = nightModeFlags != mNightModeFlags;
if (flagsChanged) {
mNightModeFlags = nightModeFlags;
- applyConfigurationColors(configuration);
+ applyConfigurationColors();
}
return flagsChanged;
}
- private void applyConfigurationColors(Configuration configuration) {
- int nightModeFlags = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
- boolean isNightModeOn = nightModeFlags == Configuration.UI_MODE_NIGHT_YES;
- try (TypedArray ta = mContext.obtainStyledAttributes(
- new int[]{
- com.android.internal.R.attr.materialColorSurfaceContainer,
- com.android.internal.R.attr.materialColorOnSurface,
- com.android.internal.R.attr.materialColorOnSurfaceVariant})) {
- mFloatingBackgroundColor = ta.getColor(0,
- isNightModeOn ? Color.BLACK : Color.WHITE);
- mSenderText.setTextColor(ta.getColor(1,
- isNightModeOn ? Color.WHITE : Color.BLACK));
- mMessageText.setTextColor(ta.getColor(2,
- isNightModeOn ? Color.WHITE : Color.BLACK));
- mBgPaint.setColor(mFloatingBackgroundColor);
- mLeftTriangleShape.getPaint().setColor(mFloatingBackgroundColor);
- mRightTriangleShape.getPaint().setColor(mFloatingBackgroundColor);
- }
+ private void applyConfigurationColors() {
+ mFloatingBackgroundColor = mContext.getColor(
+ com.android.internal.R.color.materialColorSurfaceContainer);
+ mSenderText.setTextColor(
+ mContext.getColor(com.android.internal.R.color.materialColorOnSurface));
+ mMessageText.setTextColor(
+ mContext.getColor(com.android.internal.R.color.materialColorOnSurfaceVariant));
+
+ mBgPaint.setColor(mFloatingBackgroundColor);
+ mLeftTriangleShape.getPaint().setColor(mFloatingBackgroundColor);
+ mRightTriangleShape.getPaint().setColor(mFloatingBackgroundColor);
+
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
index c74412b825d9..862906a11424 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
@@ -19,7 +19,6 @@ package com.android.wm.shell.bubbles
import android.app.ActivityTaskManager.INVALID_TASK_ID
import android.content.Context
import android.graphics.Bitmap
-import android.graphics.Color
import android.graphics.Matrix
import android.graphics.Path
import android.graphics.drawable.AdaptiveIconDrawable
@@ -117,18 +116,8 @@ class BubbleOverflow(private val context: Context, private val positioner: Bubbl
val res = context.resources
// Set overflow button accent color, dot color
-
- val typedArray =
- context.obtainStyledAttributes(
- intArrayOf(
- com.android.internal.R.attr.materialColorPrimaryFixed,
- com.android.internal.R.attr.materialColorOnPrimaryFixed
- )
- )
-
- val colorAccent = typedArray.getColor(0, Color.WHITE)
- val shapeColor = typedArray.getColor(1, Color.BLACK)
- typedArray.recycle()
+ val colorAccent = context.getColor(com.android.internal.R.color.materialColorPrimaryFixed)
+ val shapeColor = context.getColor(com.android.internal.R.color.materialColorOnPrimaryFixed)
dotColor = colorAccent
overflowBtn?.iconDrawable?.setTint(shapeColor)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java
index bf98ef82b475..64f54b8ab5be 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java
@@ -226,13 +226,11 @@ public class BubbleOverflowContainerView extends LinearLayout {
? res.getColor(R.color.bubbles_dark)
: res.getColor(R.color.bubbles_light));
- final TypedArray typedArray = getContext().obtainStyledAttributes(new int[] {
- com.android.internal.R.attr.materialColorSurfaceBright,
- com.android.internal.R.attr.materialColorOnSurface});
- int bgColor = typedArray.getColor(0, isNightMode ? Color.BLACK : Color.WHITE);
- int textColor = typedArray.getColor(1, isNightMode ? Color.WHITE : Color.BLACK);
- textColor = ContrastColorUtil.ensureTextContrast(textColor, bgColor, isNightMode);
- typedArray.recycle();
+
+ int bgColor = getContext().getColor(
+ com.android.internal.R.color.materialColorSurfaceBright);
+ int textColor = getContext().getColor(com.android.internal.R.color.materialColorOnSurface);
+
setBackgroundColor(bgColor);
mEmptyStateTitle.setTextColor(textColor);
mEmptyStateSubtitle.setTextColor(textColor);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt
index 9b3054e9ee13..a65466f71861 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt
@@ -15,7 +15,6 @@
*/
package com.android.wm.shell.bubbles
-import android.graphics.Color
import com.android.wm.shell.R
import com.android.wm.shell.shared.bubbles.BubblePopupDrawable
import com.android.wm.shell.shared.bubbles.BubblePopupView
@@ -27,7 +26,6 @@ fun BubblePopupView.setup() {
val attrs =
context.obtainStyledAttributes(
intArrayOf(
- com.android.internal.R.attr.materialColorSurfaceContainer,
android.R.attr.dialogCornerRadius
)
)
@@ -35,8 +33,8 @@ fun BubblePopupView.setup() {
val res = context.resources
val config =
BubblePopupDrawable.Config(
- color = attrs.getColor(0, Color.WHITE),
- cornerRadius = attrs.getDimension(1, 0f),
+ color = context.getColor(com.android.internal.R.color.materialColorSurfaceContainer),
+ cornerRadius = attrs.getDimension(0, 0f),
contentPadding = res.getDimensionPixelSize(R.dimen.bubble_popup_padding),
arrowWidth = res.getDimension(R.dimen.bubble_popup_arrow_width),
arrowHeight = res.getDimension(R.dimen.bubble_popup_arrow_height),
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 88f55b8af8f7..249a218d5e56 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -40,7 +40,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
-import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.PointF;
import android.graphics.PorterDuff;
@@ -1326,10 +1325,9 @@ public class BubbleStackView extends FrameLayout
R.layout.bubble_manage_menu, this, false);
mManageMenu.setVisibility(View.INVISIBLE);
- final TypedArray ta = mContext.obtainStyledAttributes(new int[]{
- com.android.internal.R.attr.materialColorSurfaceBright});
- final int menuBackgroundColor = ta.getColor(0, Color.WHITE);
- ta.recycle();
+ final int menuBackgroundColor = mContext.getColor(
+ com.android.internal.R.color.materialColorSurfaceBright);
+
mManageMenu.getBackground().setColorFilter(menuBackgroundColor, PorterDuff.Mode.SRC_IN);
PhysicsAnimator.getInstance(mManageMenu).setDefaultSpringConfig(mManageSpringConfig);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java
index 1c71ef415eae..6c14d83dfafa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuItemView.java
@@ -17,7 +17,6 @@ package com.android.wm.shell.bubbles.bar;
import android.annotation.ColorInt;
import android.content.Context;
-import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Icon;
import android.util.AttributeSet;
@@ -63,9 +62,8 @@ public class BubbleBarMenuItemView extends LinearLayout {
*/
void update(Icon icon, String title, @ColorInt int tint) {
if (tint == Color.TRANSPARENT) {
- final TypedArray typedArray = getContext().obtainStyledAttributes(
- new int[]{com.android.internal.R.attr.materialColorOnSurface});
- mTextView.setTextColor(typedArray.getColor(0, Color.BLACK));
+ mTextView.setTextColor(
+ getContext().getColor(com.android.internal.R.color.materialColorOnSurface));
} else {
icon.setTint(tint);
mTextView.setTextColor(tint);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java
index 99e20097e61c..dfbf655bb6fc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuView.java
@@ -18,7 +18,6 @@ package com.android.wm.shell.bubbles.bar;
import android.annotation.ColorInt;
import android.content.Context;
import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Icon;
import android.util.AttributeSet;
@@ -91,14 +90,11 @@ public class BubbleBarMenuView extends LinearLayout {
}
private void updateThemeColors() {
- try (TypedArray ta = mContext.obtainStyledAttributes(new int[]{
- com.android.internal.R.attr.materialColorSurfaceBright,
- com.android.internal.R.attr.materialColorOnSurface
- })) {
- mActionsSectionView.getBackground().setTint(ta.getColor(0, Color.WHITE));
- ImageViewCompat.setImageTintList(mBubbleDismissIconView,
- ColorStateList.valueOf(ta.getColor(1, Color.BLACK)));
- }
+ mActionsSectionView.getBackground().setTint(
+ mContext.getColor(com.android.internal.R.color.materialColorSurfaceBright));
+ ImageViewCompat.setImageTintList(mBubbleDismissIconView,
+ ColorStateList.valueOf(
+ mContext.getColor(com.android.internal.R.color.materialColorOnSurface)));
}
/** Animates the menu from the specified start scale. */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java
index 9dd0cae20370..5f437d4af40f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java
@@ -22,8 +22,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Color;
import android.graphics.drawable.Icon;
import android.view.LayoutInflater;
import android.view.View;
@@ -169,12 +167,7 @@ class BubbleBarMenuViewController {
int handleHeight = mHandleView.getHandleHeight();
float targetWidth = mHandleView.getHandleWidth() + widthDiff * WIDTH_SWAP_FRACTION;
float targetHeight = targetWidth * mMenuView.getTitleItemHeight() / mMenuView.getWidth();
- int menuColor;
- try (TypedArray ta = mContext.obtainStyledAttributes(new int[]{
- com.android.internal.R.attr.materialColorSurfaceBright,
- })) {
- menuColor = ta.getColor(0, Color.WHITE);
- }
+ int menuColor = mContext.getColor(com.android.internal.R.color.materialColorSurfaceBright);
// Calculating deltas
float swapScale = targetWidth / mMenuView.getWidth();
float handleWidthDelta = targetWidth - mHandleView.getHandleWidth();
@@ -227,11 +220,8 @@ class BubbleBarMenuViewController {
private ArrayList<BubbleBarMenuView.MenuAction> createMenuActions(Bubble bubble) {
ArrayList<BubbleBarMenuView.MenuAction> menuActions = new ArrayList<>();
Resources resources = mContext.getResources();
- int tintColor;
- try (TypedArray ta = mContext.obtainStyledAttributes(new int[]{
- com.android.internal.R.attr.materialColorOnSurface})) {
- tintColor = ta.getColor(0, Color.TRANSPARENT);
- }
+ int tintColor = mContext.getColor(com.android.internal.R.color.materialColorOnSurface);
+
if (bubble.isConversation()) {
// Don't bubble conversation action
menuActions.add(new BubbleBarMenuView.MenuAction(
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
index ec3c0b83fe2d..c74bf53268f9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
@@ -338,6 +338,11 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
// Make mImeSourceControl point to the new control before starting the animation.
if (hadImeSourceControl && mImeSourceControl != imeSourceControl) {
mImeSourceControl.release(SurfaceControl::release);
+ if (android.view.inputmethod.Flags.refactorInsetsController()
+ && !hasImeLeash && mAnimation != null) {
+ // In case of losing the leash, the animation should be cancelled.
+ mAnimation.cancel();
+ }
}
mImeSourceControl = imeSourceControl;
@@ -414,9 +419,14 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
// already (e.g., when focussing an editText in activity B, while and editText in
// activity A is focussed), we will not get a call of #insetsControlChanged, and
// therefore have to start the show animation from here
- startAnimation(mImeRequestedVisible /* show */, false /* forceRestart */);
-
- setVisibleDirectly(mImeRequestedVisible || mAnimation != null, statsToken);
+ startAnimation(mImeRequestedVisible /* show */, false /* forceRestart */,
+ statsToken);
+
+ // In case of a hide, the statsToken should not been send yet (as the animation
+ // is still ongoing). It will be sent at the end of the animation
+ boolean hideAnimOngoing = !mImeRequestedVisible && mAnimation != null;
+ setVisibleDirectly(mImeRequestedVisible || mAnimation != null,
+ hideAnimOngoing ? null : statsToken);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
index 813772f20a8a..2f5afcaa907b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
@@ -352,8 +352,8 @@ public class DividerSnapAlgorithm {
? mPinnedTaskbarInsets.right : mPinnedTaskbarInsets.bottom;
float ratio = areOffscreenRatiosSupported()
- ? SplitLayout.OFFSCREEN_ASYMMETRIC_RATIO
- : SplitLayout.ONSCREEN_ONLY_ASYMMETRIC_RATIO;
+ ? SplitSpec.OFFSCREEN_ASYMMETRIC_RATIO
+ : SplitSpec.ONSCREEN_ONLY_ASYMMETRIC_RATIO;
int size = (int) (ratio * (end - start)) - mDividerSize / 2;
int leftTopPosition = start + pinnedTaskbarShiftStart + size;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index 1852cda7e804..88c91db27bf3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -112,11 +112,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
private static final int FLING_EXIT_DURATION = 450;
private static final int FLING_OFFSCREEN_DURATION = 500;
- /** A split ratio used on larger screens, where we can fit both apps onscreen. */
- public static final float ONSCREEN_ONLY_ASYMMETRIC_RATIO = 0.33f;
- /** A split ratio used on smaller screens, where we place one app mostly offscreen. */
- public static final float OFFSCREEN_ASYMMETRIC_RATIO = 0.1f;
-
// Here are some (arbitrarily decided) layer definitions used during animations to make sure the
// layers stay in order. (During transitions, everything is reparented onto a transition root
// and can be freely relayered.)
@@ -236,7 +231,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
updateDividerConfig(mContext);
mRootBounds.set(configuration.windowConfiguration.getBounds());
- mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
+ updateLayouts();
mInteractionJankMonitor = InteractionJankMonitor.getInstance();
resetDividerPosition();
updateInvisibleRect();
@@ -490,7 +485,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
mIsLargeScreen = configuration.smallestScreenWidthDp >= 600;
mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
configuration);
- mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
+ updateLayouts();
updateDividerConfig(mContext);
initDividerPosition(mTempRect, wasLeftRightSplit);
updateInvisibleRect();
@@ -518,7 +513,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
mRootBounds.set(tmpRect);
mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
mIsLargeScreen, mRootBounds.width() >= mRootBounds.height());
- mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
+ updateLayouts();
initDividerPosition(mTempRect, wasLeftRightSplit);
}
@@ -652,7 +647,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
if (!mPinnedTaskbarInsets.equals(pinnedTaskbarInsets)) {
mPinnedTaskbarInsets = pinnedTaskbarInsets;
// Refresh the DividerSnapAlgorithm.
- mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
+ updateLayouts();
// If the divider is no longer placed on a snap point, animate it to the nearest one.
DividerSnapAlgorithm.SnapTarget snapTarget =
findSnapTarget(mDividerPosition, 0, false /* hardDismiss */);
@@ -824,8 +819,22 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
return mDividerSnapAlgorithm.calculateSnapTarget(position, velocity, hardDismiss);
}
- private DividerSnapAlgorithm getSnapAlgorithm(Context context, Rect rootBounds) {
- final Rect insets = getDisplayStableInsets(context);
+ /**
+ * (Re)calculates the split screen logic for this particular display/orientation. Refreshes the
+ * DividerSnapAlgorithm, which controls divider snap points, and populates a map in SplitState
+ * with bounds for all valid split layouts.
+ */
+ private void updateLayouts() {
+ // Update SplitState map
+
+ if (Flags.enableFlexibleTwoAppSplit()) {
+ mSplitState.populateLayouts(
+ mRootBounds, mDividerSize, mIsLeftRightSplit, mPinnedTaskbarInsets.toRect());
+ }
+
+ // Get new DividerSnapAlgorithm
+
+ final Rect insets = getDisplayStableInsets(mContext);
// Make split axis insets value same as the larger one to avoid bounds1 and bounds2
// have difference for avoiding size-compat mode when switching unresizable apps in
@@ -835,10 +844,10 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
insets.set(insets.left, largerInsets, insets.right, largerInsets);
}
- return new DividerSnapAlgorithm(
- context.getResources(),
- rootBounds.width(),
- rootBounds.height(),
+ mDividerSnapAlgorithm = new DividerSnapAlgorithm(
+ mContext.getResources(),
+ mRootBounds.width(),
+ mRootBounds.height(),
mDividerSize,
mIsLeftRightSplit,
insets,
@@ -1560,7 +1569,9 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
final int imeTargetPosition = getImeTargetPosition();
mHasImeFocus = imeTargetPosition != SPLIT_POSITION_UNDEFINED;
if (!mHasImeFocus) {
- return 0;
+ if (!android.view.inputmethod.Flags.refactorInsetsController() || showing) {
+ return 0;
+ }
}
mStartImeTop = showing ? hiddenTop : shownTop;
@@ -1613,7 +1624,11 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
@Override
public void onImePositionChanged(int displayId, int imeTop, SurfaceControl.Transaction t) {
- if (displayId != mDisplayId || !mHasImeFocus) return;
+ if (displayId != mDisplayId || !mHasImeFocus) {
+ if (!android.view.inputmethod.Flags.refactorInsetsController() || mImeShown) {
+ return;
+ }
+ }
onProgress(getProgress(imeTop));
mSplitLayoutHandler.onLayoutPositionChanging(SplitLayout.this);
}
@@ -1621,7 +1636,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
@Override
public void onImeEndPositioning(int displayId, boolean cancel,
SurfaceControl.Transaction t) {
- if (displayId != mDisplayId || !mHasImeFocus || cancel) return;
+ if (displayId != mDisplayId || cancel) return;
+ if (!mHasImeFocus) {
+ if (!android.view.inputmethod.Flags.refactorInsetsController() || mImeShown) {
+ return;
+ }
+ }
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
"Split IME animation ending, canceled=%b", cancel);
onProgress(1.0f);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitSpec.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitSpec.java
new file mode 100644
index 000000000000..9c951bd89876
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitSpec.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.common.split;
+
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_10_90;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_33_66;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_66_33;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_90_10;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_3_10_45_45;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_3_33_33_33;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_3_45_45_10;
+import static com.android.wm.shell.shared.split.SplitScreenConstants.stateToString;
+
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.Log;
+
+import com.android.wm.shell.shared.split.SplitScreenConstants.SplitScreenState;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A reference class that stores the split layouts available in this device/orientation. Layouts are
+ * available as lists of RectFs, where each RectF represents the bounds of an app.
+ */
+public class SplitSpec {
+ private static final String TAG = "SplitSpec";
+ private static final boolean DEBUG = true;
+
+ /** A split ratio used on larger screens, where we can fit both apps onscreen. */
+ public static final float ONSCREEN_ONLY_ASYMMETRIC_RATIO = 0.33f;
+ /** A split ratio used on smaller screens, where we place one app mostly offscreen. */
+ public static final float OFFSCREEN_ASYMMETRIC_RATIO = 0.1f;
+ /** A 50-50 split ratio. */
+ public static final float MIDDLE_RATIO = 0.5f;
+
+ private final boolean mIsLeftRightSplit;
+ /** The usable display area, considering insets that affect split bounds. */
+ private final RectF mUsableArea;
+ /** Half the divider size. */
+ private final float mHalfDiv;
+
+ /** A large map that stores all valid split layouts. */
+ private final Map<Integer, List<RectF>> mLayouts = new HashMap<>();
+
+ /** Constructor; initializes the layout map. */
+ public SplitSpec(Rect displayBounds, int dividerSize, boolean isLeftRightSplit,
+ Rect pinnedTaskbarInsets) {
+ mIsLeftRightSplit = isLeftRightSplit;
+ mUsableArea = new RectF(displayBounds);
+ mUsableArea.left += pinnedTaskbarInsets.left;
+ mUsableArea.top += pinnedTaskbarInsets.top;
+ mUsableArea.right -= pinnedTaskbarInsets.right;
+ mUsableArea.bottom -= pinnedTaskbarInsets.bottom;
+ mHalfDiv = dividerSize / 2f;
+
+ // The "start" position, considering insets.
+ float s = isLeftRightSplit ? mUsableArea.left : mUsableArea.top;
+ // The "end" position, considering insets.
+ float e = isLeftRightSplit ? mUsableArea.right : mUsableArea.bottom;
+ // The "length" of the usable display (width or height). Apps are arranged along this axis.
+ float l = e - s;
+ float divPos;
+ float divPos2;
+
+ // SNAP_TO_2_10_90
+ divPos = s + (l * OFFSCREEN_ASYMMETRIC_RATIO);
+ createAppLayout(SNAP_TO_2_10_90, divPos);
+
+ // SNAP_TO_2_33_66
+ divPos = s + (l * ONSCREEN_ONLY_ASYMMETRIC_RATIO);
+ createAppLayout(SNAP_TO_2_33_66, divPos);
+
+ // SNAP_TO_2_50_50
+ divPos = s + (l * MIDDLE_RATIO);
+ createAppLayout(SNAP_TO_2_50_50, divPos);
+
+ // SNAP_TO_2_66_33
+ divPos = s + (l * (1 - ONSCREEN_ONLY_ASYMMETRIC_RATIO));
+ createAppLayout(SNAP_TO_2_66_33, divPos);
+
+ // SNAP_TO_2_90_10
+ divPos = s + (l * (1 - OFFSCREEN_ASYMMETRIC_RATIO));
+ createAppLayout(SNAP_TO_2_90_10, divPos);
+
+ // SNAP_TO_3_10_45_45
+ divPos = s + (l * OFFSCREEN_ASYMMETRIC_RATIO);
+ divPos2 = e - ((l * (1 - OFFSCREEN_ASYMMETRIC_RATIO)) / 2f);
+ createAppLayout(SNAP_TO_3_10_45_45, divPos, divPos2);
+
+ // SNAP_TO_3_33_33_33
+ divPos = s + (l * ONSCREEN_ONLY_ASYMMETRIC_RATIO);
+ divPos2 = e - (l * ONSCREEN_ONLY_ASYMMETRIC_RATIO);
+ createAppLayout(SNAP_TO_3_33_33_33, divPos, divPos2);
+
+ // SNAP_TO_3_45_45_10
+ divPos = s + ((l * (1 - OFFSCREEN_ASYMMETRIC_RATIO)) / 2f);
+ divPos2 = e - (l * OFFSCREEN_ASYMMETRIC_RATIO);
+ createAppLayout(SNAP_TO_3_45_45_10, divPos, divPos2);
+
+ if (DEBUG) {
+ dump();
+ }
+ }
+
+ /**
+ * Creates a two-app layout and enters it into the layout map.
+ * @param divPos The position of the divider.
+ */
+ private void createAppLayout(@SplitScreenState int state, float divPos) {
+ List<RectF> list = new ArrayList<>();
+ RectF rect1 = new RectF(mUsableArea);
+ RectF rect2 = new RectF(mUsableArea);
+ if (mIsLeftRightSplit) {
+ rect1.right = divPos - mHalfDiv;
+ rect2.left = divPos + mHalfDiv;
+ } else {
+ rect1.top = divPos - mHalfDiv;
+ rect2.bottom = divPos + mHalfDiv;
+ }
+ list.add(rect1);
+ list.add(rect2);
+ mLayouts.put(state, list);
+ }
+
+ /**
+ * Creates a three-app layout and enters it into the layout map.
+ * @param divPos1 The position of the first divider.
+ * @param divPos2 The position of the second divider.
+ */
+ private void createAppLayout(@SplitScreenState int state, float divPos1, float divPos2) {
+ List<RectF> list = new ArrayList<>();
+ RectF rect1 = new RectF(mUsableArea);
+ RectF rect2 = new RectF(mUsableArea);
+ RectF rect3 = new RectF(mUsableArea);
+ if (mIsLeftRightSplit) {
+ rect1.right = divPos1 - mHalfDiv;
+ rect2.left = divPos1 + mHalfDiv;
+ rect2.right = divPos2 - mHalfDiv;
+ rect3.left = divPos2 + mHalfDiv;
+ } else {
+ rect1.right = divPos1 - mHalfDiv;
+ rect2.left = divPos1 + mHalfDiv;
+ rect3.right = divPos2 - mHalfDiv;
+ rect3.left = divPos2 + mHalfDiv;
+ }
+ list.add(rect1);
+ list.add(rect2);
+ list.add(rect3);
+ mLayouts.put(state, list);
+ }
+
+ /** Logs all calculated layouts */
+ private void dump() {
+ mLayouts.forEach((k, v) -> {
+ Log.d(TAG, stateToString(k));
+ v.forEach(rect -> Log.d(TAG, " - " + rect.toShortString()));
+ });
+ }
+
+ /** Returns the layout associated with a given split state. */
+ List<RectF> getSpec(@SplitScreenState int state) {
+ return mLayouts.get(state);
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java
index 71758e0d2159..d1d133d16ae4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitState.java
@@ -19,11 +19,17 @@ package com.android.wm.shell.common.split;
import static com.android.wm.shell.shared.split.SplitScreenConstants.NOT_IN_SPLIT;
import static com.android.wm.shell.shared.split.SplitScreenConstants.SplitScreenState;
+import android.graphics.Rect;
+import android.graphics.RectF;
+
+import java.util.List;
+
/**
* A class that manages the "state" of split screen. See {@link SplitScreenState} for definitions.
*/
public class SplitState {
private @SplitScreenState int mState = NOT_IN_SPLIT;
+ private SplitSpec mSplitSpec;
/** Updates the current state of split screen on this device. */
public void set(@SplitScreenState int newState) {
@@ -39,4 +45,16 @@ public class SplitState {
public void exit() {
set(NOT_IN_SPLIT);
}
+
+ /** Refresh the valid layouts for this display/orientation. */
+ public void populateLayouts(Rect displayBounds, int dividerSize, boolean isLeftRightSplit,
+ Rect pinnedTaskbarInsets) {
+ mSplitSpec =
+ new SplitSpec(displayBounds, dividerSize, isLeftRightSplit, pinnedTaskbarInsets);
+ }
+
+ /** Returns the layout associated with a given split state. */
+ public List<RectF> getLayout(@SplitScreenState int state) {
+ return mSplitSpec.getSpec(state);
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
index 9d4b4bbb33de..fe6066c8c4fb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
@@ -55,6 +55,7 @@ import com.android.wm.shell.compatui.api.CompatUIHandler;
import com.android.wm.shell.compatui.api.CompatUIInfo;
import com.android.wm.shell.compatui.impl.CompatUIEvents.SizeCompatRestartButtonClicked;
import com.android.wm.shell.desktopmode.DesktopUserRepositories;
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import com.android.wm.shell.sysui.KeyguardChangeListener;
import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
@@ -70,7 +71,6 @@ import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
-import java.util.function.IntPredicate;
import java.util.function.Predicate;
/**
@@ -667,9 +667,10 @@ public class CompatUIController implements OnDisplaysChangedListener,
private void createOrUpdateUserAspectRatioSettingsLayout(@NonNull TaskInfo taskInfo,
@Nullable ShellTaskOrganizer.TaskListener taskListener) {
+ boolean overridesShowAppHandle = DesktopModeStatus.overridesShowAppHandle(mContext);
if (mUserAspectRatioSettingsLayout != null) {
if (mUserAspectRatioSettingsLayout.needsToBeRecreated(taskInfo, taskListener)
- || mIsInDesktopMode) {
+ || mIsInDesktopMode || overridesShowAppHandle) {
mUserAspectRatioSettingsLayout.release();
mUserAspectRatioSettingsLayout = null;
} else {
@@ -682,8 +683,9 @@ public class CompatUIController implements OnDisplaysChangedListener,
return;
}
}
- if (mIsInDesktopMode) {
- // Return if in desktop mode.
+ if (mIsInDesktopMode || overridesShowAppHandle) {
+ // Return if in desktop mode or app handle menu is already showing change aspect ratio
+ // option.
return;
}
// Create a new UI layout.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
index 0cd0f4a97bbf..9d2da41725b1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
@@ -1025,12 +1025,14 @@ public abstract class WMShellModule {
static DesktopUserRepositories provideDesktopUserRepositories(
Context context,
ShellInit shellInit,
+ ShellController shellController,
DesktopPersistentRepository desktopPersistentRepository,
DesktopRepositoryInitializer desktopRepositoryInitializer,
@ShellMainThread CoroutineScope mainScope,
UserManager userManager
) {
- return new DesktopUserRepositories(context, shellInit, desktopPersistentRepository,
+ return new DesktopUserRepositories(context, shellInit, shellController,
+ desktopPersistentRepository,
desktopRepositoryInitializer,
mainScope, userManager);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt
index 8e2a412764eb..536dc2a58534 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt
@@ -74,13 +74,11 @@ class DesktopImmersiveController(
{ SurfaceControl.Transaction() },
)
- @VisibleForTesting var state: TransitionState? = null
-
- @VisibleForTesting val pendingExternalExitTransitions = mutableListOf<ExternalPendingExit>()
+ @VisibleForTesting val pendingImmersiveTransitions = mutableListOf<PendingTransition>()
/** Whether there is an immersive transition that hasn't completed yet. */
private val inProgress: Boolean
- get() = state != null || pendingExternalExitTransitions.isNotEmpty()
+ get() = pendingImmersiveTransitions.isNotEmpty()
private val rectEvaluator = RectEvaluator()
@@ -101,20 +99,19 @@ class DesktopImmersiveController(
if (inProgress) {
logV(
"Cannot start entry because transition(s) already in progress: %s",
- getRunningTransitions(),
+ pendingImmersiveTransitions,
)
return
}
val wct = WindowContainerTransaction().apply { setBounds(taskInfo.token, Rect()) }
logV("Moving task ${taskInfo.taskId} into immersive mode")
val transition = transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ this)
- state =
- TransitionState(
- transition = transition,
- displayId = taskInfo.displayId,
- taskId = taskInfo.taskId,
- direction = Direction.ENTER,
- )
+ addPendingImmersiveTransition(
+ taskId = taskInfo.taskId,
+ displayId = taskInfo.displayId,
+ direction = Direction.ENTER,
+ transition = transition,
+ )
}
/** Starts a transition to move an immersive task out of immersive. */
@@ -123,7 +120,7 @@ class DesktopImmersiveController(
if (inProgress) {
logV(
"Cannot start exit because transition(s) already in progress: %s",
- getRunningTransitions(),
+ pendingImmersiveTransitions,
)
return
}
@@ -134,13 +131,12 @@ class DesktopImmersiveController(
}
logV("Moving task %d out of immersive mode, reason: %s", taskInfo.taskId, reason)
val transition = transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ this)
- state =
- TransitionState(
- transition = transition,
- displayId = taskInfo.displayId,
- taskId = taskInfo.taskId,
- direction = Direction.EXIT,
- )
+ addPendingImmersiveTransition(
+ taskId = taskInfo.taskId,
+ displayId = taskInfo.displayId,
+ direction = Direction.EXIT,
+ transition = transition,
+ )
}
/**
@@ -194,7 +190,13 @@ class DesktopImmersiveController(
return ExitResult.Exit(
exitingTask = immersiveTask,
runOnTransitionStart = { transition ->
- addPendingImmersiveExit(immersiveTask, displayId, transition)
+ addPendingImmersiveTransition(
+ taskId = immersiveTask,
+ displayId = displayId,
+ direction = Direction.EXIT,
+ transition = transition,
+ animate = false,
+ )
},
)
}
@@ -220,10 +222,12 @@ class DesktopImmersiveController(
return ExitResult.Exit(
exitingTask = taskInfo.taskId,
runOnTransitionStart = { transition ->
- addPendingImmersiveExit(
+ addPendingImmersiveTransition(
taskId = taskInfo.taskId,
displayId = taskInfo.displayId,
+ direction = Direction.EXIT,
transition = transition,
+ animate = false,
)
},
)
@@ -233,14 +237,26 @@ class DesktopImmersiveController(
/** Whether the [change] in the [transition] is a known immersive change. */
fun isImmersiveChange(transition: IBinder, change: TransitionInfo.Change): Boolean {
- return pendingExternalExitTransitions.any {
+ return pendingImmersiveTransitions.any {
it.transition == transition && it.taskId == change.taskInfo?.taskId
}
}
- private fun addPendingImmersiveExit(taskId: Int, displayId: Int, transition: IBinder) {
- pendingExternalExitTransitions.add(
- ExternalPendingExit(taskId = taskId, displayId = displayId, transition = transition)
+ private fun addPendingImmersiveTransition(
+ taskId: Int,
+ displayId: Int,
+ direction: Direction,
+ transition: IBinder,
+ animate: Boolean = true,
+ ) {
+ pendingImmersiveTransitions.add(
+ PendingTransition(
+ taskId = taskId,
+ displayId = displayId,
+ direction = direction,
+ transition = transition,
+ animate = animate,
+ )
)
}
@@ -251,19 +267,17 @@ class DesktopImmersiveController(
finishTransaction: SurfaceControl.Transaction,
finishCallback: Transitions.TransitionFinishCallback,
): Boolean {
- val state = requireState()
- check(state.transition == transition) {
- "Transition $transition did not match expected state=$state"
- }
+ val immersiveTransition = getImmersiveTransition(transition) ?: return false
+ if (!immersiveTransition.animate) return false
logD("startAnimation transition=%s", transition)
animateResize(
- targetTaskId = state.taskId,
+ targetTaskId = immersiveTransition.taskId,
info = info,
startTransaction = startTransaction,
finishTransaction = finishTransaction,
finishCallback = {
finishCallback.onTransitionFinished(/* wct= */ null)
- clearState()
+ pendingImmersiveTransitions.remove(immersiveTransition)
},
)
return true
@@ -346,18 +360,6 @@ class DesktopImmersiveController(
request: TransitionRequestInfo,
): WindowContainerTransaction? = null
- override fun onTransitionConsumed(
- transition: IBinder,
- aborted: Boolean,
- finishTransaction: SurfaceControl.Transaction?,
- ) {
- val state = this.state ?: return
- if (transition == state.transition && aborted) {
- clearState()
- }
- super.onTransitionConsumed(transition, aborted, finishTransaction)
- }
-
/**
* Called when any transition in the system is ready to play. This is needed to update the
* repository state before window decorations are drawn (which happens immediately after
@@ -371,67 +373,42 @@ class DesktopImmersiveController(
finishTransaction: SurfaceControl.Transaction,
) {
val desktopRepository: DesktopRepository = desktopUserRepositories.current
- // Check if this is a pending external exit transition.
- val pendingExit =
- pendingExternalExitTransitions.firstOrNull { pendingExit ->
- pendingExit.transition == transition
- }
- if (pendingExit != null) {
- if (info.hasTaskChange(taskId = pendingExit.taskId)) {
- if (desktopRepository.isTaskInFullImmersiveState(pendingExit.taskId)) {
- logV("Pending external exit for task#%d verified", pendingExit.taskId)
- desktopRepository.setTaskInFullImmersiveState(
- displayId = pendingExit.displayId,
- taskId = pendingExit.taskId,
- immersive = false,
- )
- if (Flags.enableRestoreToPreviousSizeFromDesktopImmersive()) {
- desktopRepository.removeBoundsBeforeFullImmersive(pendingExit.taskId)
- }
- }
- }
- return
- }
+ val pendingTransition = getImmersiveTransition(transition)
- // Check if this is a direct immersive enter/exit transition.
- if (transition == state?.transition) {
- val state = requireState()
- val immersiveChange =
- info.changes.firstOrNull { c -> c.taskInfo?.taskId == state.taskId }
+ if (pendingTransition != null) {
+ val taskId = pendingTransition.taskId
+ val immersiveChange = info.getTaskChange(taskId = taskId)
if (immersiveChange == null) {
logV(
- "Direct move for task#%d in %s direction missing immersive change.",
- state.taskId,
- state.direction,
+ "Transition for task#%d in %s direction missing immersive change.",
+ taskId,
+ pendingTransition.direction,
)
return
}
- val startBounds = immersiveChange.startAbsBounds
- logV("Direct move for task#%d in %s direction verified", state.taskId, state.direction)
-
- when (state.direction) {
- Direction.ENTER -> {
- desktopRepository.setTaskInFullImmersiveState(
- displayId = state.displayId,
- taskId = state.taskId,
- immersive = true,
- )
- if (Flags.enableRestoreToPreviousSizeFromDesktopImmersive()) {
- desktopRepository.saveBoundsBeforeFullImmersive(state.taskId, startBounds)
+ logV(
+ "Immersive transition for task#%d in %s direction verified",
+ taskId,
+ pendingTransition.direction,
+ )
+ desktopRepository.setTaskInFullImmersiveState(
+ displayId = pendingTransition.displayId,
+ taskId = taskId,
+ immersive = pendingTransition.direction == Direction.ENTER,
+ )
+ if (Flags.enableRestoreToPreviousSizeFromDesktopImmersive()) {
+ when (pendingTransition.direction) {
+ Direction.EXIT -> {
+ desktopRepository.removeBoundsBeforeFullImmersive(taskId)
}
- }
- Direction.EXIT -> {
- desktopRepository.setTaskInFullImmersiveState(
- displayId = state.displayId,
- taskId = state.taskId,
- immersive = false,
- )
- if (Flags.enableRestoreToPreviousSizeFromDesktopImmersive()) {
- desktopRepository.removeBoundsBeforeFullImmersive(state.taskId)
+ Direction.ENTER -> {
+ desktopRepository.saveBoundsBeforeFullImmersive(
+ taskId,
+ immersiveChange.startAbsBounds,
+ )
}
}
}
- return
}
// Check if this is an untracked exit transition, like display rotation.
@@ -450,35 +427,31 @@ class DesktopImmersiveController(
}
override fun onTransitionMerged(merged: IBinder, playing: IBinder) {
- val pendingExit =
- pendingExternalExitTransitions.firstOrNull { pendingExit ->
- pendingExit.transition == merged
+ val pendingTransition =
+ pendingImmersiveTransitions.firstOrNull { pendingTransition ->
+ pendingTransition.transition == merged
}
- if (pendingExit != null) {
+ if (pendingTransition != null) {
logV(
- "Pending exit transition %s for task#%s merged into %s",
+ "Pending transition %s for task#%s merged into %s",
merged,
- pendingExit.taskId,
+ pendingTransition.taskId,
playing,
)
- pendingExit.transition = playing
+ pendingTransition.transition = playing
}
}
override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {
- val pendingExit =
- pendingExternalExitTransitions.firstOrNull { pendingExit ->
- pendingExit.transition == transition
- }
- if (pendingExit != null) {
- logV("Pending exit transition %s for task#%s finished", transition, pendingExit)
- pendingExternalExitTransitions.remove(pendingExit)
+ val pendingTransition = getImmersiveTransition(transition)
+ if (pendingTransition != null) {
+ logV("Pending exit transition %s for task#%s finished", transition, pendingTransition)
+ pendingImmersiveTransitions.remove(pendingTransition)
}
}
- private fun clearState() {
- state = null
- }
+ private fun getImmersiveTransition(transition: IBinder) =
+ pendingImmersiveTransitions.firstOrNull { it.transition == transition }
private fun getExitDestinationBounds(taskInfo: RunningTaskInfo): Rect {
val displayLayout =
@@ -496,24 +469,13 @@ class DesktopImmersiveController(
}
}
- private fun requireState(): TransitionState =
- state ?: error("Expected non-null transition state")
-
- private fun getRunningTransitions(): List<IBinder> {
- val running = mutableListOf<IBinder>()
- state?.let { running.add(it.transition) }
- pendingExternalExitTransitions.forEach { running.add(it.transition) }
- return running
- }
-
- private fun TransitionInfo.hasTaskChange(taskId: Int): Boolean =
- changes.any { c -> c.taskInfo?.taskId == taskId }
+ private fun TransitionInfo.getTaskChange(taskId: Int): TransitionInfo.Change? =
+ changes.firstOrNull { c -> c.taskInfo?.taskId == taskId }
private fun dump(pw: PrintWriter, prefix: String) {
val innerPrefix = "$prefix "
pw.println("${prefix}DesktopImmersiveController")
- pw.println(innerPrefix + "state=" + state)
- pw.println(innerPrefix + "pendingExternalExitTransitions=" + pendingExternalExitTransitions)
+ pw.println(innerPrefix + "pendingImmersiveTransitions=" + pendingImmersiveTransitions)
}
/** The state of the currently running transition. */
@@ -526,12 +488,22 @@ class DesktopImmersiveController(
)
/**
- * Tracks state of a transition involving an immersive exit that is external to this class' own
- * transitions. This usually means transitions that exit immersive mode as a side-effect and not
- * the primary action (for example, minimizing the immersive task or launching a new task on top
- * of the immersive task).
+ * Tracks state of a transition involving an immersive enter or exit. This includes both
+ * transitions that should and should not be animated by this handler.
+ *
+ * @param taskId of the task that should enter/exit immersive mode
+ * @param displayId of the display that should enter/exit immersive mode
+ * @param direction of the immersive transition
+ * @param transition that will apply this transaction
+ * @param animate whether transition should be animated by this handler
*/
- data class ExternalPendingExit(val taskId: Int, val displayId: Int, var transition: IBinder)
+ data class PendingTransition(
+ val taskId: Int,
+ val displayId: Int,
+ val direction: Direction,
+ var transition: IBinder,
+ val animate: Boolean,
+ )
/** The result of an external exit request. */
sealed class ExitResult {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt
index 14623cf9e703..606a729305b4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt
@@ -235,8 +235,7 @@ fun isTaskWidthOrHeightEqual(taskBounds: Rect, stableBounds: Rect): Boolean {
/** Returns true if task bound is equal to stable bounds else returns false. */
fun isTaskBoundsEqual(taskBounds: Rect, stableBounds: Rect): Boolean {
- return taskBounds.width() == stableBounds.width() &&
- taskBounds.height() == stableBounds.height()
+ return taskBounds == stableBounds
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
index 0bc7ca982ec2..9a1abd52846b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
@@ -383,12 +383,13 @@ class DesktopTasksController(
taskId: Int,
wct: WindowContainerTransaction = WindowContainerTransaction(),
transitionSource: DesktopModeTransitionSource,
+ remoteTransition: RemoteTransition? = null,
): Boolean {
val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId)
if (runningTask == null) {
- return moveBackgroundTaskToDesktop(taskId, wct, transitionSource)
+ return moveBackgroundTaskToDesktop(taskId, wct, transitionSource, remoteTransition)
}
- moveRunningTaskToDesktop(runningTask, wct, transitionSource)
+ moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition)
return true
}
@@ -396,6 +397,7 @@ class DesktopTasksController(
taskId: Int,
wct: WindowContainerTransaction,
transitionSource: DesktopModeTransitionSource,
+ remoteTransition: RemoteTransition? = null,
): Boolean {
if (recentTasksController?.findTaskInBackground(taskId) == null) {
logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId)
@@ -418,8 +420,17 @@ class DesktopTasksController(
.apply { launchWindowingMode = WINDOWING_MODE_FREEFORM }
.toBundle(),
)
- // TODO(343149901): Add DPI changes for task launch
- val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
+
+ val transition: IBinder
+ if (remoteTransition != null) {
+ val transitionType = transitionType(remoteTransition)
+ val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition)
+ transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler)
+ remoteTransitionHandler.setTransition(transition)
+ } else {
+ // TODO(343149901): Add DPI changes for task launch
+ transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
+ }
desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
FREEFORM_ANIMATION_DURATION
)
@@ -433,6 +444,7 @@ class DesktopTasksController(
task: RunningTaskInfo,
wct: WindowContainerTransaction = WindowContainerTransaction(),
transitionSource: DesktopModeTransitionSource,
+ remoteTransition: RemoteTransition? = null,
) {
if (
DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() &&
@@ -450,12 +462,21 @@ class DesktopTasksController(
excludeTaskId = task.taskId,
reason = DesktopImmersiveController.ExitReason.TASK_LAUNCH,
)
+
// Bring other apps to front first
val taskIdToMinimize =
bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, task.taskId)
addMoveToDesktopChanges(wct, task)
- val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
+ val transition: IBinder
+ if (remoteTransition != null) {
+ val transitionType = transitionType(remoteTransition)
+ val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition)
+ transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler)
+ remoteTransitionHandler.setTransition(transition)
+ } else {
+ transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
+ }
desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
FREEFORM_ANIMATION_DURATION
)
@@ -2657,9 +2678,17 @@ class DesktopTasksController(
}
}
- override fun moveToDesktop(taskId: Int, transitionSource: DesktopModeTransitionSource) {
+ override fun moveToDesktop(
+ taskId: Int,
+ transitionSource: DesktopModeTransitionSource,
+ remoteTransition: RemoteTransition?,
+ ) {
executeRemoteCallWithTaskPermission(controller, "moveTaskToDesktop") { c ->
- c.moveTaskToDesktop(taskId, transitionSource = transitionSource)
+ c.moveTaskToDesktop(
+ taskId,
+ transitionSource = transitionSource,
+ remoteTransition = remoteTransition,
+ )
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt
index e5f52839d9f4..8b5d1c502bc9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt
@@ -28,6 +28,7 @@ import com.android.wm.shell.desktopmode.persistence.DesktopRepositoryInitializer
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.annotations.ShellMainThread
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import com.android.wm.shell.sysui.ShellController
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.sysui.UserChangeListener
import kotlinx.coroutines.CoroutineScope
@@ -36,6 +37,7 @@ import kotlinx.coroutines.CoroutineScope
class DesktopUserRepositories(
context: Context,
shellInit: ShellInit,
+ private val shellController: ShellController,
private val persistentRepository: DesktopPersistentRepository,
private val repositoryInitializer: DesktopRepositoryInitializer,
@ShellMainThread private val mainCoroutineScope: CoroutineScope,
@@ -61,15 +63,16 @@ class DesktopUserRepositories(
init {
userId = ActivityManager.getCurrentUser()
if (DesktopModeStatus.canEnterDesktopMode(context)) {
- shellInit.addInitCallback(::initRepoFromPersistentStorage, this)
+ shellInit.addInitCallback(::onInit, this)
}
if (Flags.enableDesktopWindowingHsum()) {
userIdToProfileIdsMap[userId] = userManager.getProfiles(userId).map { it.id }
}
}
- private fun initRepoFromPersistentStorage() {
+ private fun onInit() {
repositoryInitializer.initialize(this)
+ shellController.addUserChangeListener(this)
}
/** Returns [DesktopRepository] for the parent user id. */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl
index aac2361f717e..fa383cb55118 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl
@@ -53,7 +53,8 @@ interface IDesktopMode {
oneway void setTaskListener(IDesktopTaskListener listener);
/** Move a task with given `taskId` to desktop */
- void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource);
+ void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource,
+ in @nullable RemoteTransition remoteTransition);
/** Remove desktop on the given display */
oneway void removeDesktop(int displayId);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
index c5fca028a1a6..45d1281ba0e0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
@@ -23,7 +23,6 @@ import android.content.res.Resources
import android.graphics.Point
import android.os.SystemProperties
import android.util.Slog
-import androidx.core.content.withStyledAttributes
import com.android.window.flags.Flags
import com.android.wm.shell.R
import com.android.wm.shell.desktopmode.CaptionState
@@ -299,31 +298,12 @@ class AppHandleEducationController(
}
private fun tooltipColorScheme(captionState: CaptionState): TooltipColorScheme {
- context.withStyledAttributes(
- set = null,
- attrs =
- intArrayOf(
- com.android.internal.R.attr.materialColorOnTertiaryFixed,
- com.android.internal.R.attr.materialColorTertiaryFixed,
- com.android.internal.R.attr.materialColorTertiaryFixedDim,
- ),
- defStyleAttr = 0,
- defStyleRes = 0,
- ) {
- val onTertiaryFixed = getColor(/* index= */ 0, /* defValue= */ 0)
- val tertiaryFixed = getColor(/* index= */ 1, /* defValue= */ 0)
- val tertiaryFixedDim = getColor(/* index= */ 2, /* defValue= */ 0)
- val taskInfo = (captionState as CaptionState.AppHandle).runningTaskInfo
+ val onTertiaryFixed =
+ context.getColor(com.android.internal.R.color.materialColorOnTertiaryFixed)
+ val tertiaryFixed =
+ context.getColor(com.android.internal.R.color.materialColorTertiaryFixed)
- val tooltipContainerColor =
- if (decorThemeUtil.getAppTheme(taskInfo) == Theme.LIGHT) {
- tertiaryFixed
- } else {
- tertiaryFixedDim
- }
- return TooltipColorScheme(tooltipContainerColor, onTertiaryFixed, onTertiaryFixed)
- }
- return TooltipColorScheme(0, 0, 0)
+ return TooltipColorScheme(tertiaryFixed, onTertiaryFixed, onTertiaryFixed)
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
index dae3c21b6697..acb5622b041c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
@@ -124,7 +124,6 @@ public class PipTransition extends PipTransitionController implements
// Internal state and relevant cached info
//
- @Nullable
private Transitions.TransitionFinishCallback mFinishCallback;
private ValueAnimator mTransitionAnimator;
@@ -236,7 +235,6 @@ public class PipTransition extends PipTransitionController implements
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction,
@NonNull Transitions.TransitionFinishCallback finishCallback) {
- mFinishCallback = finishCallback;
if (transition == mEnterTransition || info.getType() == TRANSIT_PIP) {
mEnterTransition = null;
// If we are in swipe PiP to Home transition we are ENTERING_PIP as a jumpcut transition
@@ -282,7 +280,6 @@ public class PipTransition extends PipTransitionController implements
if (isRemovePipTransition(info)) {
return removePipImmediately(info, startTransaction, finishTransaction, finishCallback);
}
- mFinishCallback = null;
return false;
}
@@ -331,6 +328,7 @@ public class PipTransition extends PipTransitionController implements
if (pipChange == null) {
return false;
}
+ mFinishCallback = finishCallback;
// We expect the PiP activity as a separate change in a config-at-end transition;
// only flings are not using config-at-end for resize bounds changes
TransitionInfo.Change pipActivityChange = getDeferConfigActivityChange(info,
@@ -378,6 +376,7 @@ public class PipTransition extends PipTransitionController implements
if (pipActivityChange == null) {
return false;
}
+ mFinishCallback = finishCallback;
final SurfaceControl pipLeash = getLeash(pipChange);
final Rect destinationBounds = pipChange.getEndAbsBounds();
@@ -446,6 +445,7 @@ public class PipTransition extends PipTransitionController implements
if (pipActivityChange == null) {
return false;
}
+ mFinishCallback = finishCallback;
final SurfaceControl pipLeash = getLeash(pipChange);
final Rect startBounds = pipChange.getStartAbsBounds();
@@ -572,6 +572,7 @@ public class PipTransition extends PipTransitionController implements
if (pipChange == null) {
return false;
}
+ mFinishCallback = finishCallback;
Rect destinationBounds = pipChange.getEndAbsBounds();
SurfaceControl pipLeash = mPipTransitionState.getPinnedTaskLeash();
@@ -614,6 +615,7 @@ public class PipTransition extends PipTransitionController implements
return false;
}
}
+ mFinishCallback = finishCallback;
// The parent change if we were in a multi-activity PiP; null if single activity PiP.
final TransitionInfo.Change parentBeforePip = pipChange.getTaskInfo() == null
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index ba724edb9747..e93ca9e0bd72 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -1969,32 +1969,32 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
}
}
- int currentSnapPosition = mSplitLayout.calculateCurrentSnapPosition();
-
- if (Flags.enableFlexibleTwoAppSplit()) {
- // Split screen can be laid out in such a way that some of the apps are offscreen.
- // For the purposes of passing SplitBounds up to launcher (for use in thumbnails
- // etc.), we crop the bounds down to the screen size.
- topLeftBounds.left =
- Math.max(topLeftBounds.left, 0);
- topLeftBounds.top =
- Math.max(topLeftBounds.top, 0);
- bottomRightBounds.right =
- Math.min(bottomRightBounds.right, mSplitLayout.getDisplayWidth());
- bottomRightBounds.top =
- Math.min(bottomRightBounds.top, mSplitLayout.getDisplayHeight());
-
- // TODO (b/349828130): Can change to getState() fully after brief soak time.
- if (mSplitState.get() != currentSnapPosition) {
- Log.wtf(TAG, "SplitState is " + mSplitState.get()
- + ", expected " + currentSnapPosition);
- currentSnapPosition = mSplitState.get();
+ // If all stages are filled, create new SplitBounds and update Recents.
+ if (mainStageTopTaskId != INVALID_TASK_ID && sideStageTopTaskId != INVALID_TASK_ID) {
+ int currentSnapPosition = mSplitLayout.calculateCurrentSnapPosition();
+ if (Flags.enableFlexibleTwoAppSplit()) {
+ // Split screen can be laid out in such a way that some of the apps are
+ // offscreen. For the purposes of passing SplitBounds up to launcher (for use in
+ // thumbnails etc.), we crop the bounds down to the screen size.
+ topLeftBounds.left =
+ Math.max(topLeftBounds.left, 0);
+ topLeftBounds.top =
+ Math.max(topLeftBounds.top, 0);
+ bottomRightBounds.right =
+ Math.min(bottomRightBounds.right, mSplitLayout.getDisplayWidth());
+ bottomRightBounds.top =
+ Math.min(bottomRightBounds.top, mSplitLayout.getDisplayHeight());
+
+ // TODO (b/349828130): Can change to getState() fully after brief soak time.
+ if (mSplitState.get() != currentSnapPosition) {
+ Log.wtf(TAG, "SplitState is " + mSplitState.get()
+ + ", expected " + currentSnapPosition);
+ currentSnapPosition = mSplitState.get();
+ }
}
- }
+ SplitBounds splitBounds = new SplitBounds(topLeftBounds, bottomRightBounds,
+ leftTopTaskId, rightBottomTaskId, currentSnapPosition);
- SplitBounds splitBounds = new SplitBounds(topLeftBounds, bottomRightBounds,
- leftTopTaskId, rightBottomTaskId, currentSnapPosition);
- if (mainStageTopTaskId != INVALID_TASK_ID && sideStageTopTaskId != INVALID_TASK_ID) {
// Update the pair for the top tasks
boolean added = recentTasks.addSplitPair(mainStageTopTaskId, sideStageTopTaskId,
splitBounds);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt
index 3fa8df40dfef..a92100410d3d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageOrderOperator.kt
@@ -95,13 +95,16 @@ class StageOrderOperator (
*/
fun onEnteringSplit(@SnapPosition goingToLayout: Int) {
if (goingToLayout == currentLayout) {
- // Add protolog here. Return for now, but maybe we want to handle swap case, TBD
+ ProtoLog.d(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
+ "Entering Split requested same layout split is in: %d", goingToLayout)
return
}
val freeStages: List<StageTaskListener> =
allStages.filterNot { activeStages.contains(it) }
when(goingToLayout) {
- SplitScreenConstants.SNAP_TO_2_50_50 -> {
+ SplitScreenConstants.SNAP_TO_2_50_50,
+ SplitScreenConstants.SNAP_TO_2_33_66,
+ SplitScreenConstants.SNAP_TO_2_66_33 -> {
if (activeStages.size < 2) {
// take from allStages and add into activeStages
for (i in 0 until (2 - activeStages.size)) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java
index 03ded730865e..b0547a2a47b1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java
@@ -204,6 +204,7 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
"tryAnimateOpenIntentWithRemoteAndPipOrDesktop");
TransitionInfo.Change pipChange = null;
+ TransitionInfo.Change pipActivityChange = null;
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
TransitionInfo.Change change = info.getChanges().get(i);
if (mPipHandler.isEnteringPip(change, info.getType())) {
@@ -213,6 +214,12 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition {
}
pipChange = change;
info.getChanges().remove(i);
+ } else if (change.getTaskInfo() == null && change.getParent() != null
+ && pipChange != null && change.getParent().equals(pipChange.getContainer())) {
+ // Cache the PiP activity if it's a target and cached pip task change is its parent;
+ // note that we are bottom-to-top, so if such activity has a task
+ // that is also a target, then it must have been cached already as pipChange.
+ pipActivityChange = change;
}
}
TransitionInfo.Change desktopChange = null;
@@ -257,8 +264,16 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition {
// make a new startTransaction because pip's startEnterAnimation "consumes" it so
// we need a separate one to send over to launcher.
SurfaceControl.Transaction otherStartT = new SurfaceControl.Transaction();
-
- mPipHandler.startEnterAnimation(pipChange, otherStartT, finishTransaction, finishCB);
+ if (pipActivityChange == null) {
+ mPipHandler.startEnterAnimation(pipChange, otherStartT, finishTransaction,
+ finishCB);
+ } else {
+ info.getChanges().remove(pipActivityChange);
+ TransitionInfo pipInfo = subCopy(info, TRANSIT_PIP, false /* withChanges */);
+ pipInfo.getChanges().addAll(List.of(pipChange, pipActivityChange));
+ mPipHandler.startAnimation(mTransition, pipInfo, startTransaction,
+ finishTransaction, finishCB);
+ }
// Dispatch the rest of the transition normally.
if (mLeftoversHandler != null
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index 611f3e0ac5e8..a7d6301ecf06 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -1076,9 +1076,11 @@ public class Transitions implements RemoteCallable<Transitions>,
@Nullable TransitionHandler skip
) {
for (int i = mHandlers.size() - 1; i >= 0; --i) {
- if (mHandlers.get(i) == skip) continue;
- ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " try handler %s",
- mHandlers.get(i));
+ if (mHandlers.get(i) == skip) {
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " skip handler %s",
+ mHandlers.get(i));
+ continue;
+ }
boolean consumed = mHandlers.get(i).startAnimation(transition, info, startT, finishT,
finishCB);
if (consumed) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
index 0f5813c7807b..aea4bda527b4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
@@ -717,7 +717,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel,
// App sometimes draws before the insets from WindowDecoration#relayout have
// been added, so they must be added here
decoration.addCaptionInset(wct);
- mDesktopTasksController.moveTaskToDesktop(taskId, wct, source);
+ mDesktopTasksController.moveTaskToDesktop(taskId, wct, source,
+ /* remoteTransition= */ null);
decoration.closeHandleMenu();
if (source == DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
index 6562f38e724d..01319fb8c713 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
@@ -98,6 +98,7 @@ import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.desktopmode.CaptionState;
import com.android.wm.shell.desktopmode.DesktopModeEventLogger;
+import com.android.wm.shell.desktopmode.DesktopModeUtils;
import com.android.wm.shell.desktopmode.DesktopUserRepositories;
import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository;
import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
@@ -522,7 +523,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
} else {
mWindowDecorViewHolder.bindData(new AppHeaderViewHolder.HeaderData(
mTaskInfo,
- TaskInfoKt.getRequestingImmersive(mTaskInfo),
+ DesktopModeUtils.isTaskMaximized(mTaskInfo, mDisplayController),
inFullImmersive,
hasGlobalFocus,
/* maximizeHoverEnabled= */ canOpenMaximizeMenu(
@@ -556,10 +557,10 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
@Nullable
private Intent getBrowserLink() {
final Uri browserLink;
- if (isCapturedLinkAvailable()) {
- browserLink = mCapturedLink.mUri;
- } else if (mWebUri != null) {
+ if (mWebUri != null) {
browserLink = mWebUri;
+ } else if (isCapturedLinkAvailable()) {
+ browserLink = mCapturedLink.mUri;
} else {
browserLink = mGenericLink;
}
@@ -1316,7 +1317,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
*/
@VisibleForTesting
void onAssistContentReceived(@Nullable AssistContent assistContent) {
- mWebUri = assistContent == null ? null : assistContent.getWebUri();
+ mWebUri = assistContent == null ? null : AppToWebUtils.getSessionWebUri(assistContent);
loadAppInfoIfNeeded();
updateGenericLink();
final boolean supportsMultiInstance = mMultiInstanceHelper
@@ -1705,7 +1706,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
.isTaskInFullImmersiveState(mTaskInfo.taskId);
asAppHeader(mWindowDecorViewHolder).bindData(new AppHeaderViewHolder.HeaderData(
mTaskInfo,
- TaskInfoKt.getRequestingImmersive(mTaskInfo),
+ DesktopModeUtils.isTaskMaximized(mTaskInfo, mDisplayController),
inFullImmersive,
isFocused(),
/* maximizeHoverEnabled= */ canOpenMaximizeMenu(animatingTaskResizeOrReposition)));
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
index d94391820d05..f3a8b206867d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
@@ -40,12 +40,12 @@ import androidx.compose.ui.graphics.toArgb
import androidx.core.content.withStyledAttributes
import androidx.core.view.isGone
import androidx.core.view.isVisible
-import com.android.internal.R.attr.materialColorOnSecondaryContainer
-import com.android.internal.R.attr.materialColorOnSurface
-import com.android.internal.R.attr.materialColorSecondaryContainer
-import com.android.internal.R.attr.materialColorSurfaceContainerHigh
-import com.android.internal.R.attr.materialColorSurfaceContainerLow
-import com.android.internal.R.attr.materialColorSurfaceDim
+import com.android.internal.R.color.materialColorOnSecondaryContainer
+import com.android.internal.R.color.materialColorOnSurface
+import com.android.internal.R.color.materialColorSecondaryContainer
+import com.android.internal.R.color.materialColorSurfaceContainerHigh
+import com.android.internal.R.color.materialColorSurfaceContainerLow
+import com.android.internal.R.color.materialColorSurfaceDim
import com.android.window.flags.Flags
import com.android.window.flags.Flags.enableMinimizeButton
import com.android.wm.shell.R
@@ -79,7 +79,7 @@ class AppHeaderViewHolder(
data class HeaderData(
val taskInfo: RunningTaskInfo,
- val isRequestingImmersive: Boolean,
+ val isTaskMaximized: Boolean,
val inFullImmersiveState: Boolean,
val hasGlobalFocus: Boolean,
val enableMaximizeLongClick: Boolean,
@@ -163,7 +163,7 @@ class AppHeaderViewHolder(
override fun bindData(data: HeaderData) {
bindData(
data.taskInfo,
- data.isRequestingImmersive,
+ data.isTaskMaximized,
data.inFullImmersiveState,
data.hasGlobalFocus,
data.enableMaximizeLongClick
@@ -172,7 +172,7 @@ class AppHeaderViewHolder(
private fun bindData(
taskInfo: RunningTaskInfo,
- isRequestingImmersive: Boolean,
+ isTaskMaximized: Boolean,
inFullImmersiveState: Boolean,
hasGlobalFocus: Boolean,
enableMaximizeLongClick: Boolean,
@@ -180,7 +180,7 @@ class AppHeaderViewHolder(
if (DesktopModeFlags.ENABLE_THEMED_APP_HEADERS.isTrue()) {
bindDataWithThemedHeaders(
taskInfo,
- isRequestingImmersive,
+ isTaskMaximized,
inFullImmersiveState,
hasGlobalFocus,
enableMaximizeLongClick,
@@ -225,7 +225,7 @@ class AppHeaderViewHolder(
private fun bindDataWithThemedHeaders(
taskInfo: RunningTaskInfo,
- requestingImmersive: Boolean,
+ isTaskMaximized: Boolean,
inFullImmersiveState: Boolean,
hasGlobalFocus: Boolean,
enableMaximizeLongClick: Boolean,
@@ -283,7 +283,7 @@ class AppHeaderViewHolder(
drawableInsets = maximizeDrawableInsets
)
)
- setIcon(getMaximizeButtonIcon(requestingImmersive, inFullImmersiveState))
+ setIcon(getMaximizeButtonIcon(isTaskMaximized, inFullImmersiveState))
}
// Close button.
closeWindowButton.apply {
@@ -358,34 +358,19 @@ class AppHeaderViewHolder(
@DrawableRes
private fun getMaximizeButtonIcon(
- requestingImmersive: Boolean,
+ isTaskMaximized: Boolean,
inFullImmersiveState: Boolean
): Int = when {
- shouldShowEnterFullImmersiveIcon(requestingImmersive, inFullImmersiveState) -> {
- R.drawable.decor_desktop_mode_immersive_button_dark
- }
- shouldShowExitFullImmersiveIcon(requestingImmersive, inFullImmersiveState) -> {
- R.drawable.decor_desktop_mode_immersive_exit_button_dark
+ shouldShowExitFullImmersiveOrMaximizeIcon(isTaskMaximized, inFullImmersiveState) -> {
+ R.drawable.decor_desktop_mode_immersive_or_maximize_exit_button_dark
}
else -> R.drawable.decor_desktop_mode_maximize_button_dark
}
- private fun shouldShowEnterFullImmersiveIcon(
- requestingImmersive: Boolean,
- inFullImmersiveState: Boolean
- ): Boolean = Flags.enableFullyImmersiveInDesktop()
- && requestingImmersive && !inFullImmersiveState
-
- private fun shouldShowExitFullImmersiveIcon(
- requestingImmersive: Boolean,
- inFullImmersiveState: Boolean
- ): Boolean = isInFullImmersiveStateAndRequesting(requestingImmersive, inFullImmersiveState)
-
- private fun isInFullImmersiveStateAndRequesting(
- requestingImmersive: Boolean,
+ private fun shouldShowExitFullImmersiveOrMaximizeIcon(
+ isTaskMaximized: Boolean,
inFullImmersiveState: Boolean
- ): Boolean = Flags.enableFullyImmersiveInDesktop()
- && requestingImmersive && inFullImmersiveState
+ ): Boolean = (Flags.enableFullyImmersiveInDesktop() && inFullImmersiveState) || isTaskMaximized
private fun getHeaderStyle(header: Header): HeaderStyle {
return HeaderStyle(
@@ -595,33 +580,31 @@ class AppHeaderViewHolder(
@ColorInt
private fun getAppNameAndButtonColor(taskInfo: RunningTaskInfo, hasGlobalFocus: Boolean): Int {
- val materialColorAttr = when {
+ val materialColor = context.getColor(when {
taskInfo.isTransparentCaptionBarAppearance &&
taskInfo.isLightCaptionBarAppearance -> materialColorOnSecondaryContainer
taskInfo.isTransparentCaptionBarAppearance &&
!taskInfo.isLightCaptionBarAppearance -> materialColorOnSurface
isDarkMode() -> materialColorOnSurface
else -> materialColorOnSecondaryContainer
- }
+ })
val appDetailsOpacity = when {
isDarkMode() && !hasGlobalFocus -> DARK_THEME_UNFOCUSED_OPACITY
!isDarkMode() && !hasGlobalFocus -> LIGHT_THEME_UNFOCUSED_OPACITY
else -> FOCUSED_OPACITY
}
- context.withStyledAttributes(null, intArrayOf(materialColorAttr), 0, 0) {
- val color = getColor(0, 0)
- return if (appDetailsOpacity == FOCUSED_OPACITY) {
- color
- } else {
- Color.argb(
- appDetailsOpacity,
- Color.red(color),
- Color.green(color),
- Color.blue(color)
- )
- }
+
+
+ return if (appDetailsOpacity == FOCUSED_OPACITY) {
+ materialColor
+ } else {
+ Color.argb(
+ appDetailsOpacity,
+ Color.red(materialColor),
+ Color.green(materialColor),
+ Color.blue(materialColor)
+ )
}
- return 0
}
private fun isDarkMode(): Boolean {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
index a2afd2c92d3d..47ee7bb20199 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
@@ -718,7 +718,7 @@ public class BackAnimationControllerTest extends ShellTestCase {
tInfo = createTransitionInfo(TRANSIT_PREPARE_BACK_NAVIGATION, open);
callback = mock(Transitions.TransitionFinishCallback.class);
mBackTransitionHandler.startAnimation(mockBinder, tInfo, st, ft, callback);
- verify(mBackTransitionHandler).handlePrepareTransition(
+ verify(mBackTransitionHandler).handlePrepareTransition(eq(mockBinder),
eq(tInfo), eq(st), eq(ft), eq(callback));
mBackTransitionHandler.mCloseTransitionRequested = true;
TransitionInfo tInfo2 = createTransitionInfo(TRANSIT_CLOSE, close);
@@ -750,7 +750,7 @@ public class BackAnimationControllerTest extends ShellTestCase {
null /* remoteTransition */);
mBackTransitionHandler.handleRequest(mockBinder, requestInfo);
mBackTransitionHandler.startAnimation(mockBinder, tInfo, st, ft, callback);
- verify(mBackTransitionHandler).handlePrepareTransition(
+ verify(mBackTransitionHandler).handlePrepareTransition(eq(mockBinder),
eq(tInfo), eq(st), eq(ft), eq(callback));
mBackTransitionHandler.onAnimationFinished();
@@ -801,7 +801,7 @@ public class BackAnimationControllerTest extends ShellTestCase {
canHandle = mBackTransitionHandler.startAnimation(mockBinder,
prepareInfo, st, ft, callback2);
assertTrue("Handle prepare transition" , canHandle);
- verify(mBackTransitionHandler).handlePrepareTransition(
+ verify(mBackTransitionHandler).handlePrepareTransition(eq(mockBinder),
eq(prepareInfo), eq(st), eq(ft), eq(callback2));
final TransitionInfo closeInfo = createTransitionInfo(TRANSIT_CLOSE, close);
Transitions.TransitionFinishCallback mergeCallback =
@@ -819,7 +819,7 @@ public class BackAnimationControllerTest extends ShellTestCase {
canHandle = mBackTransitionHandler.startAnimation(
mockBinder, prepareInfo, st, ft, callback3);
assertTrue("Handle prepare transition" , canHandle);
- verify(mBackTransitionHandler).handlePrepareTransition(
+ verify(mBackTransitionHandler).handlePrepareTransition(eq(mockBinder),
eq(prepareInfo), eq(st), eq(ft), eq(callback3));
final TransitionInfo.Change open2 = createAppChange(
openTaskId2, TRANSIT_OPEN, FLAG_MOVED_TO_TOP);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS
index 5b05af9b0a74..3a017f38f3ea 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/OWNERS
@@ -1,2 +1,8 @@
# Bug component: 970984
-# includes OWNERS from parent directories \ No newline at end of file
+# includes OWNERS from parent directories
+
+mariiasand@google.com
+mcarli@google.com
+minagranic@google.com
+gracielawputri@google.com
+eevlachavas@google.com \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt
index 95a0c82c76df..88cc981dd30c 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxControllerRobotTest.kt
@@ -16,10 +16,8 @@
package com.android.wm.shell.compatui.letterbox
-import android.content.Context
import android.graphics.Rect
import android.view.SurfaceControl
-import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn
import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode
import org.mockito.kotlin.any
import org.mockito.kotlin.clearInvocations
@@ -31,10 +29,7 @@ import org.mockito.kotlin.verify
/**
* Robot to test [LetterboxController] implementations.
*/
-open class LetterboxControllerRobotTest(
- ctx: Context,
- controllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController
-) {
+abstract class LetterboxControllerRobotTest {
companion object {
@JvmStatic
@@ -44,21 +39,21 @@ open class LetterboxControllerRobotTest(
private val TASK_ID = 20
}
- private val letterboxConfiguration: LetterboxConfiguration
- private val surfaceBuilder: LetterboxSurfaceBuilder
- private val letterboxController: LetterboxController
- private val transaction: SurfaceControl.Transaction
- private val parentLeash: SurfaceControl
+ lateinit var letterboxController: LetterboxController
+ val transaction: SurfaceControl.Transaction
+ val parentLeash: SurfaceControl
init {
- letterboxConfiguration = LetterboxConfiguration(ctx)
- surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration)
- letterboxController = controllerBuilder(surfaceBuilder)
transaction = getTransactionMock()
parentLeash = mock<SurfaceControl>()
- spyOn(surfaceBuilder)
}
+ fun initController() {
+ letterboxController = buildController()
+ }
+
+ abstract fun buildController(): LetterboxController
+
fun sendCreateSurfaceRequest(
displayId: Int = DISPLAY_ID,
taskId: Int = TASK_ID
@@ -102,16 +97,6 @@ open class LetterboxControllerRobotTest(
letterboxController.dump()
}
- fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") {
- verify(surfaceBuilder, times(times)).createSurface(
- eq(transaction),
- eq(parentLeash),
- name.asAnyMode(),
- callSite.asAnyMode(),
- any()
- )
- }
-
fun checkTransactionRemovedInvoked(times: Int = 1) {
verify(transaction, times(times)).remove(any())
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt
index 667511288bfa..dd4cb1185b31 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/LetterboxUtilsTest.kt
@@ -16,7 +16,6 @@
package com.android.wm.shell.compatui.letterbox
-import android.content.Context
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import android.view.SurfaceControl
@@ -44,24 +43,14 @@ import org.mockito.kotlin.verify
@SmallTest
class LetterboxUtilsTest : ShellTestCase() {
- val firstLetterboxController = mock<LetterboxController>()
- val secondLetterboxController = mock<LetterboxController>()
- val thirdLetterboxController = mock<LetterboxController>()
-
- private val letterboxControllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController =
- { _ ->
- firstLetterboxController.append(secondLetterboxController)
- .append(thirdLetterboxController)
- }
-
@Test
fun `Appended LetterboxController invoked creation on all the controllers`() {
runTestScenario { r ->
r.sendCreateSurfaceRequest()
- r.verifyCreateSurfaceInvokedWithRequest(target = firstLetterboxController)
- r.verifyCreateSurfaceInvokedWithRequest(target = secondLetterboxController)
- r.verifyCreateSurfaceInvokedWithRequest(target = thirdLetterboxController)
+ r.verifyCreateSurfaceInvokedWithRequest(target = r.firstLetterboxController)
+ r.verifyCreateSurfaceInvokedWithRequest(target = r.secondLetterboxController)
+ r.verifyCreateSurfaceInvokedWithRequest(target = r.thirdLetterboxController)
}
}
@@ -69,9 +58,9 @@ class LetterboxUtilsTest : ShellTestCase() {
fun `Appended LetterboxController invoked destroy on all the controllers`() {
runTestScenario { r ->
r.sendDestroySurfaceRequest()
- r.verifyDestroySurfaceInvokedWithRequest(target = firstLetterboxController)
- r.verifyDestroySurfaceInvokedWithRequest(target = secondLetterboxController)
- r.verifyDestroySurfaceInvokedWithRequest(target = thirdLetterboxController)
+ r.verifyDestroySurfaceInvokedWithRequest(target = r.firstLetterboxController)
+ r.verifyDestroySurfaceInvokedWithRequest(target = r.secondLetterboxController)
+ r.verifyDestroySurfaceInvokedWithRequest(target = r.thirdLetterboxController)
}
}
@@ -79,9 +68,9 @@ class LetterboxUtilsTest : ShellTestCase() {
fun `Appended LetterboxController invoked update visibility on all the controllers`() {
runTestScenario { r ->
r.sendUpdateSurfaceVisibilityRequest(visible = true)
- r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = firstLetterboxController)
- r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = secondLetterboxController)
- r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = thirdLetterboxController)
+ r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.firstLetterboxController)
+ r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.secondLetterboxController)
+ r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.thirdLetterboxController)
}
}
@@ -89,9 +78,9 @@ class LetterboxUtilsTest : ShellTestCase() {
fun `Appended LetterboxController invoked update bounds on all the controllers`() {
runTestScenario { r ->
r.sendUpdateSurfaceBoundsRequest(taskBounds = Rect(), activityBounds = Rect())
- r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = firstLetterboxController)
- r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = secondLetterboxController)
- r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = thirdLetterboxController)
+ r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.firstLetterboxController)
+ r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.secondLetterboxController)
+ r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.thirdLetterboxController)
}
}
@@ -99,9 +88,9 @@ class LetterboxUtilsTest : ShellTestCase() {
fun `Appended LetterboxController invoked update dump on all the controllers`() {
runTestScenario { r ->
r.invokeDump()
- r.verifyDumpInvoked(target = firstLetterboxController)
- r.verifyDumpInvoked(target = secondLetterboxController)
- r.verifyDumpInvoked(target = thirdLetterboxController)
+ r.verifyDumpInvoked(target = r.firstLetterboxController)
+ r.verifyDumpInvoked(target = r.secondLetterboxController)
+ r.verifyDumpInvoked(target = r.thirdLetterboxController)
}
}
@@ -138,21 +127,20 @@ class LetterboxUtilsTest : ShellTestCase() {
* Runs a test scenario providing a Robot.
*/
fun runTestScenario(consumer: Consumer<AppendLetterboxControllerRobotTest>) {
- val robot = AppendLetterboxControllerRobotTest(mContext, letterboxControllerBuilder)
- consumer.accept(robot)
+ consumer.accept(AppendLetterboxControllerRobotTest().apply { initController() })
}
- class AppendLetterboxControllerRobotTest(
- ctx: Context,
- builder: (LetterboxSurfaceBuilder) -> LetterboxController
- ) : LetterboxControllerRobotTest(ctx, builder) {
+ class AppendLetterboxControllerRobotTest : LetterboxControllerRobotTest() {
+
+ val firstLetterboxController = mock<LetterboxController>()
+ val secondLetterboxController = mock<LetterboxController>()
+ val thirdLetterboxController = mock<LetterboxController>()
private var testableMap = mutableMapOf<Int, Int>()
private var onItemState: Int? = null
private var onMissingStateKey: Int? = null
private var onMissingStateMap: MutableMap<Int, Int>? = null
- private val transaction = getTransactionMock()
private val surface = SurfaceControl()
fun verifyCreateSurfaceInvokedWithRequest(
@@ -230,5 +218,9 @@ class LetterboxUtilsTest : ShellTestCase() {
fun verifySetWindowCrop(expectedWidth: Int, expectedHeight: Int) {
verify(transaction).setWindowCrop(surface, expectedWidth, expectedHeight)
}
+
+ override fun buildController(): LetterboxController =
+ firstLetterboxController.append(secondLetterboxController)
+ .append(thirdLetterboxController)
}
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt
index e6bff4c1ec15..3b72ff1cac71 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MixedLetterboxControllerTest.kt
@@ -16,7 +16,6 @@
package com.android.wm.shell.compatui.letterbox
-import android.content.Context
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.wm.shell.ShellTestCase
@@ -64,65 +63,48 @@ class MixedLetterboxControllerTest : ShellTestCase() {
* Runs a test scenario providing a Robot.
*/
fun runTestScenario(consumer: Consumer<MixedLetterboxControllerRobotTest>) {
- val robot = MixedLetterboxControllerRobotTest(mContext, ObjectToTestHolder())
- consumer.accept(robot)
+ consumer.accept(MixedLetterboxControllerRobotTest().apply { initController() })
}
- class MixedLetterboxControllerRobotTest(
- ctx: Context,
- private val objectToTestHolder: ObjectToTestHolder
- ) : LetterboxControllerRobotTest(ctx, objectToTestHolder.controllerBuilder) {
+ class MixedLetterboxControllerRobotTest : LetterboxControllerRobotTest() {
+ val singleLetterboxController: SingleSurfaceLetterboxController =
+ mock<SingleSurfaceLetterboxController>()
+ val multipleLetterboxController: MultiSurfaceLetterboxController =
+ mock<MultiSurfaceLetterboxController>()
+ val controllerStrategy: LetterboxControllerStrategy = mock<LetterboxControllerStrategy>()
fun configureStrategyFor(letterboxMode: LetterboxMode) {
- doReturn(letterboxMode).`when`(objectToTestHolder.controllerStrategy)
- .getLetterboxImplementationMode()
+ doReturn(letterboxMode).`when`(controllerStrategy).getLetterboxImplementationMode()
}
fun checkCreateInvokedOnSingleController(times: Int = 1) {
- verify(
- objectToTestHolder.singleLetterboxController,
- times(times)
- ).createLetterboxSurface(any(), any(), any())
+ verify(singleLetterboxController, times(times)).createLetterboxSurface(
+ any(),
+ any(),
+ any()
+ )
}
fun checkCreateInvokedOnMultiController(times: Int = 1) {
- verify(
- objectToTestHolder.multipleLetterboxController,
- times(times)
- ).createLetterboxSurface(any(), any(), any())
+ verify(multipleLetterboxController, times(times)).createLetterboxSurface(
+ any(),
+ any(),
+ any()
+ )
}
fun checkDestroyInvokedOnSingleController(times: Int = 1) {
- verify(
- objectToTestHolder.singleLetterboxController,
- times(times)
- ).destroyLetterboxSurface(any(), any())
+ verify(singleLetterboxController, times(times)).destroyLetterboxSurface(any(), any())
}
fun checkDestroyInvokedOnMultiController(times: Int = 1) {
- verify(
- objectToTestHolder.multipleLetterboxController,
- times(times)
- ).destroyLetterboxSurface(any(), any())
+ verify(multipleLetterboxController, times(times)).destroyLetterboxSurface(any(), any())
}
- }
-
- data class ObjectToTestHolder(
- val singleLetterboxController: SingleSurfaceLetterboxController =
- mock<SingleSurfaceLetterboxController>(),
- val multipleLetterboxController: MultiSurfaceLetterboxController =
- mock<MultiSurfaceLetterboxController>(),
- val controllerStrategy: LetterboxControllerStrategy = mock<LetterboxControllerStrategy>()
- ) {
-
- private val mixedController =
- MixedLetterboxController(
- singleLetterboxController,
- multipleLetterboxController,
- controllerStrategy
- )
- val controllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController =
- { _ -> mixedController }
+ override fun buildController(): LetterboxController = MixedLetterboxController(
+ singleLetterboxController,
+ multipleLetterboxController,
+ controllerStrategy
+ )
}
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt
index 295d4edf206b..3fd837db478c 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/MultiSurfaceLetterboxControllerTest.kt
@@ -16,13 +16,20 @@
package com.android.wm.shell.compatui.letterbox
+import android.content.Context
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
+import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn
import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode
import java.util.function.Consumer
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
/**
* Tests for [MultiSurfaceLetterboxController].
@@ -147,9 +154,33 @@ class MultiSurfaceLetterboxControllerTest : ShellTestCase() {
/**
* Runs a test scenario providing a Robot.
*/
- fun runTestScenario(consumer: Consumer<LetterboxControllerRobotTest>) {
- val robot =
- LetterboxControllerRobotTest(mContext, { sb -> MultiSurfaceLetterboxController(sb) })
- consumer.accept(robot)
+ fun runTestScenario(consumer: Consumer<MultiLetterboxControllerRobotTest>) {
+ consumer.accept(MultiLetterboxControllerRobotTest(mContext).apply { initController() })
+ }
+
+ class MultiLetterboxControllerRobotTest(context: Context) :
+ LetterboxControllerRobotTest() {
+
+ private val letterboxConfiguration: LetterboxConfiguration
+ private val surfaceBuilder: LetterboxSurfaceBuilder
+
+ init {
+ letterboxConfiguration = LetterboxConfiguration(context)
+ surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration)
+ spyOn(surfaceBuilder)
+ }
+
+ override fun buildController(): LetterboxController =
+ MultiSurfaceLetterboxController(surfaceBuilder)
+
+ fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") {
+ verify(surfaceBuilder, times(times)).createSurface(
+ eq(transaction),
+ eq(parentLeash),
+ name.asAnyMode(),
+ callSite.asAnyMode(),
+ any()
+ )
+ }
}
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt
index 125e700bcd42..e6ffe98875ed 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/letterbox/SingleSurfaceLetterboxControllerTest.kt
@@ -16,13 +16,20 @@
package com.android.wm.shell.compatui.letterbox
+import android.content.Context
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
+import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn
import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode
import java.util.function.Consumer
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
/**
* Tests for [SingleSurfaceLetterboxController].
@@ -120,9 +127,33 @@ class SingleSurfaceLetterboxControllerTest : ShellTestCase() {
/**
* Runs a test scenario providing a Robot.
*/
- fun runTestScenario(consumer: Consumer<LetterboxControllerRobotTest>) {
- val robot =
- LetterboxControllerRobotTest(mContext, { sb -> SingleSurfaceLetterboxController(sb) })
- consumer.accept(robot)
+ fun runTestScenario(consumer: Consumer<SingleLetterboxControllerRobotTest>) {
+ consumer.accept(SingleLetterboxControllerRobotTest(mContext).apply { initController() })
+ }
+
+ class SingleLetterboxControllerRobotTest(context: Context) :
+ LetterboxControllerRobotTest() {
+
+ private val letterboxConfiguration: LetterboxConfiguration
+ private val surfaceBuilder: LetterboxSurfaceBuilder
+
+ init {
+ letterboxConfiguration = LetterboxConfiguration(context)
+ surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration)
+ spyOn(surfaceBuilder)
+ }
+
+ override fun buildController(): LetterboxController =
+ SingleSurfaceLetterboxController(surfaceBuilder)
+
+ fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") {
+ verify(surfaceBuilder, times(times)).createSurface(
+ eq(transaction),
+ eq(parentLeash),
+ name.asAnyMode(),
+ callSite.asAnyMode(),
+ any()
+ )
+ }
}
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt
index 41a594a3347a..4cc641cd1d81 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt
@@ -36,6 +36,7 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito.never
import com.android.dx.mockito.inline.extended.StaticMockitoSession
import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE
import com.android.window.flags.Flags.FLAG_RESPECT_ORIENTATION_CHANGE_FOR_UNRESIZEABLE
+import com.android.wm.shell.sysui.ShellController
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.common.ShellExecutor
@@ -98,6 +99,7 @@ class DesktopActivityOrientationChangeHandlerTest : ShellTestCase() {
@Mock lateinit var persistentRepository: DesktopPersistentRepository
@Mock lateinit var repositoryInitializer: DesktopRepositoryInitializer
@Mock lateinit var userManager: UserManager
+ @Mock lateinit var shellController: ShellController
private lateinit var mockitoSession: StaticMockitoSession
private lateinit var handler: DesktopActivityOrientationChangeHandler
@@ -123,6 +125,7 @@ class DesktopActivityOrientationChangeHandlerTest : ShellTestCase() {
DesktopUserRepositories(
context,
shellInit,
+ shellController,
persistentRepository,
repositoryInitializer,
testScope,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt
index db4c7465ae48..b87f20023796 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt
@@ -42,6 +42,7 @@ import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.TestShellExecutor
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.DisplayLayout
+import com.android.wm.shell.desktopmode.DesktopImmersiveController.Direction
import com.android.wm.shell.desktopmode.DesktopImmersiveController.ExitReason.USER_INTERACTION
import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask
import com.android.wm.shell.sysui.ShellInit
@@ -88,13 +89,15 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
@Before
fun setUp() {
userRepositories = DesktopUserRepositories(
- context, ShellInit(TestShellExecutor()), mock(), mock(), mock(), mock()
+ context, ShellInit(TestShellExecutor()), mock(), mock(), mock(), mock(), mock()
)
whenever(mockDisplayController.getDisplayLayout(DEFAULT_DISPLAY))
.thenReturn(mockDisplayLayout)
whenever(mockDisplayLayout.getStableBounds(any())).thenAnswer { invocation ->
(invocation.getArgument(0) as Rect).set(STABLE_BOUNDS)
}
+ whenever(mockDisplayLayout.width()).thenReturn(DISPLAY_BOUNDS.width())
+ whenever(mockDisplayLayout.height()).thenReturn(DISPLAY_BOUNDS.height())
controller = DesktopImmersiveController(
shellInit = mock(),
transitions = mockTransitions,
@@ -277,10 +280,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY, USER_INTERACTION)
- assertThat(controller.pendingExternalExitTransitions.any { exit ->
- exit.transition == transition && exit.displayId == DEFAULT_DISPLAY
- && exit.taskId == task.taskId
- }).isTrue()
+ assertTransitionPending(
+ transition = transition,
+ taskId = task.taskId,
+ direction = Direction.EXIT,
+ animate = false
+ )
}
@Test
@@ -298,10 +303,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY, USER_INTERACTION)
- assertThat(controller.pendingExternalExitTransitions.any { exit ->
- exit.transition == transition && exit.displayId == DEFAULT_DISPLAY
- && exit.taskId == task.taskId
- }).isFalse()
+ assertTransitionNotPending(
+ transition = transition,
+ taskId = task.taskId,
+ direction = Direction.EXIT,
+ animate = false
+ )
}
@Test
@@ -360,10 +367,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
reason = USER_INTERACTION,
).asExit()?.runOnTransitionStart?.invoke(transition)
- assertThat(controller.pendingExternalExitTransitions.any { exit ->
- exit.transition == transition && exit.displayId == DEFAULT_DISPLAY
- && exit.taskId == task.taskId
- }).isFalse()
+ assertTransitionNotPending(
+ transition = transition,
+ taskId = task.taskId,
+ animate = false,
+ direction = Direction.EXIT
+ )
}
@Test
@@ -416,10 +425,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
controller.exitImmersiveIfApplicable(wct, task, USER_INTERACTION)
.asExit()?.runOnTransitionStart?.invoke(transition)
- assertThat(controller.pendingExternalExitTransitions.any { exit ->
- exit.transition == transition && exit.displayId == DEFAULT_DISPLAY
- && exit.taskId == task.taskId
- }).isTrue()
+ assertTransitionPending(
+ transition = transition,
+ taskId = task.taskId,
+ direction = Direction.EXIT,
+ animate = false
+ )
}
@Test
@@ -481,10 +492,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
)
controller.onTransitionFinished(transition, aborted = false)
- assertThat(controller.pendingExternalExitTransitions.any { exit ->
- exit.transition == transition && exit.displayId == DEFAULT_DISPLAY
- && exit.taskId == task.taskId
- }).isFalse()
+ assertTransitionNotPending(
+ transition = transition,
+ taskId = task.taskId,
+ direction = Direction.EXIT,
+ animate = false
+ )
}
@Test
@@ -513,14 +526,18 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
controller.onTransitionMerged(transition, mergedToTransition)
controller.onTransitionFinished(mergedToTransition, aborted = false)
- assertThat(controller.pendingExternalExitTransitions.any { exit ->
- exit.transition == transition && exit.displayId == DEFAULT_DISPLAY
- && exit.taskId == task.taskId
- }).isFalse()
- assertThat(controller.pendingExternalExitTransitions.any { exit ->
- exit.transition == mergedToTransition && exit.displayId == DEFAULT_DISPLAY
- && exit.taskId == task.taskId
- }).isFalse()
+ assertTransitionNotPending(
+ transition = transition,
+ taskId = task.taskId,
+ animate = false,
+ direction = Direction.EXIT
+ )
+ assertTransitionNotPending(
+ transition = mergedToTransition,
+ taskId = task.taskId,
+ animate = false,
+ direction = Direction.EXIT
+ )
}
@Test
@@ -686,7 +703,7 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
@Test
@EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
- fun externalAnimateResizeChange_doesNotCleanUpPendingTransitionState() {
+ fun externalAnimateResizeChange_doesNotRemovePendingTransition() {
val task = createFreeformTask()
val mockBinder = mock(IBinder::class.java)
whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller)))
@@ -709,12 +726,16 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
)
animatorTestRule.advanceTimeBy(DesktopImmersiveController.FULL_IMMERSIVE_ANIM_DURATION_MS)
- assertThat(controller.state).isNotNull()
+ assertTransitionPending(
+ transition = mockBinder,
+ taskId = task.taskId,
+ direction = Direction.EXIT
+ )
}
@Test
@EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
- fun startAnimation_missingChange_clearsState() {
+ fun startAnimation_missingChange_removesPendingTransition() {
val task = createFreeformTask()
val mockBinder = mock(IBinder::class.java)
whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller)))
@@ -735,7 +756,42 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
finishCallback = {}
)
- assertThat(controller.state).isNull()
+ assertTransitionNotPending(
+ transition = mockBinder,
+ taskId = task.taskId,
+ direction = Direction.ENTER
+ )
+ }
+
+ private fun assertTransitionPending(
+ transition: IBinder,
+ taskId: Int,
+ direction: Direction,
+ animate: Boolean = true,
+ displayId: Int = DEFAULT_DISPLAY
+ ) {
+ assertThat(controller.pendingImmersiveTransitions.any { pendingTransition ->
+ pendingTransition.transition == transition
+ && pendingTransition.displayId == displayId
+ && pendingTransition.taskId == taskId
+ && pendingTransition.animate == animate
+ && pendingTransition.direction == direction
+ }).isTrue()
+ }
+
+ private fun assertTransitionNotPending(
+ transition: IBinder,
+ taskId: Int,
+ direction: Direction,
+ animate: Boolean = true,
+ displayId: Int = DEFAULT_DISPLAY
+ ) {
+ assertThat(controller.pendingImmersiveTransitions.any { pendingTransition ->
+ pendingTransition.transition == transition
+ && pendingTransition.displayId == displayId
+ && pendingTransition.taskId == taskId
+ && pendingTransition.direction == direction
+ }).isFalse()
}
private fun createTransitionInfo(
@@ -768,5 +824,6 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
companion object {
private val STABLE_BOUNDS = Rect(0, 100, 2000, 1900)
+ private val DISPLAY_BOUNDS = Rect(0, 0, 2000, 2000)
}
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
index 7c9494ce7026..cf16e42a729b 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
@@ -276,6 +276,7 @@ class DesktopTasksControllerTest : ShellTestCase() {
DesktopUserRepositories(
context,
shellInit,
+ shellController,
persistentRepository,
repositoryInitializer,
testScope,
@@ -1217,14 +1218,40 @@ class DesktopTasksControllerTest : ShellTestCase() {
}
@Test
- fun moveRunningTaskToDesktop_deviceSupported_taskIsMovedToDesktop() {
- val task = setUpFullscreenTask()
+ @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
+ fun moveBackgroundTaskToDesktop_remoteTransition_usesOneShotHandler() {
+ val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java)
+ whenever(
+ transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())
+ ).thenReturn(Binder())
- controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
+ val task = createTaskInfo(1)
+ whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null)
+ whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task)
+ controller.moveTaskToDesktop(
+ taskId = task.taskId,
+ transitionSource = UNKNOWN,
+ remoteTransition = RemoteTransition(spy(TestRemoteTransition())))
- val wct = getLatestEnterDesktopWct()
- assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION)
+ assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value)
+ }
+
+
+ @Test
+ fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() {
+ val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java)
+ whenever(
+ transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())
+ ).thenReturn(Binder())
+
+ controller.moveRunningTaskToDesktop(
+ task = setUpFullscreenTask(),
+ transitionSource = UNKNOWN,
+ remoteTransition = RemoteTransition(spy(TestRemoteTransition())))
+
+ verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION)
+ assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value)
}
@Test
@@ -3881,7 +3908,7 @@ class DesktopTasksControllerTest : ShellTestCase() {
@Test
fun shellController_registersUserChangeListener() {
- verify(shellController, times(1)).addUserChangeListener(any())
+ verify(shellController, times(2)).addUserChangeListener(any())
}
@Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
index 0712d58166bb..39178cb2cd25 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
@@ -42,6 +42,7 @@ import com.android.internal.jank.InteractionJankMonitor
import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.sysui.ShellController
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask
import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository
@@ -96,6 +97,7 @@ class DesktopTasksLimiterTest : ShellTestCase() {
@Mock lateinit var persistentRepository: DesktopPersistentRepository
@Mock lateinit var repositoryInitializer: DesktopRepositoryInitializer
@Mock lateinit var userManager: UserManager
+ @Mock lateinit var shellController: ShellController
private lateinit var mockitoSession: StaticMockitoSession
private lateinit var desktopTasksLimiter: DesktopTasksLimiter
@@ -117,6 +119,7 @@ class DesktopTasksLimiterTest : ShellTestCase() {
DesktopUserRepositories(
context,
shellInit,
+ shellController,
persistentRepository,
repositoryInitializer,
testScope,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt
index 5767df4c5a8e..a2e939d86adb 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt
@@ -24,14 +24,15 @@ import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
-import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn
+import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.dx.mockito.inline.extended.StaticMockitoSession
import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_HSUM
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository
import com.android.wm.shell.desktopmode.persistence.DesktopRepositoryInitializer
+import com.android.wm.shell.sysui.ShellController
import com.android.wm.shell.sysui.ShellInit
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CoroutineScope
@@ -66,6 +67,7 @@ class DesktopUserRepositoriesTest : ShellTestCase() {
private val persistentRepository = mock<DesktopPersistentRepository>()
private val repositoryInitializer = mock<DesktopRepositoryInitializer>()
private val userManager = mock<UserManager>()
+ private val shellController = mock<ShellController>()
@Before
fun setUp() {
@@ -86,8 +88,14 @@ class DesktopUserRepositoriesTest : ShellTestCase() {
whenever(userManager.getProfiles(USER_ID_1)).thenReturn(profiles)
userRepositories = DesktopUserRepositories(
- context, shellInit, persistentRepository, repositoryInitializer, datastoreScope,
- userManager)
+ context,
+ shellInit,
+ shellController,
+ persistentRepository,
+ repositoryInitializer,
+ datastoreScope,
+ userManager
+ )
}
@After
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt
index 1c88a290d677..cdf064b075a1 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopRepositoryInitializerTest.kt
@@ -27,6 +27,7 @@ import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.desktopmode.DesktopUserRepositories
+import com.android.wm.shell.sysui.ShellController
import com.android.wm.shell.sysui.ShellInit
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CoroutineScope
@@ -64,6 +65,7 @@ class DesktopRepositoryInitializerTest : ShellTestCase() {
private val persistentRepository = mock<DesktopPersistentRepository>()
private val userManager = mock<UserManager>()
private val testExecutor = mock<ShellExecutor>()
+ private val shellController = mock<ShellController>()
@Before
fun setUp() {
@@ -74,7 +76,12 @@ class DesktopRepositoryInitializerTest : ShellTestCase() {
DesktopRepositoryInitializerImpl(context, persistentRepository, datastoreScope)
desktopUserRepositories =
DesktopUserRepositories(
- context, shellInit, persistentRepository, repositoryInitializer, datastoreScope,
+ context,
+ shellInit,
+ shellController,
+ persistentRepository,
+ repositoryInitializer,
+ datastoreScope,
userManager
)
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageOrderOperatorTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageOrderOperatorTests.kt
new file mode 100644
index 000000000000..3b4a86a71d90
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageOrderOperatorTests.kt
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.splitscreen
+
+import android.view.Display.DEFAULT_DISPLAY
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.icons.IconProvider
+import com.android.wm.shell.Flags.enableFlexibleSplit
+import com.android.wm.shell.ShellTaskOrganizer
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.common.SyncTransactionQueue
+import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_33_66
+import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50
+import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_66_33
+import com.android.wm.shell.splitscreen.StageTaskListener.StageListenerCallbacks
+import com.android.wm.shell.windowdecor.WindowDecorViewModel
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import java.util.Optional
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class StageOrderOperatorTests : ShellTestCase() {
+
+ @Mock
+ lateinit var mTaskOrganizer: ShellTaskOrganizer
+ @Mock
+ lateinit var mSyncQueue: SyncTransactionQueue
+ @Mock
+ lateinit var stageListenerCallbacks: StageListenerCallbacks
+ @Mock
+ lateinit var iconProvider: IconProvider
+ @Mock
+ lateinit var windowDecorViewModel: Optional<WindowDecorViewModel>
+
+ lateinit var stageOrderOperator: StageOrderOperator
+
+ @Before
+ fun setup() {
+ stageOrderOperator = StageOrderOperator(
+ context,
+ mTaskOrganizer,
+ DEFAULT_DISPLAY,
+ stageListenerCallbacks,
+ mSyncQueue,
+ iconProvider,
+ windowDecorViewModel,
+ )
+ assert(stageOrderOperator.activeStages.size == 0)
+ }
+
+ @Test
+ fun activeStages_2_2app_50_50_split() {
+ assumeTrue(enableFlexibleSplit())
+
+ stageOrderOperator.onEnteringSplit(SNAP_TO_2_50_50)
+ assert(stageOrderOperator.activeStages.size == 2)
+ }
+
+ @Test
+ fun activeStages_2_2app_33_66_split() {
+ assumeTrue(enableFlexibleSplit())
+
+ stageOrderOperator.onEnteringSplit(SNAP_TO_2_33_66)
+ assert(stageOrderOperator.activeStages.size == 2)
+ }
+
+ @Test
+ fun activeStages_2_2app_66_33_split() {
+ assumeTrue(enableFlexibleSplit())
+
+ stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33)
+ assert(stageOrderOperator.activeStages.size == 2)
+ }
+
+ @Test
+ fun activateSameCountStage_noOp() {
+ assumeTrue(enableFlexibleSplit())
+
+ stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33)
+ stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33)
+ assert(stageOrderOperator.activeStages.size == 2)
+ }
+
+ @Test
+ fun deactivate_emptyActiveStages() {
+ assumeTrue(enableFlexibleSplit())
+
+ stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33)
+ stageOrderOperator.onExitingSplit()
+ assert(stageOrderOperator.activeStages.isEmpty())
+ }
+
+ @Test
+ fun swapDividerPos_twoApps() {
+ assumeTrue(enableFlexibleSplit())
+
+ stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33)
+ val stageIndex0: StageTaskListener = stageOrderOperator.activeStages[0]
+ val stageIndex1: StageTaskListener = stageOrderOperator.activeStages[1]
+
+ stageOrderOperator.onDoubleTappedDivider()
+ val newStageIndex0: StageTaskListener = stageOrderOperator.activeStages[0]
+ val newStageIndex1: StageTaskListener = stageOrderOperator.activeStages[1]
+
+ assert(stageIndex0 == newStageIndex1)
+ assert(stageIndex1 == newStageIndex0)
+ }
+
+ @Test
+ fun swapDividerPos_twiceNoOp_twoApps() {
+ assumeTrue(enableFlexibleSplit())
+
+ stageOrderOperator.onEnteringSplit(SNAP_TO_2_66_33)
+ val stageIndex0: StageTaskListener = stageOrderOperator.activeStages[0]
+ val stageIndex1: StageTaskListener = stageOrderOperator.activeStages[1]
+
+ stageOrderOperator.onDoubleTappedDivider()
+ stageOrderOperator.onDoubleTappedDivider()
+ val newStageIndex0: StageTaskListener = stageOrderOperator.activeStages[0]
+ val newStageIndex1: StageTaskListener = stageOrderOperator.activeStages[1]
+
+ assert(stageIndex0 == newStageIndex0)
+ assert(stageIndex1 == newStageIndex1)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt
index e871711fd25e..cf6c3a5e03a0 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenuTest.kt
@@ -63,6 +63,7 @@ class DesktopHeaderManageWindowsMenuTest : ShellTestCase() {
userRepositories = DesktopUserRepositories(
context = context,
shellInit = ShellInit(TestShellExecutor()),
+ shellController = mock(),
persistentRepository = mock(),
repositoryInitializer = mock(),
mainCoroutineScope = mock(),
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
index 88f62d10913d..0214da4660ad 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
@@ -388,7 +388,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest
}
@Test
- fun testOnDecorMaximizedOrRestored_togglesTaskSize() {
+ fun testOnDecorMaximizedOrRestored_togglesTaskSize_maximize() {
val maxOrRestoreListenerCaptor = forClass(Function0::class.java)
as ArgumentCaptor<Function0<Unit>>
val decor = createOpenTaskDecoration(
@@ -409,6 +409,52 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest
}
@Test
+ fun testOnDecorMaximizedOrRestored_togglesTaskSize_maximizeFromMaximizedSize() {
+ val maxOrRestoreListenerCaptor = forClass(Function0::class.java)
+ as ArgumentCaptor<Function0<Unit>>
+ val decor = createOpenTaskDecoration(
+ windowingMode = WINDOWING_MODE_FREEFORM,
+ onMaxOrRestoreListenerCaptor = maxOrRestoreListenerCaptor
+ )
+ val movedMaximizedBounds = Rect(STABLE_BOUNDS)
+ movedMaximizedBounds.offset(10, 10)
+ decor.mTaskInfo.configuration.windowConfiguration.bounds.set(movedMaximizedBounds)
+
+ maxOrRestoreListenerCaptor.value.invoke()
+
+ verify(mockDesktopTasksController).toggleDesktopTaskSize(
+ decor.mTaskInfo,
+ ToggleTaskSizeInteraction(
+ ToggleTaskSizeInteraction.Direction.MAXIMIZE,
+ ToggleTaskSizeInteraction.Source.MAXIMIZE_MENU_TO_MAXIMIZE,
+ InputMethod.UNKNOWN_INPUT_METHOD
+ )
+ )
+ }
+
+ @Test
+ fun testOnDecorMaximizedOrRestored_togglesTaskSize_restore() {
+ val maxOrRestoreListenerCaptor = forClass(Function0::class.java)
+ as ArgumentCaptor<Function0<Unit>>
+ val decor = createOpenTaskDecoration(
+ windowingMode = WINDOWING_MODE_FREEFORM,
+ onMaxOrRestoreListenerCaptor = maxOrRestoreListenerCaptor
+ )
+ decor.mTaskInfo.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS)
+
+ maxOrRestoreListenerCaptor.value.invoke()
+
+ verify(mockDesktopTasksController).toggleDesktopTaskSize(
+ decor.mTaskInfo,
+ ToggleTaskSizeInteraction(
+ ToggleTaskSizeInteraction.Direction.RESTORE,
+ ToggleTaskSizeInteraction.Source.MAXIMIZE_MENU_TO_RESTORE,
+ InputMethod.UNKNOWN_INPUT_METHOD
+ )
+ )
+ }
+
+ @Test
fun testOnDecorMaximizedOrRestored_closesMenus() {
val maxOrRestoreListenerCaptor = forClass(Function0::class.java)
as ArgumentCaptor<Function0<Unit>>
@@ -591,7 +637,8 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest
verify(mockDesktopTasksController).moveTaskToDesktop(
eq(decor.mTaskInfo.taskId),
any(),
- eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON)
+ eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON),
+ anyOrNull()
)
}
@@ -824,7 +871,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest
)
verify(mockDesktopTasksController, times(1))
- .moveTaskToDesktop(any(), any(), any())
+ .moveTaskToDesktop(any(), any(), any(), anyOrNull())
}
@Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
index 6be234ef5ca6..7a37c5eec604 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
@@ -149,7 +149,6 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() {
protected val mockCaptionHandleRepository = mock<WindowDecorCaptionHandleRepository>()
protected val mockDesktopRepository: DesktopRepository = mock<DesktopRepository>()
protected val motionEvent = mock<MotionEvent>()
- val displayController = mock<DisplayController>()
val displayLayout = mock<DisplayLayout>()
protected lateinit var spyContext: TestableContext
private lateinit var desktopModeEventLogger: DesktopModeEventLogger
@@ -255,7 +254,7 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() {
argumentCaptor<DesktopModeKeyguardChangeListener>()
verify(mockShellController).addKeyguardChangeListener(keyguardChangedCaptor.capture())
desktopModeOnKeyguardChangedListener = keyguardChangedCaptor.firstValue
- whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout)
+ whenever(mockDisplayController.getDisplayLayout(anyInt())).thenReturn(displayLayout)
whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
(i.arguments.first() as Rect).set(STABLE_BOUNDS)
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
index 5d5d1f220ae0..db7b1f22768f 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
@@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.app.assist.AssistContent.EXTRA_SESSION_TRANSFER_WEB_URI;
import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
import static android.view.InsetsSource.FLAG_FORCE_CONSUMING;
import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR;
@@ -157,6 +158,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
private static final Uri TEST_URI1 = Uri.parse("https://www.google.com/");
private static final Uri TEST_URI2 = Uri.parse("https://docs.google.com/");
private static final Uri TEST_URI3 = Uri.parse("https://slides.google.com/");
+ private static final Uri TEST_URI4 = Uri.parse("https://calendar.google.com/");
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
@@ -1322,11 +1324,11 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
- public void capturedLink_handleMenuBrowserLinkSetToCapturedLinkIfValid() {
+ public void capturedLink_CapturedLinkUsedIfValidAndWebUriUnavailable() {
final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
final DesktopModeWindowDecoration decor = createWindowDecoration(
- taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */,
- TEST_URI3 /* generic link */);
+ taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
+ null /* session transfer uri */, TEST_URI4 /* generic link */);
// Verify handle menu's browser link set as captured link
createHandleMenu(decor);
@@ -1339,7 +1341,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
final DesktopModeWindowDecoration decor = createWindowDecoration(
taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
- null /* generic link */);
+ null /* session transfer uri */, null /* generic link */);
final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor =
ArgumentCaptor.forClass(Function1.class);
@@ -1373,7 +1375,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
final DesktopModeWindowDecoration decor = createWindowDecoration(
taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
- null /* generic link */);
+ null /* session transfer uri */, null /* generic link */);
final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor =
ArgumentCaptor.forClass(Function1.class);
@@ -1406,7 +1408,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
final DesktopModeWindowDecoration decor = createWindowDecoration(
taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
- null /* generic link */);
+ null /* session transfer uri */, null /* generic link */);
final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor =
ArgumentCaptor.forClass(Function1.class);
createHandleMenu(decor);
@@ -1432,11 +1434,23 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
- public void webUriLink_webUriLinkUsedWhenCapturedLinkUnavailable() {
+ public void webUriLink_webUriLinkUsedWhenWhenAvailable() {
final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
final DesktopModeWindowDecoration decor = createWindowDecoration(
- taskInfo, null /* captured link */, TEST_URI2 /* web uri */,
- TEST_URI3 /* generic link */);
+ taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */,
+ TEST_URI3 /* session transfer uri */, TEST_URI4 /* generic link */);
+ // Verify handle menu's browser link set as web uri link when captured link is unavailable
+ createHandleMenu(decor);
+ verifyHandleMenuCreated(TEST_URI3);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
+ public void webUriLink_webUriLinkUsedWhenSessionTransferUriUnavailable() {
+ final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
+ final DesktopModeWindowDecoration decor = createWindowDecoration(
+ taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */,
+ null /* session transfer uri */, TEST_URI4 /* generic link */);
// Verify handle menu's browser link set as web uri link when captured link is unavailable
createHandleMenu(decor);
verifyHandleMenuCreated(TEST_URI2);
@@ -1448,12 +1462,12 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
final DesktopModeWindowDecoration decor = createWindowDecoration(
taskInfo, null /* captured link */, null /* web uri */,
- TEST_URI3 /* generic link */);
+ null /* session transfer uri */, TEST_URI4 /* generic link */);
// Verify handle menu's browser link set as generic link when captured link and web uri link
// are unavailable
createHandleMenu(decor);
- verifyHandleMenuCreated(TEST_URI3);
+ verifyHandleMenuCreated(TEST_URI4);
}
@Test
@@ -1637,7 +1651,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
- public void browserApp_webUriUsedForBrowserApp() {
+ public void browserApp_transferSessionUriUsedForBrowserAppWhenAvailable() {
// Make {@link AppToWebUtils#isBrowserApp} return true
ResolveInfo resolveInfo = new ResolveInfo();
resolveInfo.handleAllWebDataURI = true;
@@ -1648,7 +1662,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
final DesktopModeWindowDecoration decor = createWindowDecoration(
taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */,
- TEST_URI3 /* generic link */);
+ null /* transfer session uri */, TEST_URI4 /* generic link */);
// Verify web uri used for browser applications
createHandleMenu(decor);
@@ -1656,6 +1670,27 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
}
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
+ public void browserApp_webUriUsedForBrowserAppWhenTransferSessionUriUnavailable() {
+ // Make {@link AppToWebUtils#isBrowserApp} return true
+ ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.handleAllWebDataURI = true;
+ resolveInfo.activityInfo = createActivityInfo();
+ when(mMockPackageManager.queryIntentActivitiesAsUser(any(), anyInt(), anyInt()))
+ .thenReturn(List.of(resolveInfo));
+
+ final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
+ final DesktopModeWindowDecoration decor = createWindowDecoration(
+ taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */,
+ TEST_URI3 /* transfer session uri */, TEST_URI4 /* generic link */);
+
+ // Verify web uri used for browser applications
+ createHandleMenu(decor);
+ verifyHandleMenuCreated(TEST_URI3);
+ }
+
+
private void verifyHandleMenuCreated(@Nullable Uri uri) {
verify(mMockHandleMenuFactory).create(any(), any(), anyInt(), any(), any(),
any(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(),
@@ -1692,10 +1727,11 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
private DesktopModeWindowDecoration createWindowDecoration(
ActivityManager.RunningTaskInfo taskInfo, @Nullable Uri capturedLink,
- @Nullable Uri webUri, @Nullable Uri genericLink) {
+ @Nullable Uri webUri, @Nullable Uri sessionTransferUri, @Nullable Uri genericLink) {
taskInfo.capturedLink = capturedLink;
taskInfo.capturedLinkTimestamp = System.currentTimeMillis();
mAssistContent.setWebUri(webUri);
+ mAssistContent.getExtras().putObject(EXTRA_SESSION_TRANSFER_WEB_URI, sessionTransferUri);
final String genericLinkString = genericLink == null ? null : genericLink.toString();
doReturn(genericLinkString).when(mMockGenericLinksParser).getGenericLink(any());
// Relayout to set captured link
diff --git a/media/java/android/media/IMediaRoute2ProviderService.aidl b/media/java/android/media/IMediaRoute2ProviderService.aidl
index eee3d22c7252..714cacb8d326 100644
--- a/media/java/android/media/IMediaRoute2ProviderService.aidl
+++ b/media/java/android/media/IMediaRoute2ProviderService.aidl
@@ -33,6 +33,23 @@ oneway interface IMediaRoute2ProviderService {
void requestCreateSession(long requestId, String packageName, String routeId,
in @nullable Bundle sessionHints);
+ /**
+ * Requests the creation of a system media routing session.
+ *
+ * @param requestId The id of the request.
+ * @param uid The uid of the package whose media to route, or
+ * {@link android.os.Process#INVALID_UID} if routing should not be restricted to a specific
+ * uid.
+ * @param packageName The name of the package whose media to route.
+ * @param routeId The id of the route to be initially selected.
+ * @param sessionHints An optional bundle with parameters.
+ */
+ void requestCreateSystemMediaSession(
+ long requestId,
+ int uid,
+ String packageName,
+ String routeId,
+ in @nullable Bundle sessionHints);
void selectRoute(long requestId, String sessionId, String routeId);
void deselectRoute(long requestId, String sessionId, String routeId);
void transferToRoute(long requestId, String sessionId, String routeId);
diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java
index a3ad340f6ef4..037b97a61b3f 100644
--- a/media/java/android/media/MediaRoute2Info.java
+++ b/media/java/android/media/MediaRoute2Info.java
@@ -917,6 +917,17 @@ public final class MediaRoute2Info implements Parcelable {
}
/**
+ * Returns whether this route supports routing of the system media.
+ *
+ * @hide
+ */
+ public boolean supportsSystemMediaRouting() {
+ return (mRoutingTypeFlags
+ & (FLAG_ROUTING_TYPE_SYSTEM_VIDEO | FLAG_ROUTING_TYPE_SYSTEM_AUDIO))
+ != 0;
+ }
+
+ /**
* Returns true if the route info has all of the required field.
* A route is valid if and only if it is obtained from
* {@link com.android.server.media.MediaRouterService}.
diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java
index 547099f044b2..09f40e005b4c 100644
--- a/media/java/android/media/MediaRoute2ProviderService.java
+++ b/media/java/android/media/MediaRoute2ProviderService.java
@@ -18,14 +18,21 @@ package android.media;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+import static java.util.Objects.requireNonNull;
+
+import android.Manifest;
import android.annotation.CallSuper;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.app.Service;
import android.content.Intent;
+import android.media.audiopolicy.AudioMix;
+import android.media.audiopolicy.AudioMixingRule;
+import android.media.audiopolicy.AudioPolicy;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -36,6 +43,7 @@ import android.os.RemoteException;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
+import android.util.LongSparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.media.flags.Flags;
@@ -47,7 +55,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Deque;
import java.util.List;
-import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -83,8 +90,7 @@ public abstract class MediaRoute2ProviderService extends Service {
public static final String SERVICE_INTERFACE = "android.media.MediaRoute2ProviderService";
/**
- * {@link Intent} action that indicates that the declaring service supports routing of the
- * system media.
+ * A category that indicates that the declaring service supports routing of the system media.
*
* <p>Providers must include this action if they intend to publish routes that support the
* system media, as described by {@link MediaRoute2Info#getSupportedRoutingTypes()}.
@@ -94,7 +100,7 @@ public abstract class MediaRoute2ProviderService extends Service {
*/
// TODO: b/362507305 - Unhide once the implementation and CTS are in place.
@FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
- @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
+ @SdkConstant(SdkConstant.SdkConstantType.INTENT_CATEGORY)
public static final String SERVICE_INTERFACE_SYSTEM_MEDIA =
"android.media.MediaRoute2ProviderService.SYSTEM_MEDIA";
@@ -165,6 +171,16 @@ public abstract class MediaRoute2ProviderService extends Service {
@FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
public static final int REASON_UNIMPLEMENTED = 5;
+ /**
+ * The request has failed because the provider has failed to route system media.
+ *
+ * @see #notifyRequestFailed
+ * @hide
+ */
+ // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
+ @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+ public static final int REASON_FAILED_TO_REROUTE_SYSTEM_MEDIA = 6;
+
/** @hide */
@IntDef(
prefix = "REASON_",
@@ -174,7 +190,8 @@ public abstract class MediaRoute2ProviderService extends Service {
REASON_NETWORK_ERROR,
REASON_ROUTE_NOT_AVAILABLE,
REASON_INVALID_COMMAND,
- REASON_UNIMPLEMENTED
+ REASON_UNIMPLEMENTED,
+ REASON_FAILED_TO_REROUTE_SYSTEM_MEDIA
})
@Retention(RetentionPolicy.SOURCE)
public @interface Reason {}
@@ -187,15 +204,28 @@ public abstract class MediaRoute2ProviderService extends Service {
private final AtomicBoolean mStatePublishScheduled = new AtomicBoolean(false);
private final AtomicBoolean mSessionUpdateScheduled = new AtomicBoolean(false);
private MediaRoute2ProviderServiceStub mStub;
+ /** Populated by system_server in {@link #setCallback}. Monotonically non-null. */
private IMediaRoute2ProviderServiceCallback mRemoteCallback;
private volatile MediaRoute2ProviderInfo mProviderInfo;
@GuardedBy("mRequestIdsLock")
private final Deque<Long> mRequestIds = new ArrayDeque<>(MAX_REQUEST_IDS_SIZE);
+ /**
+ * Maps system media session creation request ids to a package uid whose media to route. The
+ * value may be {@link Process#INVALID_UID} for routing sessions that don't affect a specific
+ * package (for example, if they affect the entire system).
+ */
+ @GuardedBy("mRequestIdsLock")
+ private final LongSparseArray<Integer> mSystemMediaSessionCreationRequests =
+ new LongSparseArray<>();
+
@GuardedBy("mSessionLock")
private final ArrayMap<String, RoutingSessionInfo> mSessionInfos = new ArrayMap<>();
+ @GuardedBy("mSessionLock")
+ private final ArrayMap<String, MediaStreams> mOngoingMediaStreams = new ArrayMap<>();
+
public MediaRoute2ProviderService() {
mHandler = new Handler(Looper.getMainLooper());
}
@@ -282,7 +312,7 @@ public abstract class MediaRoute2ProviderService extends Service {
*/
public final void notifySessionCreated(long requestId,
@NonNull RoutingSessionInfo sessionInfo) {
- Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
+ requireNonNull(sessionInfo, "sessionInfo must not be null");
if (DEBUG) {
Log.d(TAG, "notifySessionCreated: Creating a session. requestId=" + requestId
@@ -326,17 +356,129 @@ public abstract class MediaRoute2ProviderService extends Service {
* @param formats the {@link MediaStreamsFormats} that describes the format for the {@link
* MediaStreams} to return.
* @return a {@link MediaStreams} instance that holds the media streams to route as part of the
- * newly created routing session.
+ * newly created routing session. May be null if system media capture failed, in which case
+ * you can ignore the return value, as you will receive a call to {@link #onReleaseSession}
+ * where you can clean up this session
* @hide
*/
// TODO: b/362507305 - Unhide once the implementation and CTS are in place.
@FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
- @NonNull
+ @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
+ @Nullable
public final MediaStreams notifySystemMediaSessionCreated(
long requestId,
@NonNull RoutingSessionInfo sessionInfo,
@NonNull MediaStreamsFormats formats) {
- throw new UnsupportedOperationException();
+ requireNonNull(sessionInfo, "sessionInfo must not be null");
+ requireNonNull(formats, "formats must not be null");
+ if (DEBUG) {
+ Log.d(
+ TAG,
+ "notifySystemMediaSessionCreated: Creating a session. requestId="
+ + requestId
+ + ", sessionInfo="
+ + sessionInfo);
+ }
+
+ Integer uid;
+ synchronized (mRequestIdsLock) {
+ uid = mSystemMediaSessionCreationRequests.get(requestId);
+ mSystemMediaSessionCreationRequests.remove(requestId);
+ }
+
+ if (uid == null) {
+ throw new IllegalStateException(
+ "Unexpected system routing session created (request id="
+ + requestId
+ + "):"
+ + sessionInfo);
+ }
+
+ if (mRemoteCallback == null) {
+ throw new IllegalStateException("Unexpected: remote callback is null.");
+ }
+
+ int routingTypes = 0;
+ var providerInfo = mProviderInfo;
+ for (String selectedRouteId : sessionInfo.getSelectedRoutes()) {
+ MediaRoute2Info route = providerInfo.mRoutes.get(selectedRouteId);
+ if (route == null) {
+ throw new IllegalArgumentException(
+ "Invalid selected route with id: " + selectedRouteId);
+ }
+ routingTypes |= route.getSupportedRoutingTypes();
+ }
+
+ if ((routingTypes & MediaRoute2Info.FLAG_ROUTING_TYPE_SYSTEM_AUDIO) == 0) {
+ // TODO: b/380431086 - Populate video stream once we add support for video.
+ throw new IllegalArgumentException(
+ "Selected routes for system media don't support any system media routing"
+ + " types.");
+ }
+
+ AudioFormat audioFormat = formats.mAudioFormat;
+ var mediaStreamsBuilder = new MediaStreams.Builder();
+ if (audioFormat != null) {
+ populateAudioStream(audioFormat, uid, mediaStreamsBuilder);
+ }
+ // TODO: b/380431086 - Populate video stream once we add support for video.
+
+ MediaStreams streams = mediaStreamsBuilder.build();
+ var audioRecord = streams.mAudioRecord;
+ if (audioRecord == null) {
+ Log.e(
+ TAG,
+ "Audio record is not populated. Returning an empty stream and scheduling the"
+ + " session release for: "
+ + sessionInfo);
+ mHandler.post(() -> onReleaseSession(REQUEST_ID_NONE, sessionInfo.getOriginalId()));
+ notifyRequestFailed(requestId, REASON_FAILED_TO_REROUTE_SYSTEM_MEDIA);
+ return null;
+ }
+
+ synchronized (mSessionLock) {
+ try {
+ mRemoteCallback.notifySessionCreated(requestId, sessionInfo);
+ } catch (RemoteException ex) {
+ ex.rethrowFromSystemServer();
+ }
+ mOngoingMediaStreams.put(sessionInfo.getOriginalId(), streams);
+ return streams;
+ }
+ }
+
+ @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
+ private void populateAudioStream(
+ AudioFormat audioFormat, int uid, MediaStreams.Builder builder) {
+ var audioAttributes =
+ new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build();
+ var audioMixingRuleBuilder =
+ new AudioMixingRule.Builder()
+ .addRule(audioAttributes, AudioMixingRule.RULE_MATCH_ATTRIBUTE_USAGE);
+ if (uid != Process.INVALID_UID) {
+ audioMixingRuleBuilder.addMixRule(AudioMixingRule.RULE_MATCH_UID, uid);
+ }
+
+ AudioMix mix =
+ new AudioMix.Builder(audioMixingRuleBuilder.build())
+ .setFormat(audioFormat)
+ .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK)
+ .build();
+ AudioPolicy audioPolicy =
+ new AudioPolicy.Builder(this).setLooper(mHandler.getLooper()).addMix(mix).build();
+ var audioManager = getSystemService(AudioManager.class);
+ if (audioManager == null) {
+ Log.e(TAG, "Couldn't fetch the audio manager.");
+ return;
+ }
+ audioManager.registerAudioPolicy(audioPolicy);
+ var audioRecord = audioPolicy.createAudioRecordSink(mix);
+ if (audioRecord == null) {
+ Log.e(TAG, "Audio record creation failed.");
+ audioManager.unregisterAudioPolicy(audioPolicy);
+ return;
+ }
+ builder.setAudioStream(audioPolicy, audioRecord);
}
/**
@@ -344,7 +486,7 @@ public abstract class MediaRoute2ProviderService extends Service {
* {@link RoutingSessionInfo#getSelectedRoutes() selected routes} are changed.
*/
public final void notifySessionUpdated(@NonNull RoutingSessionInfo sessionInfo) {
- Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
+ requireNonNull(sessionInfo, "sessionInfo must not be null");
if (DEBUG) {
Log.d(TAG, "notifySessionUpdated: Updating session id=" + sessionInfo);
@@ -379,6 +521,7 @@ public abstract class MediaRoute2ProviderService extends Service {
RoutingSessionInfo sessionInfo;
synchronized (mSessionLock) {
sessionInfo = mSessionInfos.remove(sessionId);
+ maybeReleaseMediaStreams(sessionId);
if (sessionInfo == null) {
Log.w(TAG, "notifySessionReleased: Ignoring unknown session info.");
@@ -396,6 +539,34 @@ public abstract class MediaRoute2ProviderService extends Service {
}
}
+ /** Releases any system media routing resources associated with the given {@code sessionId}. */
+ private void maybeReleaseMediaStreams(String sessionId) {
+ if (!Flags.enableMirroringInMediaRouter2()) {
+ return;
+ }
+ synchronized (mSessionLock) {
+ var streams = mOngoingMediaStreams.remove(sessionId);
+ if (streams != null) {
+ releaseAudioStream(streams.mAudioPolicy, streams.mAudioRecord);
+ // TODO: b/380431086: Release the video stream once implemented.
+ }
+ }
+ }
+
+ // We cannot reach the code that requires MODIFY_AUDIO_ROUTING without holding it.
+ @SuppressWarnings("MissingPermission")
+ private void releaseAudioStream(AudioPolicy audioPolicy, AudioRecord audioRecord) {
+ if (audioPolicy == null) {
+ return;
+ }
+ var audioManager = getSystemService(AudioManager.class);
+ if (audioManager == null) {
+ return;
+ }
+ audioRecord.stop();
+ audioManager.unregisterAudioPolicy(audioPolicy);
+ }
+
/**
* Notifies to the client that the request has failed.
*
@@ -569,7 +740,7 @@ public abstract class MediaRoute2ProviderService extends Service {
* Updates routes of the provider and notifies the system media router service.
*/
public final void notifyRoutes(@NonNull Collection<MediaRoute2Info> routes) {
- Objects.requireNonNull(routes, "routes must not be null");
+ requireNonNull(routes, "routes must not be null");
List<MediaRoute2Info> sanitizedRoutes = new ArrayList<>(routes.size());
for (MediaRoute2Info route : routes) {
@@ -763,6 +934,32 @@ public abstract class MediaRoute2ProviderService extends Service {
}
@Override
+ public void requestCreateSystemMediaSession(
+ long requestId,
+ int uid,
+ String packageName,
+ String routeId,
+ @Nullable Bundle sessionHints) {
+ if (!checkCallerIsSystem()) {
+ return;
+ }
+ if (!checkRouteIdIsValid(routeId, "requestCreateSession")) {
+ return;
+ }
+ synchronized (mRequestIdsLock) {
+ mSystemMediaSessionCreationRequests.put(requestId, uid);
+ }
+ mHandler.sendMessage(
+ obtainMessage(
+ MediaRoute2ProviderService::onCreateSystemRoutingSession,
+ MediaRoute2ProviderService.this,
+ requestId,
+ packageName,
+ routeId,
+ sessionHints));
+ }
+
+ @Override
public void selectRoute(long requestId, String sessionId, String routeId) {
if (!checkCallerIsSystem()) {
return;
@@ -825,6 +1022,10 @@ public abstract class MediaRoute2ProviderService extends Service {
if (!checkSessionIdIsValid(sessionId, "releaseSession")) {
return;
}
+ // We proactively release the system media routing once the system requests it, to
+ // ensure it happens immediately.
+ maybeReleaseMediaStreams(sessionId);
+
addRequestId(requestId);
mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onReleaseSession,
MediaRoute2ProviderService.this, requestId, sessionId));
@@ -843,12 +1044,14 @@ public abstract class MediaRoute2ProviderService extends Service {
@FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
public static final class MediaStreams {
- private final AudioRecord mAudioRecord;
+ @Nullable private final AudioPolicy mAudioPolicy;
+ @Nullable private final AudioRecord mAudioRecord;
// TODO: b/380431086: Add the video equivalent.
- private MediaStreams(AudioRecord mAudioRecord) {
- this.mAudioRecord = mAudioRecord;
+ private MediaStreams(Builder builder) {
+ this.mAudioPolicy = builder.mAudioPolicy;
+ this.mAudioRecord = builder.mAudioRecord;
}
/**
@@ -859,8 +1062,33 @@ public abstract class MediaRoute2ProviderService extends Service {
public AudioRecord getAudioRecord() {
return mAudioRecord;
}
+
+ /**
+ * Builder for {@link MediaStreams}.
+ *
+ * @hide
+ */
+ public static final class Builder {
+
+ @Nullable private AudioPolicy mAudioPolicy;
+ @Nullable private AudioRecord mAudioRecord;
+
+ /** Populates system media audio-related structures. */
+ public Builder setAudioStream(
+ @NonNull AudioPolicy audioPolicy, @NonNull AudioRecord audioRecord) {
+ mAudioPolicy = requireNonNull(audioPolicy);
+ mAudioRecord = requireNonNull(audioRecord);
+ return this;
+ }
+
+ /** Builds a {@link MediaStreams} instance. */
+ public MediaStreams build() {
+ return new MediaStreams(this);
+ }
+ }
}
+
/**
* Holds the formats to encode media data to be read from {@link MediaStreams}.
*
@@ -911,7 +1139,7 @@ public abstract class MediaRoute2ProviderService extends Service {
*/
@NonNull
public Builder setAudioFormat(@NonNull AudioFormat audioFormat) {
- this.mAudioFormat = Objects.requireNonNull(audioFormat);
+ this.mAudioFormat = requireNonNull(audioFormat);
return this;
}
diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp
index 1945d90568b3..9257901bcd1f 100644
--- a/native/android/performance_hint.cpp
+++ b/native/android/performance_hint.cpp
@@ -22,6 +22,7 @@
#include <aidl/android/hardware/power/SessionHint.h>
#include <aidl/android/hardware/power/SessionMode.h>
#include <aidl/android/hardware/power/SessionTag.h>
+#include <aidl/android/hardware/power/SupportInfo.h>
#include <aidl/android/hardware/power/WorkDuration.h>
#include <aidl/android/hardware/power/WorkDurationFixedV1.h>
#include <aidl/android/os/IHintManager.h>
@@ -148,10 +149,36 @@ private:
std::future<bool> mChannelCreationFinished;
};
+class SupportInfoWrapper {
+public:
+ SupportInfoWrapper(hal::SupportInfo& info);
+ bool isSessionModeSupported(hal::SessionMode mode);
+ bool isSessionHintSupported(hal::SessionHint hint);
+
+private:
+ template <class T>
+ bool getEnumSupportFromBitfield(T& enumValue, int64_t& supportBitfield) {
+ // extract the bit corresponding to the enum by shifting the bitfield
+ // over that much and cutting off any extra values
+ return (supportBitfield >> static_cast<int>(enumValue)) % 2;
+ }
+ hal::SupportInfo mSupportInfo;
+};
+
+class HintManagerClient : public IHintManager::BnHintManagerClient {
+public:
+ // Currently a no-op that exists for FMQ init to call in the future
+ ndk::ScopedAStatus receiveChannelConfig(const hal::ChannelConfig&) {
+ return ndk::ScopedAStatus::ok();
+ }
+};
+
struct APerformanceHintManager {
public:
static APerformanceHintManager* getInstance();
- APerformanceHintManager(std::shared_ptr<IHintManager>& service, int64_t preferredRateNanos);
+ APerformanceHintManager(std::shared_ptr<IHintManager>& service,
+ IHintManager::HintManagerClientData&& clientData,
+ std::shared_ptr<HintManagerClient> callbackClient);
APerformanceHintManager() = delete;
~APerformanceHintManager();
@@ -169,29 +196,21 @@ public:
FMQWrapper& getFMQWrapper();
bool canSendLoadHints(std::vector<hal::SessionHint>& hints, int64_t now) REQUIRES(sHintMutex);
void initJava(JNIEnv* _Nonnull env);
- ndk::ScopedAIBinder_Weak x;
template <class T>
static void layersFromNativeSurfaces(ANativeWindow** windows, int numWindows,
ASurfaceControl** controls, int numSurfaceControls,
std::vector<T>& out);
+ ndk::SpAIBinder& getToken();
+ SupportInfoWrapper& getSupportInfo();
private:
- // Necessary to create an empty binder object
- static void* tokenStubOnCreate(void*) {
- return nullptr;
- }
- static void tokenStubOnDestroy(void*) {}
- static binder_status_t tokenStubOnTransact(AIBinder*, transaction_code_t, const AParcel*,
- AParcel*) {
- return STATUS_OK;
- }
-
static APerformanceHintManager* create(std::shared_ptr<IHintManager> iHintManager);
std::shared_ptr<IHintManager> mHintManager;
+ std::shared_ptr<HintManagerClient> mCallbackClient;
+ IHintManager::HintManagerClientData mClientData;
+ SupportInfoWrapper mSupportInfoWrapper;
ndk::SpAIBinder mToken;
- const int64_t mPreferredRateNanos;
- std::optional<int32_t> mMaxGraphicsPipelineThreadsCount;
FMQWrapper mFMQWrapper;
double mHintBudget = kMaxLoadHintsPerInterval;
int64_t mLastBudgetReplenish = 0;
@@ -273,14 +292,27 @@ static FMQWrapper& getFMQ() {
return APerformanceHintManager::getInstance()->getFMQWrapper();
}
+// ===================================== SupportInfoWrapper implementation
+
+SupportInfoWrapper::SupportInfoWrapper(hal::SupportInfo& info) : mSupportInfo(info) {}
+
+bool SupportInfoWrapper::isSessionHintSupported(hal::SessionHint hint) {
+ return getEnumSupportFromBitfield(hint, mSupportInfo.sessionHints);
+}
+
+bool SupportInfoWrapper::isSessionModeSupported(hal::SessionMode mode) {
+ return getEnumSupportFromBitfield(mode, mSupportInfo.sessionModes);
+}
+
// ===================================== APerformanceHintManager implementation
APerformanceHintManager::APerformanceHintManager(std::shared_ptr<IHintManager>& manager,
- int64_t preferredRateNanos)
- : mHintManager(std::move(manager)), mPreferredRateNanos(preferredRateNanos) {
- static AIBinder_Class* tokenBinderClass =
- AIBinder_Class_define("phm_token", tokenStubOnCreate, tokenStubOnDestroy,
- tokenStubOnTransact);
- mToken = ndk::SpAIBinder(AIBinder_new(tokenBinderClass, nullptr));
+ IHintManager::HintManagerClientData&& clientData,
+ std::shared_ptr<HintManagerClient> callbackClient)
+ : mHintManager(std::move(manager)),
+ mCallbackClient(callbackClient),
+ mClientData(clientData),
+ mSupportInfoWrapper(clientData.supportInfo),
+ mToken(callbackClient->asBinder()) {
if (mFMQWrapper.isSupported()) {
mFMQWrapper.setToken(mToken);
mFMQWrapper.startChannel(mHintManager.get());
@@ -315,16 +347,17 @@ APerformanceHintManager* APerformanceHintManager::create(std::shared_ptr<IHintMa
ALOGE("%s: PerformanceHint service is not ready ", __FUNCTION__);
return nullptr;
}
- int64_t preferredRateNanos = -1L;
- ndk::ScopedAStatus ret = manager->getHintSessionPreferredRate(&preferredRateNanos);
+ std::shared_ptr<HintManagerClient> client = ndk::SharedRefBase::make<HintManagerClient>();
+ IHintManager::HintManagerClientData clientData;
+ ndk::ScopedAStatus ret = manager->registerClient(client, &clientData);
if (!ret.isOk()) {
- ALOGE("%s: PerformanceHint cannot get preferred rate. %s", __FUNCTION__, ret.getMessage());
+ ALOGE("%s: PerformanceHint is not supported. %s", __FUNCTION__, ret.getMessage());
return nullptr;
}
- if (preferredRateNanos <= 0) {
- preferredRateNanos = -1L;
+ if (clientData.preferredRateNanos <= 0) {
+ clientData.preferredRateNanos = -1L;
}
- return new APerformanceHintManager(manager, preferredRateNanos);
+ return new APerformanceHintManager(manager, std::move(clientData), client);
}
bool APerformanceHintManager::canSendLoadHints(std::vector<hal::SessionHint>& hints, int64_t now) {
@@ -389,7 +422,9 @@ APerformanceHintSession* APerformanceHintManager::createSessionUsingConfig(
ALOGE("%s: PerformanceHint cannot create session. %s", __FUNCTION__, ret.getMessage());
return nullptr;
}
- auto out = new APerformanceHintSession(mHintManager, std::move(session), mPreferredRateNanos,
+
+ auto out = new APerformanceHintSession(mHintManager, std::move(session),
+ mClientData.preferredRateNanos,
sessionCreationConfig->targetWorkDurationNanos, isJava,
sessionConfig.id == -1
? std::nullopt
@@ -416,24 +451,11 @@ APerformanceHintSession* APerformanceHintManager::getSessionFromJava(JNIEnv* env
}
int64_t APerformanceHintManager::getPreferredRateNanos() const {
- return mPreferredRateNanos;
+ return mClientData.preferredRateNanos;
}
int32_t APerformanceHintManager::getMaxGraphicsPipelineThreadsCount() {
- if (!mMaxGraphicsPipelineThreadsCount.has_value()) {
- int32_t threadsCount = -1;
- ndk::ScopedAStatus ret = mHintManager->getMaxGraphicsPipelineThreadsCount(&threadsCount);
- if (!ret.isOk()) {
- ALOGE("%s: PerformanceHint cannot get max graphics pipeline threads count. %s",
- __FUNCTION__, ret.getMessage());
- return -1;
- }
- if (threadsCount <= 0) {
- threadsCount = -1;
- }
- mMaxGraphicsPipelineThreadsCount.emplace(threadsCount);
- }
- return mMaxGraphicsPipelineThreadsCount.value();
+ return mClientData.maxGraphicsPipelineThreads;
}
FMQWrapper& APerformanceHintManager::getFMQWrapper() {
@@ -450,6 +472,14 @@ void APerformanceHintManager::initJava(JNIEnv* _Nonnull env) {
mJavaInitialized = true;
}
+ndk::SpAIBinder& APerformanceHintManager::getToken() {
+ return mToken;
+}
+
+SupportInfoWrapper& APerformanceHintManager::getSupportInfo() {
+ return mSupportInfoWrapper;
+}
+
// ===================================== APerformanceHintSession implementation
constexpr int kNumEnums = enum_size<hal::SessionHint>();
@@ -1170,7 +1200,7 @@ int APerformanceHint_notifyWorkloadSpike(APerformanceHintSession* session, bool
if (!useNewLoadHintBehavior()) {
return ENOTSUP;
}
- return session->notifyWorkloadReset(cpu, gpu, debugName);
+ return session->notifyWorkloadSpike(cpu, gpu, debugName);
}
int APerformanceHint_setNativeSurfaces(APerformanceHintSession* session,
diff --git a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
index c166e738ffb2..e3c10f63abb4 100644
--- a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
+++ b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
@@ -56,9 +56,6 @@ public:
const SessionCreationConfig& creationConfig, hal::SessionConfig* config,
std::shared_ptr<IHintSession>* _aidl_return),
(override));
- MOCK_METHOD(ScopedAStatus, getHintSessionPreferredRate, (int64_t * _aidl_return), (override));
- MOCK_METHOD(ScopedAStatus, getMaxGraphicsPipelineThreadsCount, (int32_t* _aidl_return),
- (override));
MOCK_METHOD(ScopedAStatus, setHintSessionThreads,
(const std::shared_ptr<IHintSession>& hintSession,
const ::std::vector<int32_t>& tids),
@@ -84,6 +81,11 @@ public:
MOCK_METHOD(ScopedAStatus, getGpuHeadroomMinIntervalMillis, (int64_t* _aidl_return),
(override));
MOCK_METHOD(ScopedAStatus, passSessionManagerBinder, (const SpAIBinder& sessionManager));
+ MOCK_METHOD(ScopedAStatus, registerClient,
+ (const std::shared_ptr<::aidl::android::os::IHintManager::IHintManagerClient>&
+ clientDataIn,
+ ::aidl::android::os::IHintManager::HintManagerClientData* _aidl_return),
+ (override));
MOCK_METHOD(SpAIBinder, asBinder, (), (override));
MOCK_METHOD(bool, isRemote, (), (override));
};
@@ -125,10 +127,9 @@ public:
APerformanceHintManager* createManager() {
APerformanceHint_setUseFMQForTesting(mUsingFMQ);
- ON_CALL(*mMockIHintManager, getHintSessionPreferredRate(_))
- .WillByDefault(DoAll(SetArgPointee<0>(123L), [] { return ScopedAStatus::ok(); }));
- ON_CALL(*mMockIHintManager, getMaxGraphicsPipelineThreadsCount(_))
- .WillByDefault(DoAll(SetArgPointee<0>(5), [] { return ScopedAStatus::ok(); }));
+ ON_CALL(*mMockIHintManager, registerClient(_, _))
+ .WillByDefault(
+ DoAll(SetArgPointee<1>(mClientData), [] { return ScopedAStatus::ok(); }));
return APerformanceHint_getManager();
}
@@ -238,6 +239,20 @@ public:
int kMockQueueSize = 20;
bool mUsingFMQ = false;
+ IHintManager::HintManagerClientData mClientData{
+ .powerHalVersion = 6,
+ .maxGraphicsPipelineThreads = 5,
+ .preferredRateNanos = 123L,
+ .supportInfo{
+ .usesSessions = true,
+ .boosts = 0,
+ .modes = 0,
+ .sessionHints = -1,
+ .sessionModes = -1,
+ .sessionTags = -1,
+ },
+ };
+
int32_t mMaxLoadHintsPerInterval;
int64_t mLoadHintInterval;
@@ -256,12 +271,6 @@ bool equalsWithoutTimestamp(hal::WorkDuration lhs, hal::WorkDuration rhs) {
lhs.gpuDurationNanos == rhs.gpuDurationNanos && lhs.durationNanos == rhs.durationNanos;
}
-TEST_F(PerformanceHintTest, TestGetPreferredUpdateRateNanos) {
- APerformanceHintManager* manager = createManager();
- int64_t preferredUpdateRateNanos = APerformanceHint_getPreferredUpdateRateNanos(manager);
- EXPECT_EQ(123L, preferredUpdateRateNanos);
-}
-
TEST_F(PerformanceHintTest, TestSession) {
APerformanceHintManager* manager = createManager();
APerformanceHintSession* session = createSession(manager);
diff --git a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml
index 781373dfbd0b..327f42209cdb 100644
--- a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml
+++ b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_middle.xml
@@ -19,6 +19,6 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
xmlns:tools="http://schemas.android.com/tools" tools:ignore="NewApi">
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer" />
</shape>
</inset> \ No newline at end of file
diff --git a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml
index f28c354b898d..992fe3341f26 100644
--- a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml
+++ b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml
@@ -21,6 +21,6 @@
<shape android:shape="rectangle">
<corners android:topLeftRadius="4dp" android:topRightRadius="4dp"
android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer" />
</shape>
</inset> \ No newline at end of file
diff --git a/packages/CredentialManager/res/drawable/more_options_list_item.xml b/packages/CredentialManager/res/drawable/more_options_list_item.xml
index 3f9d8157bfd2..991b3ff3c440 100644
--- a/packages/CredentialManager/res/drawable/more_options_list_item.xml
+++ b/packages/CredentialManager/res/drawable/more_options_list_item.xml
@@ -24,7 +24,7 @@
<shape>
<corners android:topLeftRadius="0dp" android:topRightRadius="0dp"
android:bottomLeftRadius="4dp" android:bottomRightRadius="4dp"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer"/>
- <stroke android:color="?androidprv:attr/materialColorOutlineVariant" android:width="1dp"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer"/>
+ <stroke android:color="@androidprv:color/materialColorOutlineVariant" android:width="1dp"/>
</shape>
</inset> \ No newline at end of file
diff --git a/packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml b/packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml
index 914987ac4650..6f04bd99877e 100644
--- a/packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml
+++ b/packages/CredentialManager/res/layout/credman_dropdown_bottom_sheet.xml
@@ -35,7 +35,7 @@
android:layout_gravity="center"
android:paddingStart="@dimen/autofill_view_left_padding"
android:src="@drawable/more_horiz_24px"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:contentDescription="@string/more_options_content_description"
android:background="@null"/>
@@ -53,7 +53,7 @@
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
style="@style/autofill.TextTitle"/>
</LinearLayout>
diff --git a/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml b/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml
index 3fc61545a713..d00a2295e43a 100644
--- a/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml
+++ b/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml
@@ -35,7 +35,7 @@
android:layout_gravity="center"
android:layout_alignParentStart="true"
android:paddingStart="@dimen/autofill_view_left_padding"
- app:tint="?androidprv:attr/materialColorOnSurface"
+ app:tint="@androidprv:color/materialColorOnSurface"
android:background="@null"/>
<LinearLayout
@@ -53,7 +53,7 @@
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textDirection="locale"
style="@style/autofill.TextTitle"/>
@@ -61,7 +61,7 @@
android:id="@android:id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textDirection="locale"
style="@style/autofill.TextSubtitle"/>
diff --git a/packages/CredentialManager/res/values/colors.xml b/packages/CredentialManager/res/values/colors.xml
index 9d31b350b4a0..8d37d47cc9fe 100644
--- a/packages/CredentialManager/res/values/colors.xml
+++ b/packages/CredentialManager/res/values/colors.xml
@@ -19,8 +19,8 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<!-- These colors are used for Remote Views. -->
- <color name="onSurface">?androidprv:attr/materialColorOnSurface</color>
- <color name="onSurfaceVariant">?androidprv:attr/materialColorOnSurfaceVariant</color>
- <color name="surfaceDim">?androidprv:attr/materialColorSurfaceDim</color>
- <color name="surfaceContainer">?androidprv:attr/materialColorSurfaceContainer</color>
+ <color name="onSurface">@androidprv:color/materialColorOnSurface</color>
+ <color name="onSurfaceVariant">@androidprv:color/materialColorOnSurfaceVariant</color>
+ <color name="surfaceDim">@androidprv:color/materialColorSurfaceDim</color>
+ <color name="surfaceContainer">@androidprv:color/materialColorSurfaceContainer</color>
</resources> \ No newline at end of file
diff --git a/packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java b/packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
index 607ec1c71094..9ae0f03b7f60 100644
--- a/packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
+++ b/packages/NeuralNetworks/service/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
@@ -16,8 +16,6 @@
package com.android.server.ondeviceintelligence;
-import static android.app.ondeviceintelligence.flags.Flags.enableOnDeviceIntelligenceModule;
-
import static android.app.ondeviceintelligence.OnDeviceIntelligenceManager.ON_DEVICE_INTELLIGENCE_IDLE_TIMEOUT_MS;
import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.DEVICE_CONFIG_UPDATE_BUNDLE_KEY;
import static android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService.MODEL_LOADED_BROADCAST_INTENT;
@@ -180,10 +178,8 @@ public class OnDeviceIntelligenceManagerService extends SystemService {
publishBinderService(
Context.ON_DEVICE_INTELLIGENCE_SERVICE, getOnDeviceIntelligenceManagerService(),
/* allowIsolated = */ true);
- if (enableOnDeviceIntelligenceModule()) {
- LocalManagerRegistry.addManager(OnDeviceIntelligenceManagerLocal.class,
+ LocalManagerRegistry.addManager(OnDeviceIntelligenceManagerLocal.class,
this::getRemoteInferenceServiceUid);
- }
}
@Override
@@ -198,20 +194,6 @@ public class OnDeviceIntelligenceManagerService extends SystemService {
}
}
- @Override
- public void onUserUnlocked(@NonNull TargetUser user) {
- Slog.d(TAG, "onUserUnlocked: " + user.getUserHandle());
- //connect to remote services(if available) during boot.
- if (user.getUserHandle().equals(UserHandle.SYSTEM)) {
- try {
- ensureRemoteInferenceServiceInitialized(/* throwServiceIfInvalid */ false);
- ensureRemoteIntelligenceServiceInitialized(/* throwServiceIfInvalid */ false);
- } catch (Exception e) {
- Slog.w(TAG, "Couldn't pre-start remote ondeviceintelligence services.", e);
- }
- }
- }
-
private void onDeviceConfigChange(@NonNull Set<String> keys) {
if (keys.contains(KEY_SERVICE_ENABLED)) {
mIsServiceEnabled = isServiceEnabled();
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml
index 8d6f0da4262f..fdc59754df95 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml
@@ -20,7 +20,7 @@
xmlns:tools="http://schemas.android.com/tools"
tools:targetApi="28"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" />
<corners
android:topLeftRadius="?android:attr/dialogCornerRadius"
android:topRightRadius="0dp"
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml
index 307277264ff6..405c45272792 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml
@@ -20,7 +20,7 @@
xmlns:tools="http://schemas.android.com/tools"
tools:targetApi="28"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" />
<corners
android:topLeftRadius="0dp"
android:topRightRadius="?android:attr/dialogCornerRadius"
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml
index f1790f9ba351..187e612d11c4 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml
@@ -20,7 +20,7 @@
xmlns:tools="http://schemas.android.com/tools"
tools:targetApi="28"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" />
<corners
android:radius="?android:attr/dialogCornerRadius"
/>
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml b/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml
index d56c8434824f..0182b4c650a1 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml
@@ -18,7 +18,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" />
<corners
android:radius="0dp"
/>
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml b/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml
index cc948a670382..fd8cecb8536e 100644
--- a/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml
+++ b/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml
@@ -22,12 +22,13 @@
<item name="iconGravity">textTop</item>
</style>
- <style name="SettingsLibActionButton.Expressive.Label" parent="SettingsLibTextAppearance.Emphasized.Title.Small">
+ <style name="SettingsLibActionButton.Expressive.Label" parent="">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:minWidth">@dimen/settingslib_expressive_space_small3</item>
<item name="android:minHeight">@dimen/settingslib_expressive_space_small3</item>
- <item name="android:textColor">@color/settingslib_materialColorOnSurface</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleSmall.Emphasized</item>
+ <item name="android:textColor">@color/settingslib_text_color_primary</item>
<item name="android:layout_gravity">center</item>
</style>
diff --git a/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml b/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml
index 716ed412eb5c..9018baca79e7 100644
--- a/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml
+++ b/packages/SettingsLib/CardPreference/res/layout/settingslib_expressive_preference_card.xml
@@ -40,7 +40,6 @@
<ImageView
android:id="@android:id/icon"
- android:src="@drawable/settingslib_arrow_drop_down"
android:layout_width="@dimen/settingslib_expressive_space_medium3"
android:layout_height="@dimen/settingslib_expressive_space_medium3"
android:scaleType="centerInside"/>
@@ -60,16 +59,12 @@
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:hyphenationFrequency="normalFast"
- android:lineBreakWordStyle="phrase"
android:textAppearance="@style/TextAppearance.CardTitle.SettingsLib"/>
<TextView
android:id="@android:id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:hyphenationFrequency="normalFast"
- android:lineBreakWordStyle="phrase"
android:textAppearance="@style/TextAppearance.CardSummary.SettingsLib"/>
</LinearLayout>
diff --git a/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml b/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml
index 4cbdea52d439..287b13fa0d50 100644
--- a/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml
+++ b/packages/SettingsLib/CardPreference/res/values/styles_expressive.xml
@@ -17,14 +17,12 @@
<resources>
<style name="TextAppearance.CardTitle.SettingsLib"
- parent="@style/TextAppearance.PreferenceTitle.SettingsLib">
+ parent="@style/TextAppearance.SettingsLib.TitleMedium.Emphasized">
<item name="android:textColor">@color/settingslib_materialColorOnPrimary</item>
- <item name="android:textSize">20sp</item>
</style>
<style name="TextAppearance.CardSummary.SettingsLib"
- parent="@style/TextAppearance.PreferenceSummary.SettingsLib">
+ parent="@style/TextAppearance.SettingsLib.LabelMedium">
<item name="android:textColor">@color/settingslib_materialColorOnSecondary</item>
- <item name="android:textSize">14sp</item>
</style>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml
index ccbe20e1c61f..9986a60250fe 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml
@@ -17,12 +17,9 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
- android:start="16dp"
- android:end="16dp"
- android:top="4dp"
- android:bottom="4dp">
+ android:start="16dp">
<shape>
- <size android:width="32dp" android:height="40dp" />
+ <size android:width="40dp" android:height="40dp" />
<solid android:color="@color/settingslib_materialColorSurfaceContainerHighest" />
<corners
android:radius="100dp" />
@@ -30,23 +27,21 @@
</item>
<item
- android:width="24dp"
- android:height="24dp"
+ android:width="16dp"
+ android:height="16dp"
android:gravity="center"
android:start="16dp"
- android:end="16dp"
- android:top="4dp"
- android:bottom="4dp">
+>
<vector
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="960"
- android:viewportHeight="960"
+ android:width="16dp"
+ android:height="16dp"
+ android:viewportWidth="16"
+ android:viewportHeight="16"
android:tint="@color/settingslib_materialColorOnSurfaceVariant"
android:autoMirrored="true">
<path
android:fillColor="@android:color/white"
- android:pathData="M313,520L537,744L480,800L160,480L480,160L537,216L313,440L800,440L800,520L313,520Z"/>
+ android:pathData="M3.626,9L8.526,13.9C8.726,14.1 8.817,14.333 8.801,14.6C8.801,14.867 8.701,15.1 8.501,15.3C8.301,15.483 8.067,15.583 7.801,15.6C7.534,15.6 7.301,15.5 7.101,15.3L0.501,8.7C0.401,8.6 0.326,8.492 0.276,8.375C0.242,8.258 0.226,8.133 0.226,8C0.226,7.867 0.242,7.742 0.276,7.625C0.326,7.508 0.401,7.4 0.501,7.3L7.101,0.7C7.284,0.517 7.509,0.425 7.776,0.425C8.059,0.425 8.301,0.517 8.501,0.7C8.701,0.9 8.801,1.142 8.801,1.425C8.801,1.692 8.701,1.925 8.501,2.125L3.626,7H14.801C15.084,7 15.317,7.1 15.501,7.3C15.701,7.483 15.801,7.717 15.801,8C15.801,8.283 15.701,8.525 15.501,8.725C15.317,8.908 15.084,9 14.801,9H3.626Z"/>
</vector>
</item>
</layer-list> \ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml
index e68253e2200d..fadcf7ba8699 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml
@@ -18,7 +18,7 @@
<style name="Theme.CollapsingToolbar.Settings" parent="@style/Theme.MaterialComponents.DayNight">
<item name="elevationOverlayEnabled">true</item>
<item name="elevationOverlayColor">?attr/colorPrimary</item>
- <item name="colorPrimary">@color/settingslib_materialColorInverseOnSurface</item>
+ <item name="colorPrimary">@color/settingslib_materialColorOnSurfaceInverse</item>
<item name="colorAccent">@color/settingslib_materialColorPrimaryFixed</item>
</style>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml
index d58c2c2eeb23..37a78101cc4e 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml
@@ -33,12 +33,12 @@
<item name="contentScrim">@color/settingslib_materialColorSurfaceContainer</item>
</style>
- <style name="SettingsLibCollapsingToolbarTitle.Collapsed" parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ <style name="SettingsLibCollapsingToolbarTitle.Collapsed" parent="@style/TextAppearance.SettingsLib.TitleLarge.Emphasized">
<!--set dp because we don't want size adjust when font size change-->
- <item name="android:textSize">20dp</item>
+ <item name="android:textSize">22dp</item>
</style>
- <style name="SettingsLibCollapsingToolbarTitle.Expanded" parent="CollapsingToolbarTitle.Collapsed">
+ <style name="SettingsLibCollapsingToolbarTitle.Expanded" parent="@style/TextAppearance.SettingsLib.DisplaySmall.Emphasized">
<item name="android:textSize">36dp</item>
</style>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml
index f7c9aac68629..7c9d1a47b7ef 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml
@@ -18,7 +18,7 @@
<style name="Theme.CollapsingToolbar.Settings" parent="@style/Theme.MaterialComponents.DayNight">
<item name="elevationOverlayEnabled">true</item>
<item name="elevationOverlayColor">?attr/colorPrimary</item>
- <item name="colorPrimary">@color/settingslib_materialColorInverseOnSurface</item>
+ <item name="colorPrimary">@color/settingslib_materialColorOnSurfaceInverse</item>
<item name="colorAccent">@color/settingslib_materialColorPrimary</item>
</style>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml b/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml
index 2edc001ccc3f..43cf6aa09109 100644
--- a/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml
+++ b/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml
@@ -26,7 +26,6 @@
<ImageView
android:id="@android:id/icon"
- android:src="@drawable/settingslib_arrow_drop_down"
style="@style/SettingsLibEntityHeaderIcon"/>
<TextView
diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
index 106802e9d1d1..73728bcd1ff7 100644
--- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
+++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
@@ -32,6 +32,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.ColorInt;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import com.android.settingslib.widget.mainswitch.R;
@@ -42,7 +43,7 @@ import java.util.List;
/**
* MainSwitchBar is a View with a customized Switch.
* This component is used as the main switch of the page
- * to enable or disable the prefereces on the page.
+ * to enable or disable the preferences on the page.
*/
public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListener {
@@ -58,6 +59,8 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen
protected CompoundButton mSwitch;
private final View mFrameView;
+ private @Nullable PreChangeListener mPreChangeListener;
+
public MainSwitchBar(Context context) {
this(context, null);
}
@@ -138,10 +141,20 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen
@Override
public boolean performClick() {
- mSwitch.performClick();
+ if (callPreChangeListener()) {
+ mSwitch.performClick();
+ }
return super.performClick();
}
+ protected boolean callPreChangeListener() {
+ return mPreChangeListener == null || mPreChangeListener.preChange(!mSwitch.isChecked());
+ }
+
+ public void setPreChangeListener(@Nullable PreChangeListener preChangeListener) {
+ mPreChangeListener = preChangeListener;
+ }
+
/**
* Update the switch status
*/
@@ -271,7 +284,7 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen
}
}
- static class SavedState extends BaseSavedState {
+ public static class SavedState extends BaseSavedState {
boolean mChecked;
boolean mVisible;
@@ -341,4 +354,16 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen
requestLayout();
}
+
+ /**
+ * Listener callback before switch is toggled.
+ */
+ public interface PreChangeListener {
+ /**
+ * Returns if the new value can be set.
+ *
+ * When false is return, the switch toggle is not triggered at all.
+ */
+ boolean preChange(boolean isCheck);
+ }
}
diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt
index 6e86fa7312cf..c1edbdc20361 100644
--- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt
+++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt
@@ -107,20 +107,11 @@ interface PreferenceMetadata {
*
* UI framework normally does not allow user to interact with the preference widget when it is
* disabled.
- *
- * [dependencyOfEnabledState] is provided to support dependency, the [shouldDisableDependents]
- * value of dependent preference is used to decide enabled state.
*/
- fun isEnabled(context: Context): Boolean {
- val dependency = dependencyOfEnabledState(context) ?: return true
- return !dependency.shouldDisableDependents(context)
- }
-
- /** Returns the key of depended preference to decide the enabled state. */
- fun dependencyOfEnabledState(context: Context): PreferenceMetadata? = null
+ fun isEnabled(context: Context): Boolean = true
- /** Returns whether this preference's dependents should be disabled. */
- fun shouldDisableDependents(context: Context): Boolean = !isEnabled(context)
+ /** Returns the keys of depended preferences. */
+ fun dependencies(context: Context): Array<String> = arrayOf()
/** Returns if the preference is persistent in datastore. */
fun isPersistent(context: Context): Boolean = this is PersistentPreference<*>
@@ -174,13 +165,11 @@ interface PreferenceMetadata {
}
/** Metadata of preference group. */
-@AnyThread
-interface PreferenceGroup : PreferenceMetadata
+@AnyThread interface PreferenceGroup : PreferenceMetadata
/** Metadata of preference category. */
@AnyThread
-open class PreferenceCategory(override val key: String, override val title: Int) :
- PreferenceGroup
+open class PreferenceCategory(override val key: String, override val title: Int) : PreferenceGroup
/** Metadata of preference screen. */
@AnyThread
diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt
index 6704ecc93891..3dd15946d415 100644
--- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt
+++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt
@@ -21,6 +21,7 @@ import android.content.ContextWrapper
import android.content.Intent
import android.os.Bundle
import androidx.lifecycle.LifecycleCoroutineScope
+import com.android.settingslib.datastore.KeyValueStore
import kotlinx.coroutines.CoroutineScope
/**
@@ -157,6 +158,9 @@ abstract class PreferenceLifecycleContext(context: Context) : ContextWrapper(con
*/
abstract fun <T : Any> requirePreference(key: String): T
+ /** Returns the [KeyValueStore] attached to the preference of given key *on the same screen*. */
+ abstract fun getKeyValueStore(key: String): KeyValueStore?
+
/** Notifies that preference state of given key is changed and updates preference widget UI. */
abstract fun notifyPreferenceChange(key: String)
diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt
index 512ea3d874bb..87bd261bf4bd 100644
--- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt
+++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt
@@ -16,18 +16,10 @@
package com.android.settingslib.metadata
-import android.content.Context
import androidx.annotation.StringRes
-/**
- * Common base class for preferences that have two selectable states, save a boolean value, and may
- * have dependent preferences that are enabled/disabled based on the current state.
- */
-interface TwoStatePreference : PreferenceMetadata, PersistentPreference<Boolean>, BooleanValue {
-
- override fun shouldDisableDependents(context: Context) =
- storage(context).getBoolean(key) != true || super.shouldDisableDependents(context)
-}
+/** Common base class for preferences that have two selectable states and save a boolean value. */
+interface TwoStatePreference : PreferenceMetadata, PersistentPreference<Boolean>, BooleanValue
/** A preference that provides a two-state toggleable option. */
open class SwitchPreference
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
index 6fc9357e9332..a9e20f284a61 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
@@ -67,6 +67,11 @@ class PreferenceScreenBindingHelper(
override fun <T : Any> requirePreference(key: String) = findPreference<T>(key)!!
+ override fun getKeyValueStore(key: String) =
+ (findPreference<Preference>(key)?.preferenceDataStore
+ as? PreferenceDataStoreAdapter)
+ ?.keyValueStore
+
override fun notifyPreferenceChange(key: String) =
notifyChange(key, CHANGE_REASON_STATE)
@@ -92,14 +97,14 @@ class PreferenceScreenBindingHelper(
val preferencesBuilder = ImmutableMap.builder<String, PreferenceHierarchyNode>()
val dependenciesBuilder = ImmutableMultimap.builder<String, String>()
val lifecycleAwarePreferences = mutableListOf<PreferenceLifecycleProvider>()
- fun PreferenceMetadata.addDependency(dependency: PreferenceMetadata) {
- dependenciesBuilder.put(key, dependency.key)
- }
fun PreferenceHierarchyNode.addNode() {
metadata.let {
- preferencesBuilder.put(it.key, this)
- it.dependencyOfEnabledState(context)?.addDependency(it)
+ val key = it.key
+ preferencesBuilder.put(key, this)
+ for (dependency in it.dependencies(context)) {
+ dependenciesBuilder.put(dependency, key)
+ }
if (it is PreferenceLifecycleProvider) lifecycleAwarePreferences.add(it)
}
}
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant12.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant12.xml
new file mode 100644
index 000000000000..f125425d1ec9
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant12.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="12"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant17.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant17.xml
new file mode 100644
index 000000000000..36a781954e42
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant17.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="17"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant22.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant22.xml
new file mode 100644
index 000000000000..0ef31d014aa2
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant22.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="22"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant24.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant24.xml
new file mode 100644
index 000000000000..6797f82e4250
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant24.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="24"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant4.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant4.xml
new file mode 100644
index 000000000000..ff7df5543a40
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant4.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="4"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant6.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant6.xml
new file mode 100644
index 000000000000..8da5dafea567
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant6.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="6"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant87.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant87.xml
new file mode 100644
index 000000000000..227baeedd99e
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant87.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="87"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant92.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant92.xml
new file mode 100644
index 000000000000..f4564381eb33
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant92.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="92"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant94.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant94.xml
new file mode 100644
index 000000000000..bb4e03d64307
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant94.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="94"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant96.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant96.xml
new file mode 100644
index 000000000000..949b1961099f
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant96.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="96"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant98.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant98.xml
new file mode 100644
index 000000000000..7e5ee241ffbd
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_neutral_variant98.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral2_600" android:lStar="98"/>
+</selector> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_check.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_check.xml
index 309dbdf1ea96..309dbdf1ea96 100644
--- a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_check.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_check.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_close.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_close.xml
index e6df8a416922..e6df8a416922 100644
--- a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_icon_close.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_icon_close.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_switch_thumb_icon.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_switch_thumb_icon.xml
index 342729d7ee5a..342729d7ee5a 100644
--- a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_expressive_switch_thumb_icon.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_expressive_switch_thumb_icon.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml
index ea7baa42a2c7..2261e58a961e 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml
@@ -40,7 +40,7 @@
android:longClickable="false"
android:maxLines="10"
android:ellipsize="end"
- android:textAppearance="@style/TextAppearance.TopIntroText"/>
+ android:textAppearance="@style/TextAppearance.SettingsLib.BodyLarge"/>
<com.android.settingslib.widget.LinkableTextView
android:id="@+id/settingslib_expressive_learn_more"
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml b/packages/SettingsLib/SettingsTheme/res/layout/settingslib_expressive_preference_text_frame.xml
index c837ff43e46b..db357f8ae13f 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_text_frame.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout/settingslib_expressive_preference_text_frame.xml
@@ -32,8 +32,6 @@
android:layout_gravity="start"
android:textAlignment="viewStart"
android:maxLines="2"
- android:hyphenationFrequency="normalFast"
- android:lineBreakWordStyle="phrase"
android:textAppearance="?android:attr/textAppearanceListItem"
android:ellipsize="marquee"/>
@@ -47,7 +45,5 @@
android:textAlignment="viewStart"
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
android:textColor="?android:attr/textColorSecondary"
- android:maxLines="10"
- android:hyphenationFrequency="normalFast"
- android:lineBreakWordStyle="phrase"/>
+ android:maxLines="10"/>
</RelativeLayout> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml b/packages/SettingsLib/SettingsTheme/res/layout/settingslib_preference_category_no_title.xml
index f69fcd270919..f69fcd270919 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_preference_category_no_title.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout/settingslib_preference_category_no_title.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
index 46ec62e7a5ef..8873116be306 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
@@ -58,4 +58,39 @@
<color name="settingslib_colorSurface">@color/settingslib_surface_dark</color>
<color name="settingslib_list_divider_color">@android:color/system_neutral1_700</color>
+
+ <color name="settingslib_materialColorPrimary">@android:color/system_accent1_200</color>
+ <color name="settingslib_materialColorOnPrimary">@android:color/system_accent1_800</color>
+ <color name="settingslib_materialColorPrimaryContainer">@android:color/system_accent1_700</color>
+ <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_accent1_100</color>
+ <color name="settingslib_materialColorPrimaryInverse">@android:color/system_accent1_600</color>
+ <color name="settingslib_materialColorSecondary">@android:color/system_accent2_200</color>
+ <color name="settingslib_materialColorOnSecondary">@android:color/system_accent2_800</color>
+ <color name="settingslib_materialColorSecondaryContainer">@android:color/system_accent2_700</color>
+ <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_accent2_100</color>
+ <color name="settingslib_materialColorTertiary">@android:color/system_accent3_200</color>
+ <color name="settingslib_materialColorOnTertiary">@android:color/system_accent3_800</color>
+ <color name="settingslib_materialColorTertiaryContainer">@android:color/system_accent3_700</color>
+ <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_accent3_100</color>
+ <color name="settingslib_materialColorError">@color/settingslib_error_200</color>
+ <color name="settingslib_materialColorOnError">@color/settingslib_error_800</color>
+ <color name="settingslib_materialColorErrorContainer">@color/settingslib_error_700</color>
+ <color name="settingslib_materialColorOnErrorContainer">@color/settingslib_error_100</color>
+ <color name="settingslib_materialColorOutline">@android:color/system_neutral2_400</color>
+ <color name="settingslib_materialColorOutlineVariant">@android:color/system_neutral2_700</color>
+ <color name="settingslib_materialColorBackground">@color/settingslib_neutral_variant6</color>
+ <color name="settingslib_materialColorOnBackground">@android:color/system_neutral1_100</color>
+ <color name="settingslib_materialColorSurface">@color/settingslib_neutral_variant6</color>
+ <color name="settingslib_materialColorOnSurface">@android:color/system_neutral1_100</color>
+ <color name="settingslib_materialColorSurfaceVariant">@android:color/system_neutral2_700</color>
+ <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_neutral2_200</color>
+ <color name="settingslib_materialColorSurfaceInverse">@android:color/system_neutral1_100</color>
+ <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_neutral1_800</color>
+ <color name="settingslib_materialColorSurfaceBright">@color/settingslib_neutral_variant24</color>
+ <color name="settingslib_materialColorSurfaceDim">@color/settingslib_neutral_variant6</color>
+ <color name="settingslib_materialColorSurfaceContainer">@color/settingslib_neutral_variant12</color>
+ <color name="settingslib_materialColorSurfaceContainerLowest">@color/settingslib_neutral_variant4</color>
+ <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_neutral2_900</color>
+ <color name="settingslib_materialColorSurfaceContainerHigh">@color/settingslib_neutral_variant17</color>
+ <color name="settingslib_materialColorSurfaceContainerHighest">@color/settingslib_neutral_variant22</color>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml
index 8cfe54f44fe5..00a1f27c162a 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v34/colors.xml
@@ -42,4 +42,39 @@
<color name="settingslib_text_color_primary_device_default">@android:color/system_on_surface_dark</color>
<!--Deprecated. After sdk 35 don't use it. using materialColorOnSurfaceVariant-->
<color name="settingslib_text_color_secondary_device_default">@android:color/system_on_surface_variant_dark</color>
+
+ <color name="settingslib_materialColorPrimary">@android:color/system_primary_dark</color>
+ <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_dark</color>
+ <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_dark</color>
+ <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_dark</color>
+ <color name="settingslib_materialColorPrimaryInverse">@android:color/system_primary_light</color>
+ <color name="settingslib_materialColorSecondary">@android:color/system_secondary_dark</color>
+ <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_dark</color>
+ <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_dark</color>
+ <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_dark</color>
+ <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_dark</color>
+ <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_dark</color>
+ <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_dark</color>
+ <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_dark</color>
+ <color name="settingslib_materialColorError">@android:color/system_error_dark</color>
+ <color name="settingslib_materialColorOnError">@android:color/system_on_error_dark</color>
+ <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_dark</color>
+ <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_dark</color>
+ <color name="settingslib_materialColorOutline">@android:color/system_outline_dark</color>
+ <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_dark</color>
+ <color name="settingslib_materialColorBackground">@android:color/system_background_dark</color>
+ <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_dark</color>
+ <color name="settingslib_materialColorSurface">@android:color/system_surface_dark</color>
+ <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_dark</color>
+ <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_dark</color>
+ <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_dark</color>
+ <color name="settingslib_materialColorSurfaceInverse">@android:color/system_surface_light</color>
+ <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_on_surface_light</color>
+ <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_dark</color>
+ <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_dark</color>
+ <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_dark</color>
+ <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_dark</color>
+ <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_dark</color>
+ <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_dark</color>
+ <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_dark</color>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml
index 84a3ed68af01..e31e80176625 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml
@@ -46,37 +46,4 @@
<color name="settingslib_colorSurfaceHeader">@color/settingslib_materialColorSurfaceVariant</color>
<color name="settingslib_text_color_preference_category_title">@color/settingslib_materialColorPrimary</color>
-
- <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_dark</color>
- <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_dark</color>
- <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_dark</color>
- <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_dark</color>
- <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_dark</color>
- <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_dark</color>
- <color name="settingslib_materialColorInverseOnSurface">@android:color/system_on_surface_light</color>
- <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_dark</color>
- <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_dark</color>
- <color name="settingslib_materialColorInversePrimary">@android:color/system_primary_light</color>
- <color name="settingslib_materialColorInverseSurface">@android:color/system_surface_light</color>
- <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_dark</color>
- <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_dark</color>
- <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_dark</color>
- <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_dark</color>
- <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_dark</color>
- <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_dark</color>
- <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_dark</color>
- <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_dark</color>
- <color name="settingslib_materialColorOnError">@android:color/system_on_error_dark</color>
- <color name="settingslib_materialColorSurface">@android:color/system_surface_dark</color>
- <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_dark</color>
- <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_dark</color>
- <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_dark</color>
- <color name="settingslib_materialColorOutline">@android:color/system_outline_dark</color>
- <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_dark</color>
- <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_dark</color>
- <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_dark</color>
- <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_dark</color>
- <color name="settingslib_materialColorPrimary">@android:color/system_primary_dark</color>
- <color name="settingslib_materialColorSecondary">@android:color/system_secondary_dark</color>
- <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_dark</color>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night/colors.xml
new file mode 100644
index 000000000000..e57fe4f512fe
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values-night/colors.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <color name="settingslib_materialColorPrimary">#83D6C7</color>
+ <color name="settingslib_materialColorOnPrimary">#003730</color>
+ <color name="settingslib_materialColorPrimaryContainer">#005047</color>
+ <color name="settingslib_materialColorOnPrimaryContainer">#A1F1E2</color>
+ <color name="settingslib_materialColorPrimaryInverse">#A1F1E2</color>
+ <color name="settingslib_materialColorSecondary">#B1CCC6</color>
+ <color name="settingslib_materialColorOnSecondary">#1C342F</color>
+ <color name="settingslib_materialColorSecondaryContainer">#334C47</color>
+ <color name="settingslib_materialColorOnSecondaryContainer">#CCE8E2</color>
+ <color name="settingslib_materialColorTertiary">#ADCAE5</color>
+ <color name="settingslib_materialColorOnTertiary">#123349</color>
+ <color name="settingslib_materialColorTertiaryContainer">#2D4960</color>
+ <color name="settingslib_materialColorOnTertiaryContainer">#CEE7FF</color>
+ <color name="settingslib_materialColorError">#F2B8B5</color>
+ <color name="settingslib_materialColorOnError">#601410</color>
+ <color name="settingslib_materialColorErrorContainer">#8C1D18</color>
+ <color name="settingslib_materialColorOnErrorContainer">#F9DEDC</color>
+ <color name="settingslib_materialColorOutline">#919191</color>
+ <color name="settingslib_materialColorOutlineVariant">#474747</color>
+ <color name="settingslib_materialColorBackground">#131313</color>
+ <color name="settingslib_materialColorOnBackground">#E5E2E1</color>
+ <color name="settingslib_materialColorSurface">#131313</color>
+ <color name="settingslib_materialColorOnSurface">#E5E2E1</color>
+ <color name="settingslib_materialColorSurfaceVariant">#474747</color>
+ <color name="settingslib_materialColorOnSurfaceVariant">#C7C7C7</color>
+ <color name="settingslib_materialColorSurfaceInverse">#E5E2E1</color>
+ <color name="settingslib_materialColorOnSurfaceInverse">#303030</color>
+ <color name="settingslib_materialColorSurfaceBright">#393939</color>
+ <color name="settingslib_materialColorSurfaceDim">#131313</color>
+ <color name="settingslib_materialColorSurfaceContainer">#1F1F1F</color>
+ <color name="settingslib_materialColorSurfaceContainerLowest">#1B1B1B</color>
+ <color name="settingslib_materialColorSurfaceContainerLow">#0E0E0E</color>
+ <color name="settingslib_materialColorSurfaceContainerHigh">#2A2A2A</color>
+ <color name="settingslib_materialColorSurfaceContainerHighest">#343434</color>
+</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
index fef92b792bec..e000423784c6 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
@@ -92,4 +92,51 @@
<color name="settingslib_spinner_dropdown_color">@android:color/system_neutral2_700</color>
<color name="settingslib_list_divider_color">@android:color/system_neutral1_200</color>
+
+ <color name="settingslib_materialColorPrimary">@android:color/system_accent1_600</color>
+ <color name="settingslib_materialColorOnPrimary">@android:color/system_accent1_0</color>
+ <color name="settingslib_materialColorPrimaryContainer">@android:color/system_accent1_100</color>
+ <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_accent1_900</color>
+ <color name="settingslib_materialColorPrimaryInverse">@android:color/system_accent1_200</color>
+ <color name="settingslib_materialColorPrimaryFixed">@android:color/system_accent1_100</color>
+ <color name="settingslib_materialColorPrimaryFixedDim">@android:color/system_accent1_200</color>
+ <color name="settingslib_materialColorOnPrimaryFixed">@android:color/system_accent1_900</color>
+ <color name="settingslib_materialColorOnPrimaryFixedVariant">@android:color/system_accent1_700</color>
+ <color name="settingslib_materialColorSecondary">@android:color/system_accent2_600</color>
+ <color name="settingslib_materialColorOnSecondary">@android:color/system_accent2_0</color>
+ <color name="settingslib_materialColorSecondaryContainer">@android:color/system_accent2_100</color>
+ <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_accent2_900</color>
+ <color name="settingslib_materialColorSecondaryFixed">@android:color/system_accent2_100</color>
+ <color name="settingslib_materialColorSecondaryFixedDim">@android:color/system_accent2_200</color>
+ <color name="settingslib_materialColorOnSecondaryFixed">@android:color/system_accent2_900</color>
+ <color name="settingslib_materialColorOnSecondaryFixedVariant">@android:color/system_accent2_700</color>
+ <color name="settingslib_materialColorTertiary">@android:color/system_accent3_600</color>
+ <color name="settingslib_materialColorOnTertiary">@android:color/system_accent3_0</color>
+ <color name="settingslib_materialColorTertiaryContainer">@android:color/system_accent3_100</color>
+ <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_accent3_900</color>
+ <color name="settingslib_materialColorTertiaryFixed">@android:color/system_accent3_100</color>
+ <color name="settingslib_materialColorTertiaryFixedDim">@android:color/system_accent3_200</color>
+ <color name="settingslib_materialColorOnTertiaryFixed">@android:color/system_accent3_900</color>
+ <color name="settingslib_materialColorOnTertiaryFixedVariant">@android:color/system_accent3_700</color>
+ <color name="settingslib_materialColorError">@color/settingslib_error_600</color>
+ <color name="settingslib_materialColorOnError">@android:color/white</color>
+ <color name="settingslib_materialColorErrorContainer">@color/settingslib_error_100</color>
+ <color name="settingslib_materialColorOnErrorContainer">@color/settingslib_error_900</color>
+ <color name="settingslib_materialColorOutline">@android:color/system_neutral2_500</color>
+ <color name="settingslib_materialColorOutlineVariant">@android:color/system_neutral2_200</color>
+ <color name="settingslib_materialColorBackground">@android:color/white</color>
+ <color name="settingslib_materialColorOnBackground">@android:color/system_neutral1_900</color>
+ <color name="settingslib_materialColorSurface">@color/settingslib_neutral_variant98</color>
+ <color name="settingslib_materialColorOnSurface">@android:color/system_neutral1_900</color>
+ <color name="settingslib_materialColorSurfaceVariant">@android:color/system_neutral2_100</color>
+ <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_neutral2_700</color>
+ <color name="settingslib_materialColorSurfaceInverse">@android:color/system_neutral1_800</color>
+ <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_neutral1_50</color>
+ <color name="settingslib_materialColorSurfaceBright">@color/settingslib_neutral_variant98</color>
+ <color name="settingslib_materialColorSurfaceDim">@color/settingslib_neutral_variant87</color>
+ <color name="settingslib_materialColorSurfaceContainer">@color/settingslib_neutral_variant94</color>
+ <color name="settingslib_materialColorSurfaceContainerLow">@color/settingslib_neutral_variant96</color>
+ <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_neutral2_0</color>
+ <color name="settingslib_materialColorSurfaceContainerHigh">@color/settingslib_neutral_variant92</color>
+ <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_neutral2_100</color>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/config.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/config.xml
index 4860ad361744..8993d0fc71f7 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/config.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/config.xml
@@ -17,6 +17,4 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<bool name="settingslib_config_icon_space_reserved">false</bool>
<bool name="settingslib_config_allow_divider">false</bool>
- <!-- Name of a font family to use for headlines in SettingsLib. -->
- <string name="settingslib_config_headlineFontFamily" translatable="false"></string>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml
new file mode 100644
index 000000000000..9d3d70b366aa
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+ <style name="SettingsLibButtonStyle.Expressive.Filled"
+ parent="@style/Widget.Material3.Button">
+ <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
+ <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
+ <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
+ <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
+ <item name="android:backgroundTint">@color/settingslib_materialColorPrimary</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.LabelLarge</item>
+ <item name="android:textColor">@color/settingslib_materialColorOnPrimary</item>
+ <item name="iconGravity">textStart</item>
+ <item name="iconTint">@color/settingslib_materialColorOnPrimary</item>
+ <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
+ </style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Filled.Large">
+ <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
+ <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleMedium</item>
+ </style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Filled.Extra"
+ parent="@style/SettingsLibButtonStyle.Expressive.Filled.Large">
+ <item name="android:layout_width">match_parent</item>
+ </style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Tonal"
+ parent="@style/Widget.Material3.Button.TonalButton">
+ <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
+ <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
+ <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
+ <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
+ <item name="android:backgroundTint">@color/settingslib_materialColorSecondaryContainer</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.LabelLarge</item>
+ <item name="android:textColor">@color/settingslib_materialColorOnSecondaryContainer</item>
+ <item name="iconGravity">textStart</item>
+ <item name="iconTint">@color/settingslib_materialColorOnSecondaryContainer</item>
+ <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
+ </style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Tonal.Large">
+ <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
+ <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleMedium</item>
+ </style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Tonal.Extra"
+ parent="@style/SettingsLibButtonStyle.Expressive.Tonal.Large">
+ <item name="android:layout_width">match_parent</item>
+ </style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Outline"
+ parent="@style/Widget.Material3.Button.OutlinedButton.Icon">
+ <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
+ <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
+ <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
+ <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.LabelLarge</item>
+ <item name="android:textColor">@color/settingslib_materialColorPrimary</item>
+ <item name="iconTint">@color/settingslib_materialColorPrimary</item>
+ <item name="iconGravity">textStart</item>
+ <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
+ <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item>
+ <item name="strokeColor">@color/settingslib_materialColorOutlineVariant</item>
+ </style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Outline.Large">
+ <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
+ <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleMedium</item>
+ </style>
+
+ <style name="SettingsLibButtonStyle.Expressive.Outline.Extra"
+ parent="@style/SettingsLibButtonStyle.Expressive.Outline.Large">
+ <item name="android:layout_width">match_parent</item>
+ </style>
+
+ <style name="SettingslibTextButtonStyle.Expressive"
+ parent="@style/Widget.Material3.Button.TextButton.Icon">
+ <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.BodyLarge.Emphasized</item>
+ <item name="android:textColor">@color/settingslib_materialColorOnSurface</item>
+ <item name="iconTint">@null</item>
+ <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item>
+ <item name="rippleColor">?android:attr/colorControlHighlight</item>
+ </style>
+
+ <style name="SettingsLibCardStyle" parent="">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginHorizontal">?android:attr/listPreferredItemPaddingStart</item>
+ <item name="android:layout_marginVertical">@dimen/settingslib_expressive_space_extrasmall4</item>
+ <item name="cardBackgroundColor">@color/settingslib_materialColorPrimary</item>
+ <item name="cardCornerRadius">@dimen/settingslib_expressive_radius_extralarge3</item>
+ <item name="cardElevation">0dp</item>
+ <item name="rippleColor">?android:attr/colorControlHighlight</item>
+ </style>
+</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v33/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v33/styles_expressive.xml
new file mode 100644
index 000000000000..74bf55a8a625
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values-v33/styles_expressive.xml
@@ -0,0 +1,306 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+ <style name="TextAppearance.SettingsLib.DisplayLarge"
+ parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ <item name="android:textSize">57sp</item>
+ <item name="android:letterSpacing">-0.00438596</item>
+ <item name="android:lineHeight">64sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.DisplayMedium"
+ parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ <item name="android:textSize">45sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">52sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.DisplaySmall"
+ parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ <item name="android:textSize">36sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">44sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.HeadlineLarge"
+ parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ <item name="android:textSize">32sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">40sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.HeadlineMedium"
+ parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ <item name="android:textSize">28sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">36sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.HeadlineSmall"
+ parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ <item name="android:textSize">24sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">32sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.TitleLarge"
+ parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ <item name="android:textSize">22sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">28sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.TitleMedium"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">16sp</item>
+ <item name="android:letterSpacing">0.009375</item>
+ <item name="android:lineHeight">24sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.TitleSmall"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.00714286</item>
+ <item name="android:lineHeight">20sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.LabelLarge"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.00714286</item>
+ <item name="android:lineHeight">20sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.LabelMedium"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">12sp</item>
+ <item name="android:letterSpacing">0.04166667</item>
+ <item name="android:lineHeight">16sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.LabelSmall"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">11sp</item>
+ <item name="android:letterSpacing">0.04545455</item>
+ <item name="android:lineHeight">16sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.BodyLarge"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textSize">16sp</item>
+ <item name="android:letterSpacing">0.03125</item>
+ <item name="android:lineHeight">24sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.BodyMedium"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.01785714</item>
+ <item name="android:lineHeight">20sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.BodySmall"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textSize">12sp</item>
+ <item name="android:letterSpacing">0.03333333</item>
+ <item name="android:lineHeight">16sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.DisplayLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">57sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">64sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.DisplayMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">45sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">52sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.DisplaySmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">36sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">44sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.HeadlineLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">32sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">40sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.HeadlineMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">28sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">36sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.HeadlineSmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">24sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">32sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.TitleLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">22sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight">28sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.TitleMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">16sp</item>
+ <item name="android:letterSpacing">0.009375</item>
+ <item name="android:lineHeight">24sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.TitleSmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.00714286</item>
+ <item name="android:lineHeight">20sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.LabelLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.00714286</item>
+ <item name="android:lineHeight">20sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.LabelMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">12sp</item>
+ <item name="android:letterSpacing">0.04166667</item>
+ <item name="android:lineHeight">16sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.LabelSmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">11sp</item>
+ <item name="android:letterSpacing">0.04545455</item>
+ <item name="android:lineHeight">16sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.BodyLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textStyle">normal</item>
+ <item name="android:textSize">16sp</item>
+ <item name="android:letterSpacing">0.009375</item>
+ <item name="android:lineHeight">24sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.BodyMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textStyle">normal</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.01785714</item>
+ <item name="android:lineHeight">20sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.BodySmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textStyle">normal</item>
+ <item name="android:textSize">12sp</item>
+ <item name="android:letterSpacing">0.03333333</item>
+ <item name="android:lineHeight">16sp</item>
+ <item name="android:hyphenationFrequency">normalFast</item>
+ <item name="android:lineBreakWordStyle">phrase</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml
index 185ac3e1fe73..60642e617a81 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v34/colors.xml
@@ -43,4 +43,51 @@
<color name="settingslib_text_color_primary_device_default">@android:color/system_on_surface_light</color>
<!--Deprecated. After sdk 35 don't use it. using materialColorOnSurfaceVariant-->
<color name="settingslib_text_color_secondary_device_default">@android:color/system_on_surface_variant_light</color>
+
+ <color name="settingslib_materialColorPrimary">@android:color/system_primary_light</color>
+ <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_light</color>
+ <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_light</color>
+ <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_light</color>
+ <color name="settingslib_materialColorPrimaryInverse">@android:color/system_primary_dark</color>
+ <color name="settingslib_materialColorPrimaryFixed">@android:color/system_primary_fixed</color>
+ <color name="settingslib_materialColorPrimaryFixedDim">@android:color/system_primary_fixed_dim</color>
+ <color name="settingslib_materialColorOnPrimaryFixed">@android:color/system_on_primary_fixed</color>
+ <color name="settingslib_materialColorOnPrimaryFixedVariant">@android:color/system_on_primary_fixed_variant</color>
+ <color name="settingslib_materialColorSecondary">@android:color/system_secondary_light</color>
+ <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_light</color>
+ <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_light</color>
+ <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_light</color>
+ <color name="settingslib_materialColorSecondaryFixed">@android:color/system_secondary_fixed</color>
+ <color name="settingslib_materialColorSecondaryFixedDim">@android:color/system_secondary_fixed_dim</color>
+ <color name="settingslib_materialColorOnSecondaryFixed">@android:color/system_on_secondary_fixed</color>
+ <color name="settingslib_materialColorOnSecondaryFixedVariant">@android:color/system_on_secondary_fixed_variant</color>
+ <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_light</color>
+ <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_light</color>
+ <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_light</color>
+ <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_light</color>
+ <color name="settingslib_materialColorTertiaryFixed">@android:color/system_tertiary_fixed</color>
+ <color name="settingslib_materialColorTertiaryFixedDim">@android:color/system_tertiary_fixed_dim</color>
+ <color name="settingslib_materialColorOnTertiaryFixed">@android:color/system_on_tertiary_fixed</color>
+ <color name="settingslib_materialColorOnTertiaryFixedVariant">@android:color/system_on_tertiary_fixed_variant</color>
+ <color name="settingslib_materialColorError">@android:color/system_error_light</color>
+ <color name="settingslib_materialColorOnError">@android:color/system_on_error_light</color>
+ <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_light</color>
+ <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_light</color>
+ <color name="settingslib_materialColorOutline">@android:color/system_outline_light</color>
+ <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_light</color>
+ <color name="settingslib_materialColorBackground">@android:color/system_background_light</color>
+ <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_light</color>
+ <color name="settingslib_materialColorSurface">@android:color/system_surface_light</color>
+ <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_light</color>
+ <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_light</color>
+ <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_light</color>
+ <color name="settingslib_materialColorSurfaceInverse">@android:color/system_surface_dark</color>
+ <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_on_surface_dark</color>
+ <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_light</color>
+ <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_light</color>
+ <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_light</color>
+ <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_light</color>
+ <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_light</color>
+ <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_light</color>
+ <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_light</color>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml
index 90c19e1aa676..b1b37b12c572 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml
@@ -54,49 +54,4 @@
<color name="settingslib_spinner_title_color">@color/settingslib_materialColorOnPrimaryContainer</color>
<!-- The text color of dropdown item title -->
<color name="settingslib_spinner_dropdown_color">@color/settingslib_materialColorOnPrimaryContainer</color>
-
- <color name="settingslib_materialColorOnSecondaryFixedVariant">@android:color/system_on_secondary_fixed_variant</color>
- <color name="settingslib_materialColorOnTertiaryFixedVariant">@android:color/system_on_tertiary_fixed_variant</color>
- <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_light</color>
- <color name="settingslib_materialColorOnPrimaryFixedVariant">@android:color/system_on_primary_fixed_variant</color>
- <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_light</color>
- <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_light</color>
- <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_light</color>
- <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_light</color>
- <color name="settingslib_materialColorSecondaryFixedDim">@android:color/system_secondary_fixed_dim</color>
- <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_light</color>
- <color name="settingslib_materialColorOnSecondaryFixed">@android:color/system_on_secondary_fixed</color>
- <color name="settingslib_materialColorInverseOnSurface">@android:color/system_on_surface_dark</color>
- <color name="settingslib_materialColorTertiaryFixedDim">@android:color/system_tertiary_fixed_dim</color>
- <color name="settingslib_materialColorOnTertiaryFixed">@android:color/system_on_tertiary_fixed</color>
- <color name="settingslib_materialColorPrimaryFixedDim">@android:color/system_primary_fixed_dim</color>
- <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_light</color>
- <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_light</color>
- <color name="settingslib_materialColorOnPrimaryFixed">@android:color/system_on_primary_fixed</color>
- <color name="settingslib_materialColorInversePrimary">@android:color/system_primary_dark</color>
- <color name="settingslib_materialColorSecondaryFixed">@android:color/system_secondary_fixed</color>
- <color name="settingslib_materialColorInverseSurface">@android:color/system_surface_dark</color>
- <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_light</color>
- <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_light</color>
- <color name="settingslib_materialColorTertiaryFixed">@android:color/system_tertiary_fixed</color>
- <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_light</color>
- <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_light</color>
- <color name="settingslib_materialColorPrimaryFixed">@android:color/system_primary_fixed</color>
- <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_light</color>
- <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_light</color>
- <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_light</color>
- <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_light</color>
- <color name="settingslib_materialColorOnError">@android:color/system_on_error_light</color>
- <color name="settingslib_materialColorSurface">@android:color/system_surface_light</color>
- <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_light</color>
- <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_light</color>
- <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_light</color>
- <color name="settingslib_materialColorOutline">@android:color/system_outline_light</color>
- <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_light</color>
- <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_light</color>
- <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_light</color>
- <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_light</color>
- <color name="settingslib_materialColorPrimary">@android:color/system_primary_light</color>
- <color name="settingslib_materialColorSecondary">@android:color/system_secondary_light</color>
- <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_light</color>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
index 05a1ceacdb65..1a085681864a 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
@@ -16,150 +16,6 @@
-->
<resources>
- <style name="SettingsLibTextAppearance" parent="@android:style/TextAppearance.DeviceDefault">
- <!--item name="android:fontFamily"></item-->
- <item name="android:hyphenationFrequency">normalFast</item>
- <item name="android:lineBreakWordStyle">phrase</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Primary">
- <!--item name="android:fontFamily"></item-->
- </style>
-
- <style name="SettingsLibTextAppearance.Primary.Display">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Primary.Display.Large">
- <item name="android:textSize">57sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Display.Medium">
- <item name="android:textSize">45sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Display.Small">
- <item name="android:textSize">36sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Primary.Headline">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Primary.Headline.Large">
- <item name="android:textSize">32sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Headline.Medium">
- <item name="android:textSize">28sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Headline.Small">
- <item name="android:textSize">24sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Primary.Title">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Primary.Title.Large">
- <item name="android:textSize">22sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Title.Medium">
- <item name="android:textSize">16sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Title.Small">
- <item name="android:textSize">14sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Primary.Label">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Primary.Label.Large">
- <item name="android:textSize">14sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Label.Medium">
- <item name="android:textSize">12sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Label.Small">
- <item name="android:textSize">11sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Primary.Body">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Primary.Body.Large">
- <item name="android:textSize">16sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Body.Medium">
- <item name="android:textSize">14sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Primary.Body.Small">
- <item name="android:textSize">12sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Emphasized">
- <!--item name="android:fontFamily"></item-->
- </style>
-
- <style name="SettingsLibTextAppearance.Emphasized.Display">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Display.Large">
- <item name="android:textSize">57sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Display.Medium">
- <item name="android:textSize">45sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Display.Small">
- <item name="android:textSize">36sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Emphasized.Headline">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Headline.Large">
- <item name="android:textSize">32sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Headline.Medium">
- <item name="android:textSize">28sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Headline.Small">
- <item name="android:textSize">24sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Emphasized.Title">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Title.Large">
- <item name="android:textSize">22sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Title.Medium">
- <item name="android:textSize">16sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Title.Small">
- <item name="android:textSize">14sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Emphasized.Label">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Label.Large">
- <item name="android:textSize">14sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Label.Medium">
- <item name="android:textSize">12sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Label.Small">
- <item name="android:textSize">11sp</item>
- </style>
-
- <style name="SettingsLibTextAppearance.Emphasized.Body">
- <!--item name="android:fontFamily"></item-->
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Body.Large">
- <item name="android:textSize">16sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Body.Medium">
- <item name="android:textSize">14sp</item>
- </style>
- <style name="SettingsLibTextAppearance.Emphasized.Body.Small">
- <item name="android:textSize">12sp</item>
- </style>
-
<style name="SettingslibSwitchStyle.Expressive" parent="">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
@@ -175,122 +31,6 @@
<item name="trackTint">@color/settingslib_expressive_color_main_switch_track</item>
</style>
- <style name="SettingsLibCardStyle" parent="">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:layout_marginHorizontal">?android:attr/listPreferredItemPaddingStart</item>
- <item name="android:layout_marginVertical">@dimen/settingslib_expressive_space_extrasmall4</item>
- <item name="cardBackgroundColor">@color/settingslib_materialColorPrimary</item>
- <item name="cardCornerRadius">@dimen/settingslib_expressive_radius_extralarge3</item>
- <item name="cardElevation">0dp</item>
- <item name="rippleColor">?android:attr/colorControlHighlight</item>
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Filled"
- parent="@style/Widget.Material3.Button">
- <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:gravity">center</item>
- <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
- <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
- <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
- <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
- <item name="android:backgroundTint">@color/settingslib_materialColorPrimary</item>
- <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
- <item name="android:textColor">@color/settingslib_materialColorOnPrimary</item>
- <item name="android:textSize">14sp</item>
- <item name="iconGravity">textStart</item>
- <item name="iconTint">@color/settingslib_materialColorOnPrimary</item>
- <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Filled.Large">
- <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
- <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
- <item name="android:textSize">16sp</item>
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Filled.Extra"
- parent="@style/SettingsLibButtonStyle.Expressive.Filled.Large">
- <item name="android:layout_width">match_parent</item>
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Tonal"
- parent="@style/Widget.Material3.Button.TonalButton">
- <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:gravity">center</item>
- <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
- <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
- <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
- <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
- <item name="android:backgroundTint">@color/settingslib_materialColorSecondaryContainer</item>
- <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
- <item name="android:textColor">@color/settingslib_materialColorOnSecondaryContainer</item>
- <item name="android:textSize">14sp</item>
- <item name="iconGravity">textStart</item>
- <item name="iconTint">@color/settingslib_materialColorOnSecondaryContainer</item>
- <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Tonal.Large">
- <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
- <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
- <item name="android:textSize">16sp</item>
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Tonal.Extra"
- parent="@style/SettingsLibButtonStyle.Expressive.Tonal.Large">
- <item name="android:layout_width">match_parent</item>
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Outline"
- parent="@style/Widget.Material3.Button.OutlinedButton.Icon">
- <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:gravity">center</item>
- <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
- <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
- <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
- <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
- <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
- <item name="android:textColor">@color/settingslib_materialColorPrimary</item>
- <item name="android:textSize">14sp</item>
- <item name="iconTint">@color/settingslib_materialColorPrimary</item>
- <item name="iconGravity">textStart</item>
- <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
- <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item>
- <item name="strokeColor">@color/settingslib_materialColorOutlineVariant</item>
-
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Outline.Large">
- <item name="android:paddingVertical">@dimen/settingslib_expressive_space_small1</item>
- <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small4</item>
- <item name="android:textSize">16sp</item>
- </style>
-
- <style name="SettingsLibButtonStyle.Expressive.Outline.Extra"
- parent="@style/SettingsLibButtonStyle.Expressive.Outline.Large">
- <item name="android:layout_width">match_parent</item>
- </style>
-
- <style name="SettingslibTextButtonStyle.Expressive"
- parent="@style/Widget.Material3.Button.TextButton.Icon">
- <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
- <item name="android:textSize">16sp</item>
- <item name="android:textColor">@color/settingslib_materialColorOnSurface</item>
- <item name="iconTint">@null</item>
- <item name="iconPadding">@dimen/settingslib_expressive_space_extrasmall4</item>
- <item name="rippleColor">?android:attr/colorControlHighlight</item>
- </style>
-
<style name="EntityHeader">
<item name="android:paddingTop">@dimen/settingslib_expressive_space_small4</item>
<item name="android:paddingBottom">@dimen/settingslib_expressive_space_small1</item>
@@ -327,12 +67,11 @@
<item name="android:gravity">center</item>
<item name="android:ellipsize">marquee</item>
<item name="android:textDirection">locale</item>
- <item name="android:textAppearance">@style/TextAppearance.EntityHeaderTitle</item>
+ <item name="android:textAppearance">@style/TextAppearance.SettingsLib.TitleLarge.Emphasized</item>
</style>
<style name="SettingslibTextAppearance.LinkableTextStyle.Expressive"
- parent="@android:style/TextAppearance.DeviceDefault.WindowTitle">
- <item name="android:textSize">14sp</item>
+ parent="@style/TextAppearance.SettingsLib.LabelLarge">
<item name="android:textColor">?android:attr/colorAccent</item>
</style>
@@ -346,4 +85,14 @@
<item name="cardElevation">0dp</item>
<item name="rippleColor">?android:attr/colorControlHighlight</item>
</style>
+
+ <style name="TextAppearance.SettingsLib.PreferenceTitle"
+ parent="@style/TextAppearance.SettingsLib.TitleMedium">
+ <item name="android:textColor">@color/settingslib_text_color_primary</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.PreferenceSummary"
+ parent="@style/TextAppearance.SettingsLib.BodyMedium">
+ <item name="android:textColor">@color/settingslib_text_color_secondary</item>
+ </style>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml
index fea8739ab37d..14f214a96435 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml
@@ -18,8 +18,8 @@
<resources>
<style name="Theme.SettingsBase.Expressive">
<!-- Set up Preference title text style -->
- <!--item name="android:textAppearanceListItem">@style/TextAppearance.PreferenceTitle.SettingsLib</item-->
- <!--item name="android:textAppearanceListItemSecondary">@style/textAppearanceListItemSecondary</item-->
+ <item name="android:textAppearanceListItem">@style/TextAppearance.SettingsLib.PreferenceTitle</item>
+ <item name="android:textAppearanceListItemSecondary">@style/TextAppearance.SettingsLib.PreferenceSummary</item>
<!-- Set up list item padding -->
<item name="android:listPreferredItemPaddingStart">@dimen/settingslib_expressive_space_small1</item>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/attrs_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values/attrs_expressive.xml
index 857dd7953234..857dd7953234 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/attrs_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/attrs_expressive.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values/colors.xml b/packages/SettingsLib/SettingsTheme/res/values/colors.xml
new file mode 100644
index 000000000000..c5c613b4b329
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values/colors.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <color name="settingslib_error_0">#FFFFFF</color>
+ <color name="settingslib_error_10">#FFFBFF</color>
+ <color name="settingslib_error_50">#FFEDEA</color>
+ <color name="settingslib_error_100">#FFDAD6</color>
+ <color name="settingslib_error_200">#FFB4AB</color>
+ <color name="settingslib_error_300">#FF897D</color>
+ <color name="settingslib_error_400">#FF5449</color>
+ <color name="settingslib_error_500">#DE3730</color>
+ <color name="settingslib_error_600">#BA1A1A</color>
+ <color name="settingslib_error_700">#93000A</color>
+ <color name="settingslib_error_800">#690005</color>
+ <color name="settingslib_error_900">#410002</color>
+ <color name="settingslib_error_1000">#000000</color>
+
+ <color name="settingslib_materialColorPrimary">#006B5F</color>
+ <color name="settingslib_materialColorOnPrimary">#FFFFFF</color>
+ <color name="settingslib_materialColorPrimaryContainer">#C5EAE2</color>
+ <color name="settingslib_materialColorOnPrimaryContainer">#00201C</color>
+ <color name="settingslib_materialColorPrimaryInverse">#83D6C7</color>
+ <color name="settingslib_materialColorPrimaryFixed">#C5EAE2</color>
+ <color name="settingslib_materialColorPrimaryFixedDim">#82D5C6</color>
+ <color name="settingslib_materialColorOnPrimaryFixed">#00201C</color>
+ <color name="settingslib_materialColorOnPrimaryFixedVariant">#005047</color>
+ <color name="settingslib_materialColorSecondary">#4A635E</color>
+ <color name="settingslib_materialColorOnSecondary">#FFFFFF</color>
+ <color name="settingslib_materialColorSecondaryContainer">#CCE8E2</color>
+ <color name="settingslib_materialColorOnSecondaryContainer">#051F1B</color>
+ <color name="settingslib_materialColorSecondaryFixed">#CCE8E2</color>
+ <color name="settingslib_materialColorSecondaryFixedDim">#B1CCC6</color>
+ <color name="settingslib_materialColorOnSecondaryFixed">#051F1B</color>
+ <color name="settingslib_materialColorOnSecondaryFixedVariant">#334C47</color>
+ <color name="settingslib_materialColorTertiary">#456179</color>
+ <color name="settingslib_materialColorOnTertiary">#FFFFFF</color>
+ <color name="settingslib_materialColorTertiaryContainer">#CBE6FF</color>
+ <color name="settingslib_materialColorOnTertiaryContainer">#001E31</color>
+ <color name="settingslib_materialColorTertiaryFixed">#CBE5FF</color>
+ <color name="settingslib_materialColorTertiaryFixedDim">#ADCAE5</color>
+ <color name="settingslib_materialColorOnTertiaryFixed">#001E31</color>
+ <color name="settingslib_materialColorOnTertiaryFixedVariant">#2D4A60</color>
+ <color name="settingslib_materialColorError">#B3261E</color>
+ <color name="settingslib_materialColorOnError">#FFFFFF</color>
+ <color name="settingslib_materialColorErrorContainer">#F9DEDC</color>
+ <color name="settingslib_materialColorOnErrorContainer">#3A0A08</color>
+ <color name="settingslib_materialColorOutline">#777777</color>
+ <color name="settingslib_materialColorOutlineVariant">#C7C6C5</color>
+ <color name="settingslib_materialColorBackground">#F9FAF8</color>
+ <color name="settingslib_materialColorOnBackground">#1B1B1B</color>
+ <color name="settingslib_materialColorSurface">#F9FAF8</color>
+ <color name="settingslib_materialColorOnSurface">#1B1B1B</color>
+ <color name="settingslib_materialColorSurfaceVariant">#E3E3E3</color>
+ <color name="settingslib_materialColorOnSurfaceVariant">#474747</color>
+ <color name="settingslib_materialColorSurfaceInverse">#303030</color>
+ <color name="settingslib_materialColorOnSurfaceInverse">#F1F1F1</color>
+ <color name="settingslib_materialColorSurfaceBright">#F9FAF8</color>
+ <color name="settingslib_materialColorSurfaceDim">#DADADA</color>
+ <color name="settingslib_materialColorSurfaceContainer">#EEEEEE</color>
+ <color name="settingslib_materialColorSurfaceContainerLow">#F4F4F4</color>
+ <color name="settingslib_materialColorSurfaceContainerLowest">#FFFFFF</color>
+ <color name="settingslib_materialColorSurfaceContainerHigh">#E8E8E8</color>
+ <color name="settingslib_materialColorSurfaceContainerHighest">#E3E3E3</color>
+</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values/config.xml b/packages/SettingsLib/SettingsTheme/res/values/config.xml
index e73dcc0cc559..53da49180219 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/config.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/config.xml
@@ -16,4 +16,7 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<bool name="settingslib_config_icon_space_reserved">true</bool>
+
+ <!-- Name of a font family to use for headlines in SettingsLib. -->
+ <string name="settingslib_config_headlineFontFamily" translatable="false"></string>
</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values/dimens_expressive.xml
index 0542c510fa63..0542c510fa63 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/dimens_expressive.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml
new file mode 100644
index 000000000000..f73e100906c8
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <style name="TextAppearance.SettingsLib.DisplayLarge"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item>
+ <item name="android:textSize">57sp</item>
+ <item name="android:letterSpacing">-0.00438596</item>
+ <item name="android:lineHeight" tools:targetApi="28">64sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.DisplayMedium"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item>
+ <item name="android:textSize">45sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">52sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.DisplaySmall"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item>
+ <item name="android:textSize">36sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">44sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.HeadlineLarge"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item>
+ <item name="android:textSize">32sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">40sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.HeadlineMedium"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item>
+ <item name="android:textSize">28sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">36sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.HeadlineSmall"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item>
+ <item name="android:textSize">24sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">32sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.TitleLarge"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item>
+ <item name="android:textSize">22sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">28sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.TitleMedium"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">16sp</item>
+ <item name="android:letterSpacing">0.009375</item>
+ <item name="android:lineHeight" tools:targetApi="28">24sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.TitleSmall"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.00714286</item>
+ <item name="android:lineHeight" tools:targetApi="28">20sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.LabelLarge"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.00714286</item>
+ <item name="android:lineHeight" tools:targetApi="28">20sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.LabelMedium"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">12sp</item>
+ <item name="android:letterSpacing">0.04166667</item>
+ <item name="android:lineHeight" tools:targetApi="28">16sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.LabelSmall"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">11sp</item>
+ <item name="android:letterSpacing">0.04545455</item>
+ <item name="android:lineHeight" tools:targetApi="28">16sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.BodyLarge"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textSize">16sp</item>
+ <item name="android:letterSpacing">0.03125</item>
+ <item name="android:lineHeight" tools:targetApi="28">24sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.BodyMedium"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.01785714</item>
+ <item name="android:lineHeight" tools:targetApi="28">20sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.BodySmall"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textSize">12sp</item>
+ <item name="android:letterSpacing">0.03333333</item>
+ <item name="android:lineHeight" tools:targetApi="28">16sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.DisplayLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">57sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">64sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.DisplayMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">45sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">52sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.DisplaySmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">36sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">44sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.HeadlineLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">32sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">40sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.HeadlineMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">28sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">36sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.HeadlineSmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">24sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">32sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.TitleLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:textSize">22sp</item>
+ <item name="android:letterSpacing">0</item>
+ <item name="android:lineHeight" tools:targetApi="28">28sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.TitleMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">16sp</item>
+ <item name="android:letterSpacing">0.009375</item>
+ <item name="android:lineHeight" tools:targetApi="28">24sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.TitleSmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.00714286</item>
+ <item name="android:lineHeight" tools:targetApi="28">20sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.LabelLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.00714286</item>
+ <item name="android:lineHeight" tools:targetApi="28">20sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.LabelMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">12sp</item>
+ <item name="android:letterSpacing">0.04166667</item>
+ <item name="android:lineHeight" tools:targetApi="28">16sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.LabelSmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">11sp</item>
+ <item name="android:letterSpacing">0.04545455</item>
+ <item name="android:lineHeight" tools:targetApi="28">16sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+
+ <style name="TextAppearance.SettingsLib.BodyLarge.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textStyle">normal</item>
+ <item name="android:textSize">16sp</item>
+ <item name="android:letterSpacing">0.009375</item>
+ <item name="android:lineHeight" tools:targetApi="28">24sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.BodyMedium.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textStyle">normal</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:letterSpacing">0.01785714</item>
+ <item name="android:lineHeight" tools:targetApi="28">20sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+ <style name="TextAppearance.SettingsLib.BodySmall.Emphasized"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textStyle">normal</item>
+ <item name="android:textSize">12sp</item>
+ <item name="android:letterSpacing">0.03333333</item>
+ <item name="android:lineHeight" tools:targetApi="28">16sp</item>
+ <item name="android:textAllCaps">false</item>
+ </style>
+</resources> \ No newline at end of file
diff --git a/packages/SettingsLib/Spa/build.gradle.kts b/packages/SettingsLib/Spa/build.gradle.kts
index 02e190417853..cf695d0543c7 100644
--- a/packages/SettingsLib/Spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/build.gradle.kts
@@ -14,14 +14,13 @@
* limitations under the License.
*/
-import com.android.build.api.dsl.CommonExtension
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.api.AndroidBasePlugin
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
+ alias(libs.plugins.compose.compiler) apply false
alias(libs.plugins.kotlin.android) apply false
}
@@ -51,23 +50,4 @@ subprojects {
}
}
}
-
- afterEvaluate {
- plugins.withType<AndroidBasePlugin> {
- the(CommonExtension::class).apply {
- if (buildFeatures.compose == true) {
- composeOptions {
- kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get()
- }
- }
- }
- }
- }
-
- tasks.withType<KotlinCompile> {
- kotlinOptions {
- jvmTarget = libs.versions.jvm.get()
- freeCompilerArgs = listOf("-Xjvm-default=all")
- }
- }
}
diff --git a/packages/SettingsLib/Spa/gallery/build.gradle.kts b/packages/SettingsLib/Spa/gallery/build.gradle.kts
index a1151a5e827e..19aa710babd3 100644
--- a/packages/SettingsLib/Spa/gallery/build.gradle.kts
+++ b/packages/SettingsLib/Spa/gallery/build.gradle.kts
@@ -16,6 +16,7 @@
plugins {
alias(libs.plugins.android.application)
+ alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlin.android)
}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt
index f7649b91f558..17f996567ce7 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt
@@ -20,11 +20,13 @@ import android.os.Bundle
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.DisabledByDefault
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.IntState
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
+import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
@@ -33,8 +35,11 @@ import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.R
+import com.android.settingslib.spa.widget.preference.ListPreferenceModel
+import com.android.settingslib.spa.widget.preference.ListPreferenceOption
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.preference.RadioPreferences
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
import com.android.settingslib.spa.widget.ui.Category
import com.android.settingslib.spa.widget.ui.SettingsIcon
@@ -103,6 +108,22 @@ object PreferencePageProvider : SettingsPageProvider {
override val summary = { ticks.toString() }
})
}
+ val selectedId = rememberSaveable { mutableIntStateOf(0) }
+ RadioPreferences(
+ object : ListPreferenceModel {
+ override val title: String = "RadioPreferences"
+ override val options: List<ListPreferenceOption> =
+ listOf(
+ ListPreferenceOption(id = 0, text = "option1"),
+ ListPreferenceOption(id = 1, text = "option2"),
+ ListPreferenceOption(id = 2, text = "option3"),
+ )
+ override val selectedId: IntState = selectedId
+ override val onIdSelected: (Int) -> Unit = {
+ selectedId.intValue = it
+ }
+ }
+ )
}
}
diff --git a/packages/SettingsLib/Spa/gradle/libs.versions.toml b/packages/SettingsLib/Spa/gradle/libs.versions.toml
index 74811d3ae7a6..04ef96a89843 100644
--- a/packages/SettingsLib/Spa/gradle/libs.versions.toml
+++ b/packages/SettingsLib/Spa/gradle/libs.versions.toml
@@ -15,12 +15,11 @@
#
[versions]
-agp = "8.7.2"
-compose-compiler = "1.5.11"
+agp = "8.7.3"
dexmaker-mockito = "2.28.3"
jvm = "17"
-kotlin = "1.9.23"
-truth = "1.1.5"
+kotlin = "2.0.21"
+truth = "1.4.4"
[libraries]
dexmaker-mockito = { module = "com.linkedin.dexmaker:dexmaker-mockito", version.ref = "dexmaker-mockito" }
@@ -29,4 +28,5 @@ truth = { module = "com.google.truth:truth", version.ref = "truth" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" }
+compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
diff --git a/packages/SettingsLib/Spa/spa/build.gradle.kts b/packages/SettingsLib/Spa/spa/build.gradle.kts
index 1f32ad6622a2..a0bbb0ca9ae6 100644
--- a/packages/SettingsLib/Spa/spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/spa/build.gradle.kts
@@ -16,6 +16,7 @@
plugins {
alias(libs.plugins.android.library)
+ alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlin.android)
jacoco
}
@@ -41,9 +42,6 @@ android {
manifest.srcFile("../tests/AndroidManifest.xml")
}
}
- buildFeatures {
- compose = true
- }
buildTypes {
getByName("debug") {
enableAndroidTestCoverage = true
@@ -63,7 +61,7 @@ dependencies {
api("androidx.lifecycle:lifecycle-runtime-compose")
api("androidx.navigation:navigation-compose:2.9.0-alpha03")
api("com.github.PhilJay:MPAndroidChart:v3.1.0-alpha")
- api("com.google.android.material:material:1.12.0")
+ api("com.google.android.material:material:1.13.0-alpha08")
debugApi("androidx.compose.ui:ui-tooling:$jetpackComposeVersion")
implementation("com.airbnb.android:lottie-compose:6.4.0")
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt
index 8300ce855988..ec94df057b77 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/RadioPreferences.kt
@@ -16,28 +16,34 @@
package com.android.settingslib.spa.widget.preference
-import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.selection.selectableGroup
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.RadioButton
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.IntState
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.tooling.preview.Preview
+import com.android.settingslib.spa.framework.compose.thenIf
import com.android.settingslib.spa.framework.theme.SettingsDimension
-import com.android.settingslib.spa.widget.ui.CategoryTitle
+import com.android.settingslib.spa.framework.theme.isSpaExpressiveEnabled
+import com.android.settingslib.spa.widget.ui.Category
import com.android.settingslib.spa.widget.ui.SettingsListItem
@Composable
fun RadioPreferences(model: ListPreferenceModel) {
- CategoryTitle(title = model.title)
- Spacer(modifier = Modifier.width(SettingsDimension.itemDividerHeight))
- Column(modifier = Modifier.selectableGroup()) {
+ Category(modifier = Modifier.selectableGroup(), title = model.title) {
for (option in model.options) {
Radio2(option, model.selectedId.intValue, model.enabled()) {
model.onIdSelected(it)
@@ -54,20 +60,52 @@ fun Radio2(
onIdSelected: (id: Int) -> Unit,
) {
val selected = option.id == selectedId
+ val surfaceBright = MaterialTheme.colorScheme.surfaceBright
Row(
- modifier = Modifier
- .fillMaxWidth()
- .selectable(
- selected = selected,
- enabled = enabled,
- onClick = { onIdSelected(option.id) },
- role = Role.RadioButton,
- )
- .padding(SettingsDimension.dialogItemPadding),
+ modifier =
+ Modifier.fillMaxWidth()
+ .thenIf(isSpaExpressiveEnabled) {
+ Modifier.heightIn(min = SettingsDimension.preferenceMinHeight)
+ .background(surfaceBright)
+ }
+ .selectable(
+ selected = selected,
+ enabled = enabled,
+ onClick = { onIdSelected(option.id) },
+ role = Role.RadioButton,
+ )
+ .then(
+ if (isSpaExpressiveEnabled) Modifier.padding(SettingsDimension.itemPadding)
+ else Modifier.padding(SettingsDimension.dialogItemPadding)
+ ),
verticalAlignment = Alignment.CenterVertically,
) {
RadioButton(selected = selected, onClick = null, enabled = enabled)
- Spacer(modifier = Modifier.width(SettingsDimension.itemDividerHeight))
+ Spacer(
+ modifier =
+ Modifier.width(
+ if (isSpaExpressiveEnabled) SettingsDimension.paddingExtraSmall6
+ else SettingsDimension.itemDividerHeight
+ )
+ )
SettingsListItem(text = option.text, enabled = enabled)
}
-} \ No newline at end of file
+}
+
+@Preview
+@Composable
+private fun RadioPreferencePreview() {
+ RadioPreferences(
+ object : ListPreferenceModel {
+ override val title: String = "Title"
+ override val options: List<ListPreferenceOption> =
+ listOf(
+ ListPreferenceOption(id = 0, text = "option1"),
+ ListPreferenceOption(id = 1, text = "option2"),
+ ListPreferenceOption(id = 2, text = "option3"),
+ )
+ override val selectedId: IntState = remember { mutableIntStateOf(0) }
+ override val onIdSelected: (Int) -> Unit = {}
+ }
+ )
+}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt
index 96d2abb70391..62bc00a8b347 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Category.kt
@@ -76,7 +76,7 @@ fun CategoryTitle(title: String) {
* visually separates groups of items.
*/
@Composable
-fun Category(title: String? = null, content: @Composable ColumnScope.() -> Unit) {
+fun Category(title: String? = null, modifier: Modifier = Modifier, content: @Composable ColumnScope.() -> Unit) {
var displayTitle by remember { mutableStateOf(false) }
Column(
modifier =
@@ -90,7 +90,7 @@ fun Category(title: String? = null, content: @Composable ColumnScope.() -> Unit)
if (title != null && displayTitle) CategoryTitle(title = title)
Column(
modifier =
- Modifier.onGloballyPositioned { coordinates ->
+ modifier.onGloballyPositioned { coordinates ->
displayTitle = coordinates.size.height > 0
}
.then(
@@ -162,7 +162,7 @@ internal val LocalIsInCategory = compositionLocalOf { false }
@Composable
private fun CategoryPreview() {
SettingsTheme {
- Category("Appearance") {
+ Category(title = "Appearance") {
Preference(
object : PreferenceModel {
override val title = "Title"
diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt
index 2f98b02b8dd5..d187017f5021 100644
--- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt
+++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/RadioPreferencesTest.kt
@@ -43,7 +43,9 @@ class RadioPreferencesTest {
RadioPreferences(remember {
object : ListPreferenceModel {
override val title = TITLE
- override val options = emptyList<ListPreferenceOption>()
+ override val options = listOf(
+ ListPreferenceOption(id = 1, text = "A")
+ )
override val selectedId = mutableIntStateOf(0)
override val onIdSelected: (Int) -> Unit = {}
}
diff --git a/packages/SettingsLib/Spa/testutils/build.gradle.kts b/packages/SettingsLib/Spa/testutils/build.gradle.kts
index cce82354a51f..7dbd320c7d5a 100644
--- a/packages/SettingsLib/Spa/testutils/build.gradle.kts
+++ b/packages/SettingsLib/Spa/testutils/build.gradle.kts
@@ -16,6 +16,7 @@
plugins {
alias(libs.plugins.android.library)
+ alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlin.android)
}
@@ -30,9 +31,6 @@ android {
manifest.srcFile("AndroidManifest.xml")
}
}
- buildFeatures {
- compose = true
- }
}
dependencies {
diff --git a/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml b/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml
index 9a3e5b9e1e50..083b862e8a5c 100644
--- a/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml
+++ b/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml
@@ -72,7 +72,7 @@
android:layout_height="wrap_content"
android:hyphenationFrequency="normalFast"
android:lineBreakWordStyle="phrase"
- android:textAppearance="@style/SettingsLibTextAppearance.Emphasized.Title.Large"/>
+ android:textAppearance="@style/TextAppearance.SettingsLib.TitleLarge.Emphasized"/>
<TextView
android:id="@android:id/summary"
@@ -81,7 +81,7 @@
android:hyphenationFrequency="normalFast"
android:lineBreakWordStyle="phrase"
android:maxLines="3"
- android:textAppearance="@style/SettingsLibTextAppearance.Primary.Body.Medium"/>
+ android:textAppearance="@style/TextAppearance.SettingsLib.BodyMedium"/>
</LinearLayout>
</LinearLayout>
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/AmbientVolumeController.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/AmbientVolumeController.java
new file mode 100644
index 000000000000..7f0c1263570e
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/AmbientVolumeController.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.bluetooth;
+
+import static android.bluetooth.AudioInputControl.MUTE_DISABLED;
+import static android.bluetooth.AudioInputControl.MUTE_MUTED;
+import static android.bluetooth.AudioInputControl.MUTE_NOT_MUTED;
+
+import static com.android.settingslib.bluetooth.HearingDeviceLocalDataManager.Data.INVALID_VOLUME;
+
+import android.bluetooth.AudioInputControl;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+/**
+ * AmbientVolumeController manages the {@link AudioInputControl}s of
+ * {@link AudioInputControl#AUDIO_INPUT_TYPE_AMBIENT} on the remote device.
+ */
+public class AmbientVolumeController implements LocalBluetoothProfileManager.ServiceListener {
+
+ private static final boolean DEBUG = true;
+ private static final String TAG = "AmbientController";
+
+ private final LocalBluetoothProfileManager mProfileManager;
+ private final VolumeControlProfile mVolumeControlProfile;
+ private final Map<BluetoothDevice, List<AudioInputControl>> mDeviceAmbientControlsMap =
+ new ArrayMap<>();
+ private final Map<BluetoothDevice, AmbientCallback> mDeviceCallbackMap = new ArrayMap<>();
+ final Map<BluetoothDevice, RemoteAmbientState> mDeviceAmbientStateMap =
+ new ArrayMap<>();
+ @Nullable
+ private final AmbientVolumeControlCallback mCallback;
+
+ public AmbientVolumeController(
+ @NonNull LocalBluetoothProfileManager profileManager,
+ @Nullable AmbientVolumeControlCallback callback) {
+ mProfileManager = profileManager;
+ mVolumeControlProfile = profileManager.getVolumeControlProfile();
+ if (mVolumeControlProfile != null && !mVolumeControlProfile.isProfileReady()) {
+ mProfileManager.addServiceListener(this);
+ }
+ mCallback = callback;
+ }
+
+ @Override
+ public void onServiceConnected() {
+ if (mVolumeControlProfile != null && mVolumeControlProfile.isProfileReady()) {
+ mProfileManager.removeServiceListener(this);
+ if (mCallback != null) {
+ mCallback.onVolumeControlServiceConnected();
+ }
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected() {
+ // Do nothing
+ }
+
+ /**
+ * Registers the same {@link AmbientCallback} on all ambient control points of the remote
+ * device. The {@link AmbientCallback} will pass the event to registered
+ * {@link AmbientVolumeControlCallback} if exists.
+ *
+ * @param executor the executor to run the callback
+ * @param device the remote device
+ */
+ public void registerCallback(@NonNull Executor executor, @NonNull BluetoothDevice device) {
+ AmbientCallback ambientCallback = new AmbientCallback(device, mCallback);
+ synchronized (mDeviceCallbackMap) {
+ mDeviceCallbackMap.put(device, ambientCallback);
+ }
+
+ // register callback on all ambient input control points of this device
+ List<AudioInputControl> controls = getAmbientControls(device);
+ controls.forEach((control) -> {
+ try {
+ control.registerCallback(executor, ambientCallback);
+ } catch (IllegalArgumentException e) {
+ // The callback was already registered
+ Log.i(TAG, "Skip registering the callback, " + e.getMessage());
+ }
+ });
+ }
+
+ /**
+ * Unregisters the {@link AmbientCallback} on all ambient control points of the remote
+ * device which is previously registered with {@link #registerCallback}.
+ *
+ * @param device the remote device
+ */
+ public void unregisterCallback(@NonNull BluetoothDevice device) {
+ AmbientCallback ambientCallback;
+ synchronized (mDeviceCallbackMap) {
+ ambientCallback = mDeviceCallbackMap.remove(device);
+ }
+ if (ambientCallback == null) {
+ // callback not found, no need to unregister
+ return;
+ }
+
+ // unregister callback on all ambient input control points of this device
+ List<AudioInputControl> controls = getAmbientControls(device);
+ controls.forEach(control -> {
+ try {
+ control.unregisterCallback(ambientCallback);
+ } catch (IllegalArgumentException e) {
+ // The callback was never registered or was already unregistered
+ Log.i(TAG, "Skip unregistering the callback, " + e.getMessage());
+ }
+ });
+ }
+
+ /**
+ * Gets the gain setting max value from first ambient control point of the remote device.
+ *
+ * @param device the remote device
+ */
+ public int getAmbientMax(@NonNull BluetoothDevice device) {
+ List<AudioInputControl> ambientControls = getAmbientControls(device);
+ int value = INVALID_VOLUME;
+ if (!ambientControls.isEmpty()) {
+ value = ambientControls.getFirst().getGainSettingMax();
+ }
+ return value;
+ }
+
+ /**
+ * Gets the gain setting min value from first ambient control point of the remote device.
+ *
+ * @param device the remote device
+ */
+ public int getAmbientMin(@NonNull BluetoothDevice device) {
+ List<AudioInputControl> ambientControls = getAmbientControls(device);
+ int value = INVALID_VOLUME;
+ if (!ambientControls.isEmpty()) {
+ value = ambientControls.getFirst().getGainSettingMin();
+ }
+ return value;
+ }
+
+ /**
+ * Gets the latest values in {@link RemoteAmbientState}.
+ *
+ * @param device the remote device
+ * @return the {@link RemoteAmbientState} represents current remote ambient control point state
+ */
+ @Nullable
+ public RemoteAmbientState refreshAmbientState(@Nullable BluetoothDevice device) {
+ if (device == null || !device.isConnected()) {
+ return null;
+ }
+ int gainSetting = getAmbient(device);
+ int mute = getMute(device);
+ return new RemoteAmbientState(gainSetting, mute);
+ }
+
+ /**
+ * Gets the gain setting value from first ambient control point of the remote device and
+ * stores it in cached {@link RemoteAmbientState}.
+ *
+ * When any audio input point receives {@link AmbientCallback#onGainSettingChanged(int)}
+ * callback, only the changed value which is different from the value stored in the cached
+ * state will be notified to the {@link AmbientVolumeControlCallback} of this controller.
+ *
+ * @param device the remote device
+ */
+ public int getAmbient(@NonNull BluetoothDevice device) {
+ List<AudioInputControl> ambientControls = getAmbientControls(device);
+ int value = INVALID_VOLUME;
+ if (!ambientControls.isEmpty()) {
+ synchronized (mDeviceAmbientStateMap) {
+ value = ambientControls.getFirst().getGainSetting();
+ RemoteAmbientState state = mDeviceAmbientStateMap.getOrDefault(device,
+ new RemoteAmbientState(INVALID_VOLUME, MUTE_DISABLED));
+ RemoteAmbientState updatedState = new RemoteAmbientState(value, state.mute);
+ mDeviceAmbientStateMap.put(device, updatedState);
+ }
+ }
+ return value;
+ }
+
+ /**
+ * Sets the gain setting value to all ambient control points of the remote device.
+ *
+ * @param device the remote device
+ * @param value the gain setting value to be updated
+ */
+ public void setAmbient(@NonNull BluetoothDevice device, int value) {
+ if (DEBUG) {
+ Log.d(TAG, "setAmbient, value:" + value + ", device:" + device);
+ }
+ List<AudioInputControl> ambientControls = getAmbientControls(device);
+ ambientControls.forEach(control -> control.setGainSetting(value));
+ }
+
+ /**
+ * Gets the mute state from first ambient control point of the remote device and
+ * stores it in cached {@link RemoteAmbientState}. The value will be one of
+ * {@link AudioInputControl.Mute}.
+ *
+ * When any audio input point receives {@link AmbientCallback#onMuteChanged(int)} callback,
+ * only the changed value which is different from the value stored in the cached state will
+ * be notified to the {@link AmbientVolumeControlCallback} of this controller.
+ *
+ * @param device the remote device
+ */
+ public int getMute(@NonNull BluetoothDevice device) {
+ List<AudioInputControl> ambientControls = getAmbientControls(device);
+ int value = MUTE_DISABLED;
+ if (!ambientControls.isEmpty()) {
+ synchronized (mDeviceAmbientStateMap) {
+ value = ambientControls.getFirst().getMute();
+ RemoteAmbientState state = mDeviceAmbientStateMap.getOrDefault(device,
+ new RemoteAmbientState(INVALID_VOLUME, MUTE_DISABLED));
+ RemoteAmbientState updatedState = new RemoteAmbientState(state.gainSetting, value);
+ mDeviceAmbientStateMap.put(device, updatedState);
+ }
+ }
+ return value;
+ }
+
+ /**
+ * Sets the mute state to all ambient control points of the remote device.
+ *
+ * @param device the remote device
+ * @param muted the mute state to be updated
+ */
+ public void setMuted(@NonNull BluetoothDevice device, boolean muted) {
+ if (DEBUG) {
+ Log.d(TAG, "setMuted, muted:" + muted + ", device:" + device);
+ }
+ List<AudioInputControl> ambientControls = getAmbientControls(device);
+ ambientControls.forEach(control -> {
+ try {
+ control.setMute(muted ? MUTE_MUTED : MUTE_NOT_MUTED);
+ } catch (IllegalStateException e) {
+ // Sometimes remote will throw this exception due to initialization not done
+ // yet. Catch it to prevent crashes on UI.
+ Log.w(TAG, "Remote mute state is currently disabled.");
+ }
+ });
+ }
+
+ /**
+ * Checks if there's any valid ambient control point exists on the remote device
+ *
+ * @param device the remote device
+ */
+ public boolean isAmbientControlAvailable(@NonNull BluetoothDevice device) {
+ final boolean hasAmbientControlPoint = !getAmbientControls(device).isEmpty();
+ final boolean connectedToVcp = mVolumeControlProfile.getConnectionStatus(device)
+ == BluetoothProfile.STATE_CONNECTED;
+ return hasAmbientControlPoint && connectedToVcp;
+ }
+
+ @NonNull
+ private List<AudioInputControl> getAmbientControls(@NonNull BluetoothDevice device) {
+ if (mVolumeControlProfile == null) {
+ return Collections.emptyList();
+ }
+ synchronized (mDeviceAmbientControlsMap) {
+ if (mDeviceAmbientControlsMap.containsKey(device)) {
+ return mDeviceAmbientControlsMap.get(device);
+ }
+ List<AudioInputControl> ambientControls =
+ mVolumeControlProfile.getAudioInputControlServices(device).stream().filter(
+ this::isValidAmbientControl).toList();
+ if (!ambientControls.isEmpty()) {
+ mDeviceAmbientControlsMap.put(device, ambientControls);
+ }
+ return ambientControls;
+ }
+ }
+
+ private boolean isValidAmbientControl(AudioInputControl control) {
+ boolean isAmbientControl =
+ control.getAudioInputType() == AudioInputControl.AUDIO_INPUT_TYPE_AMBIENT;
+ boolean isManual = control.getGainMode() == AudioInputControl.GAIN_MODE_MANUAL
+ || control.getGainMode() == AudioInputControl.GAIN_MODE_MANUAL_ONLY;
+ boolean isActive =
+ control.getAudioInputStatus() == AudioInputControl.AUDIO_INPUT_STATUS_ACTIVE;
+
+ return isAmbientControl && isManual && isActive;
+ }
+
+ /**
+ * Callback providing information about the status and received events of
+ * {@link AmbientVolumeController}.
+ */
+ public interface AmbientVolumeControlCallback {
+
+ /** This method is called when the Volume Control Service is connected */
+ default void onVolumeControlServiceConnected() {
+ }
+
+ /**
+ * This method is called when one of the remote device's ambient control point's gain
+ * settings value is changed.
+ *
+ * @param device the remote device
+ * @param gainSettings the new gain setting value
+ */
+ default void onAmbientChanged(@NonNull BluetoothDevice device, int gainSettings) {
+ }
+
+ /**
+ * This method is called when one of the remote device's ambient control point's mute
+ * state is changed.
+ *
+ * @param device the remote device
+ * @param mute the new mute state
+ */
+ default void onMuteChanged(@NonNull BluetoothDevice device, int mute) {
+ }
+
+ /**
+ * This method is called when any command to the remote device's ambient control point
+ * is failed.
+ *
+ * @param device the remote device.
+ */
+ default void onCommandFailed(@NonNull BluetoothDevice device) {
+ }
+ }
+
+ /**
+ * A wrapper callback that will pass {@link AudioInputControl.AudioInputCallback} with extra
+ * device information to {@link AmbientVolumeControlCallback}.
+ */
+ class AmbientCallback implements AudioInputControl.AudioInputCallback {
+
+ private final BluetoothDevice mDevice;
+ private final AmbientVolumeControlCallback mCallback;
+
+ AmbientCallback(@NonNull BluetoothDevice device,
+ @Nullable AmbientVolumeControlCallback callback) {
+ mDevice = device;
+ mCallback = callback;
+ }
+
+ @Override
+ public void onGainSettingChanged(int gainSetting) {
+ if (mCallback != null) {
+ synchronized (mDeviceAmbientStateMap) {
+ RemoteAmbientState previousState = mDeviceAmbientStateMap.get(mDevice);
+ if (previousState.gainSetting != gainSetting) {
+ mCallback.onAmbientChanged(mDevice, gainSetting);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onSetGainSettingFailed() {
+ Log.w(TAG, "onSetGainSettingFailed, device=" + mDevice);
+ if (mCallback != null) {
+ mCallback.onCommandFailed(mDevice);
+ }
+ }
+
+ @Override
+ public void onMuteChanged(int mute) {
+ if (mCallback != null) {
+ synchronized (mDeviceAmbientStateMap) {
+ RemoteAmbientState previousState = mDeviceAmbientStateMap.get(mDevice);
+ if (previousState.mute != mute) {
+ mCallback.onMuteChanged(mDevice, mute);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onSetMuteFailed() {
+ Log.w(TAG, "onSetMuteFailed, device=" + mDevice);
+ if (mCallback != null) {
+ mCallback.onCommandFailed(mDevice);
+ }
+ }
+ }
+
+ public record RemoteAmbientState(int gainSetting, int mute) {
+ public boolean isMutable() {
+ return mute != MUTE_DISABLED;
+ }
+ public boolean isMuted() {
+ return mute == MUTE_MUTED;
+ }
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index b58983ff1ce8..257c93505cfc 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -1591,6 +1591,12 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
private int getHearingDeviceSummaryRes(int leftBattery, int rightBattery,
boolean shortSummary) {
+ if (getDeviceSide() == HearingAidInfo.DeviceSide.SIDE_MONO
+ || getDeviceSide() == HearingAidInfo.DeviceSide.SIDE_LEFT_AND_RIGHT) {
+ return !shortSummary && (getBatteryLevel() > BluetoothDevice.BATTERY_LEVEL_UNKNOWN)
+ ? R.string.bluetooth_active_battery_level
+ : R.string.bluetooth_active_no_battery_level;
+ }
boolean isLeftDeviceConnected = getConnectedHearingAidSide(
HearingAidInfo.DeviceSide.SIDE_LEFT).isPresent();
boolean isRightDeviceConnected = getConnectedHearingAidSide(
@@ -1646,8 +1652,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
@HearingAidInfo.DeviceSide int side) {
return Stream.concat(Stream.of(this, mSubDevice), mMemberDevices.stream())
.filter(Objects::nonNull)
- .filter(device -> device.getDeviceSide() == side
- || device.getDeviceSide() == HearingAidInfo.DeviceSide.SIDE_LEFT_AND_RIGHT)
+ .filter(device -> device.getDeviceSide() == side)
.filter(device -> device.getDevice().isConnected())
// For hearing aids, we should expect only one device assign to one side, but if
// it happens, we don't care which one.
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
index 7fdb32cb63e9..b754706fb9a1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
@@ -153,7 +153,7 @@ public class CachedBluetoothDeviceManager {
/**
* Returns device summary of the pair of the hearing aid / CSIP passed as the parameter.
*
- * @param CachedBluetoothDevice device
+ * @param device the remote device
* @return Device summary, or if the pair does not exist or if it is not a hearing aid or
* a CSIP set member, then {@code null}.
*/
@@ -394,6 +394,7 @@ public class CachedBluetoothDeviceManager {
}
public synchronized void onDeviceUnpaired(CachedBluetoothDevice device) {
+ mHearingAidDeviceManager.clearLocalDataIfNeeded(device);
device.setGroupId(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
CachedBluetoothDevice mainDevice = mCsipDeviceManager.findMainDevice(device);
// Should iterate through the cloned set to avoid ConcurrentModificationException
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java
index fa28cf6c8a76..1ca4c2b39a70 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java
@@ -18,7 +18,6 @@ package com.android.settingslib.bluetooth;
import android.bluetooth.BluetoothCsipSetCoordinator;
import android.bluetooth.BluetoothHapClient;
import android.bluetooth.BluetoothHearingAid;
-import android.bluetooth.BluetoothLeAudio;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.le.ScanFilter;
@@ -308,6 +307,10 @@ public class HearingAidDeviceManager {
}
}
+ void clearLocalDataIfNeeded(CachedBluetoothDevice device) {
+ HearingDeviceLocalDataManager.clear(mContext, device.getDevice());
+ }
+
private void setAudioRoutingConfig(CachedBluetoothDevice device) {
AudioDeviceAttributes hearingDeviceAttributes =
mRoutingHelper.getMatchedHearingDeviceAttributes(device);
@@ -428,8 +431,7 @@ public class HearingAidDeviceManager {
p -> p instanceof HapClientProfile)) {
int audioLocation = leAudioProfile.getAudioLocation(cachedDevice.getDevice());
int hearingAidType = hapClientProfile.getHearingAidType(cachedDevice.getDevice());
- if (audioLocation != BluetoothLeAudio.AUDIO_LOCATION_INVALID
- && hearingAidType != HapClientProfile.HearingAidType.TYPE_INVALID) {
+ if (hearingAidType != HapClientProfile.HearingAidType.TYPE_INVALID) {
final HearingAidInfo info = new HearingAidInfo.Builder()
.setLeAudioLocation(audioLocation)
.setHapDeviceType(hearingAidType)
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java
index ef08c924b844..8399824f11e9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidInfo.java
@@ -34,6 +34,7 @@ public class HearingAidInfo {
DeviceSide.SIDE_LEFT,
DeviceSide.SIDE_RIGHT,
DeviceSide.SIDE_LEFT_AND_RIGHT,
+ DeviceSide.SIDE_MONO
})
/** Side definition for hearing aids. */
@@ -42,6 +43,7 @@ public class HearingAidInfo {
int SIDE_LEFT = 0;
int SIDE_RIGHT = 1;
int SIDE_LEFT_AND_RIGHT = 2;
+ int SIDE_MONO = 3;
}
@Retention(java.lang.annotation.RetentionPolicy.SOURCE)
@@ -124,6 +126,9 @@ public class HearingAidInfo {
@DeviceSide
private static int convertLeAudioLocationToInternalSide(int leAudioLocation) {
+ if (leAudioLocation == BluetoothLeAudio.AUDIO_LOCATION_MONO) {
+ return DeviceSide.SIDE_MONO;
+ }
boolean isLeft = (leAudioLocation & LE_AUDIO_LOCATION_LEFT) != 0;
boolean isRight = (leAudioLocation & LE_AUDIO_LOCATION_RIGHT) != 0;
if (isLeft && isRight) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java
index 7a64965334c9..6725558cd2bd 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManager.java
@@ -86,6 +86,17 @@ public class HearingDeviceLocalDataManager {
mSettingsObserver = new SettingsObserver(ThreadUtils.getUiThreadHandler());
}
+ /**
+ * Clears the local data of the device. This method should be called when the device is
+ * unpaired.
+ */
+ public static void clear(@NonNull Context context, @NonNull BluetoothDevice device) {
+ HearingDeviceLocalDataManager manager = new HearingDeviceLocalDataManager(context);
+ manager.getLocalDataFromSettings();
+ manager.remove(device);
+ manager.putAmbientVolumeSettings();
+ }
+
/** Starts the manager. Loads the data from Settings and start observing any changes. */
public synchronized void start() {
if (mIsStarted) {
@@ -141,6 +152,7 @@ public class HearingDeviceLocalDataManager {
* Puts the local data of the corresponding hearing device.
*
* @param device the device to update the local data
+ * @param data the local data to be stored
*/
private void put(BluetoothDevice device, Data data) {
if (device == null) {
@@ -148,7 +160,11 @@ public class HearingDeviceLocalDataManager {
}
synchronized (sLock) {
final String addr = device.getAnonymizedAddress();
- mAddrToDataMap.put(addr, data);
+ if (data == null) {
+ mAddrToDataMap.remove(addr);
+ } else {
+ mAddrToDataMap.put(addr, data);
+ }
if (mListener != null && mListenerExecutor != null) {
mListenerExecutor.execute(() -> mListener.onDeviceLocalDataChange(addr, data));
}
@@ -156,6 +172,24 @@ public class HearingDeviceLocalDataManager {
}
/**
+ * Removes the local data of the corresponding hearing device.
+ *
+ * @param device the device to remove the local data
+ */
+ private void remove(BluetoothDevice device) {
+ if (device == null) {
+ return;
+ }
+ synchronized (sLock) {
+ final String addr = device.getAnonymizedAddress();
+ mAddrToDataMap.remove(addr);
+ if (mListener != null && mListenerExecutor != null) {
+ mListenerExecutor.execute(() -> mListener.onDeviceLocalDataChange(addr, null));
+ }
+ }
+ }
+
+ /**
* Updates the ambient volume of the corresponding hearing device. This should be called after
* {@link #start()} is called().
*
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java
index a4c5a00dc53e..5bcdcc09206b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcastAssistant.java
@@ -32,7 +32,9 @@ import android.content.Context;
import android.os.Build;
import android.util.Log;
+import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import com.android.settingslib.R;
@@ -372,6 +374,27 @@ public class LocalBluetoothLeBroadcastAssistant implements LocalBluetoothProfile
}
/**
+ * Gets the {@link BluetoothLeBroadcastMetadata} of a specified source added to this sink.
+ *
+ * @param sink Broadcast Sink device
+ * @param sourceId Broadcast source id
+ * @return metadata {@link BluetoothLeBroadcastMetadata} associated with the specified source.
+ */
+ public @Nullable BluetoothLeBroadcastMetadata getSourceMetadata(
+ @NonNull BluetoothDevice sink, @IntRange(from = 0x00, to = 0xFF) int sourceId) {
+ if (mService == null) {
+ Log.d(TAG, "The BluetoothLeBroadcastAssistant is null");
+ return null;
+ }
+ try {
+ return mService.getSourceMetadata(sink, sourceId);
+ } catch (IllegalArgumentException | NoSuchMethodError e) {
+ Log.w(TAG, "Error calling getSourceMetadata()", e);
+ }
+ return null;
+ }
+
+ /**
* Register Broadcast Assistant Callbacks to track its state and receivers
*
* @param executor Executor object for callback
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java
index a03977c16f66..785bcbf5a91c 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java
@@ -21,15 +21,26 @@ import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NO
import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_REMOTE_INPUT;
import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
+import static android.security.advancedprotection.AdvancedProtectionManager.ADVANCED_PROTECTION_SYSTEM_ENTITY;
+
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.admin.Authority;
+import android.app.admin.DeviceAdminAuthority;
import android.app.admin.DevicePolicyManager;
+import android.app.admin.DpcAuthority;
+import android.app.admin.EnforcingAdmin;
+import android.app.admin.RoleAuthority;
+import android.app.admin.UnknownAuthority;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -37,8 +48,13 @@ import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
+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 org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -52,6 +68,8 @@ import java.util.Collections;
@RunWith(RobolectricTestRunner.class)
public class RestrictedLockUtilsTest {
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@Mock
private Context mContext;
@@ -66,6 +84,7 @@ public class RestrictedLockUtilsTest {
private final int mUserId = 194;
private final int mProfileId = 160;
+ private final String mPackage = "test.pkg";
private final ComponentName mAdmin1 = new ComponentName("admin1", "admin1class");
private final ComponentName mAdmin2 = new ComponentName("admin2", "admin2class");
@@ -85,6 +104,7 @@ public class RestrictedLockUtilsTest {
RestrictedLockUtilsInternal.sProxy = mProxy;
}
+ @RequiresFlagsDisabled(android.security.Flags.FLAG_AAPM_API)
@Test
public void checkIfRestrictionEnforced_deviceOwner()
throws PackageManager.NameNotFoundException {
@@ -109,6 +129,7 @@ public class RestrictedLockUtilsTest {
assertThat(enforcedAdmin.component).isEqualTo(mAdmin1);
}
+ @RequiresFlagsDisabled(android.security.Flags.FLAG_AAPM_API)
@Test
public void checkIfRestrictionEnforced_profileOwner()
throws PackageManager.NameNotFoundException {
@@ -133,6 +154,125 @@ public class RestrictedLockUtilsTest {
assertThat(enforcedAdmin.component).isEqualTo(mAdmin1);
}
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void checkIfRestrictionEnforced_getEnforcingAdminExists() {
+ UserManager.EnforcingUser enforcingUser = new UserManager.EnforcingUser(mUserId,
+ UserManager.RESTRICTION_SOURCE_PROFILE_OWNER);
+ final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS;
+ final EnforcingAdmin enforcingAdmin = new EnforcingAdmin(mPackage,
+ UnknownAuthority.UNKNOWN_AUTHORITY, UserHandle.of(mUserId), mAdmin1);
+
+ when(mUserManager.getUserRestrictionSources(userRestriction,
+ UserHandle.of(mUserId)))
+ .thenReturn(Collections.singletonList(enforcingUser));
+ when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction))
+ .thenReturn(enforcingAdmin);
+
+ EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
+ mContext, userRestriction, mUserId);
+
+ assertThat(enforcedAdmin).isNotNull();
+ assertThat(enforcedAdmin.enforcedRestriction).isEqualTo(userRestriction);
+ assertThat(enforcedAdmin.component).isEqualTo(enforcingAdmin.getComponentName());
+ assertThat(enforcedAdmin.user).isEqualTo(enforcingAdmin.getUserHandle());
+ }
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void checkIfRestrictionEnforced_getEnforcingAdminReturnsNull_deviceOwner()
+ throws PackageManager.NameNotFoundException {
+ UserManager.EnforcingUser enforcingUser = new UserManager.EnforcingUser(mUserId,
+ UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
+ final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS;
+
+ when(mUserManager.getUserRestrictionSources(userRestriction,
+ UserHandle.of(mUserId)))
+ .thenReturn(Collections.singletonList(enforcingUser));
+ when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction))
+ .thenReturn(null);
+ when(mContext.createPackageContextAsUser(any(), eq(0),
+ eq(UserHandle.of(mUserId))))
+ .thenReturn(mContext);
+
+ setUpDeviceOwner(mAdmin1, mUserId);
+
+ EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal
+ .checkIfRestrictionEnforced(mContext, userRestriction, mUserId);
+
+ assertThat(enforcedAdmin).isNotNull();
+ assertThat(enforcedAdmin.enforcedRestriction).isEqualTo(userRestriction);
+ assertThat(enforcedAdmin.component).isEqualTo(mAdmin1);
+ }
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void checkIfRestrictionEnforced_getEnforcingAdminReturnsNull_profileOwner()
+ throws PackageManager.NameNotFoundException {
+ UserManager.EnforcingUser enforcingUser = new UserManager.EnforcingUser(mUserId,
+ UserManager.RESTRICTION_SOURCE_PROFILE_OWNER);
+ final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS;
+
+ when(mUserManager.getUserRestrictionSources(userRestriction,
+ UserHandle.of(mUserId)))
+ .thenReturn(Collections.singletonList(enforcingUser));
+ when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction))
+ .thenReturn(null);
+ when(mContext.createPackageContextAsUser(any(), eq(0),
+ eq(UserHandle.of(mUserId))))
+ .thenReturn(mContext);
+
+ setUpProfileOwner(mAdmin1);
+
+ EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal
+ .checkIfRestrictionEnforced(mContext, userRestriction, mUserId);
+
+ assertThat(enforcedAdmin).isNotNull();
+ assertThat(enforcedAdmin.enforcedRestriction).isEqualTo(userRestriction);
+ assertThat(enforcedAdmin.component).isEqualTo(mAdmin1);
+ }
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void isPolicyEnforcedByAdvancedProtection_notEnforced_returnsFalse() {
+ final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS;
+ final Authority[] allNonAdvancedProtectionAuthorities = new Authority[] {
+ UnknownAuthority.UNKNOWN_AUTHORITY,
+ DeviceAdminAuthority.DEVICE_ADMIN_AUTHORITY,
+ DpcAuthority.DPC_AUTHORITY,
+ new RoleAuthority(Collections.singleton("some-role"))
+ };
+
+ for (Authority authority : allNonAdvancedProtectionAuthorities) {
+ final EnforcingAdmin enforcingAdmin = new EnforcingAdmin(mPackage, authority,
+ UserHandle.of(mUserId), mAdmin1);
+
+ when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction))
+ .thenReturn(enforcingAdmin);
+
+ assertWithMessage(authority + " is not an advanced protection authority")
+ .that(RestrictedLockUtilsInternal.isPolicyEnforcedByAdvancedProtection(
+ mContext, userRestriction, mUserId))
+ .isFalse();
+ }
+ }
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void isPolicyEnforcedByAdvancedProtection_enforced_returnsTrue() {
+ final Authority advancedProtectionAuthority = new UnknownAuthority(
+ ADVANCED_PROTECTION_SYSTEM_ENTITY);
+ final EnforcingAdmin advancedProtectionEnforcingAdmin = new EnforcingAdmin(mPackage,
+ advancedProtectionAuthority, UserHandle.of(mUserId), mAdmin1);
+ final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS;
+
+ when(mDevicePolicyManager.getEnforcingAdmin(mUserId, userRestriction))
+ .thenReturn(advancedProtectionEnforcingAdmin);
+
+ assertThat(RestrictedLockUtilsInternal.isPolicyEnforcedByAdvancedProtection(mContext,
+ userRestriction, mUserId)).isTrue();
+ }
+
@Test
public void checkIfDevicePolicyServiceDisabled_noEnforceAdminForManagedProfile() {
when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(null);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
index 7ad54e187ae5..dbbbd5bf8089 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
@@ -16,7 +16,10 @@
package com.android.settingslib;
+import static android.security.advancedprotection.AdvancedProtectionManager.ADVANCED_PROTECTION_SYSTEM_ENTITY;
+
import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -26,10 +29,23 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.admin.Authority;
+import android.app.admin.DeviceAdminAuthority;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyResourcesManager;
+import android.app.admin.DpcAuthority;
+import android.app.admin.EnforcingAdmin;
+import android.app.admin.RoleAuthority;
+import android.app.admin.UnknownAuthority;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.os.UserHandle;
+import android.os.UserManager;
+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.view.View;
import android.widget.TextView;
@@ -37,14 +53,19 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
+import java.util.Collections;
+
@RunWith(RobolectricTestRunner.class)
public class RestrictedPreferenceHelperTest {
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@Mock
private Context mContext;
@@ -57,6 +78,11 @@ public class RestrictedPreferenceHelperTest {
@Mock
private RestrictedTopLevelPreference mRestrictedTopLevelPreference;
+ private final String mPackage = "test.pkg";
+ private final ComponentName mAdmin = new ComponentName("admin", "adminclass");
+ private final Authority mAdvancedProtectionAuthority = new UnknownAuthority(
+ ADVANCED_PROTECTION_SYSTEM_ENTITY);
+
private PreferenceViewHolder mViewHolder;
private RestrictedPreferenceHelper mHelper;
@@ -71,6 +97,7 @@ public class RestrictedPreferenceHelperTest {
mHelper = new RestrictedPreferenceHelper(mContext, mPreference, null);
}
+ @RequiresFlagsDisabled(android.security.Flags.FLAG_AAPM_API)
@Test
public void bindPreference_disabled_shouldDisplayDisabledSummary() {
final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS);
@@ -101,6 +128,57 @@ public class RestrictedPreferenceHelperTest {
verify(summaryView, never()).setVisibility(View.GONE);
}
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void bindPreference_disabled_byAdvancedProtection_shouldDisplayDisabledSummary() {
+ final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS);
+ final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS;
+ final RestrictedLockUtils.EnforcedAdmin enforcedAdmin = new RestrictedLockUtils
+ .EnforcedAdmin(/* component */ null, userRestriction, UserHandle.of(
+ UserHandle.myUserId()));
+ final EnforcingAdmin advancedProtectionEnforcingAdmin = new EnforcingAdmin(mPackage,
+ mAdvancedProtectionAuthority, UserHandle.of(UserHandle.myUserId()), mAdmin);
+
+ when(mViewHolder.itemView.findViewById(android.R.id.summary))
+ .thenReturn(summaryView);
+ when(mDevicePolicyManager.getEnforcingAdmin(UserHandle.myUserId(), userRestriction))
+ .thenReturn(advancedProtectionEnforcingAdmin);
+ when(mContext.getString(
+ com.android.settingslib.widget.restricted.R.string.disabled_by_advanced_protection))
+ .thenReturn("advanced_protection");
+
+ mHelper.useAdminDisabledSummary(true);
+ mHelper.setDisabledByAdmin(enforcedAdmin);
+ mHelper.onBindViewHolder(mViewHolder);
+
+ verify(summaryView).setText("advanced_protection");
+ verify(summaryView, never()).setVisibility(View.GONE);
+ }
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void bindPreference_disabled_byAdmin_shouldDisplayDisabledSummary() {
+ final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS);
+ final EnforcingAdmin nonAdvancedProtectionEnforcingAdmin = new EnforcingAdmin(mPackage,
+ UnknownAuthority.UNKNOWN_AUTHORITY, UserHandle.of(UserHandle.myUserId()), mAdmin);
+ final String userRestriction = UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY;
+
+ when(mViewHolder.itemView.findViewById(android.R.id.summary))
+ .thenReturn(summaryView);
+ when(mDevicePolicyManager.getEnforcingAdmin(UserHandle.myUserId(), userRestriction))
+ .thenReturn(nonAdvancedProtectionEnforcingAdmin);
+ when(mContext.getString(R.string.disabled_by_admin_summary_text))
+ .thenReturn("test");
+ when(mDevicePolicyResourcesManager.getString(any(), any())).thenReturn("test");
+
+ mHelper.useAdminDisabledSummary(true);
+ mHelper.setDisabledByAdmin(new RestrictedLockUtils.EnforcedAdmin());
+ mHelper.onBindViewHolder(mViewHolder);
+
+ verify(summaryView).setText("test");
+ verify(summaryView, never()).setVisibility(View.GONE);
+ }
+
@Test
public void bindPreference_notDisabled_shouldNotHideSummary() {
final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS);
@@ -157,4 +235,74 @@ public class RestrictedPreferenceHelperTest {
assertThat(mHelper.isDisabledByAdmin()).isTrue();
}
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void setDisabledByAdmin_previousAndCurrentAdminsAreTheSame_returnsFalse() {
+ RestrictedLockUtils.EnforcedAdmin enforcedAdmin =
+ new RestrictedLockUtils.EnforcedAdmin(/* component */ null,
+ /* enforcedRestriction */ "some_restriction", /* userHandle */ null);
+
+ mHelper.setDisabledByAdmin(enforcedAdmin);
+
+ assertThat(mHelper.setDisabledByAdmin(enforcedAdmin)).isFalse();
+ }
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void setDisabledByAdmin_previousAndCurrentAdminsAreDifferent_returnsTrue() {
+ RestrictedLockUtils.EnforcedAdmin enforcedAdmin1 =
+ new RestrictedLockUtils.EnforcedAdmin(/* component */ null,
+ /* enforcedRestriction */ "some_restriction", /* userHandle */ null);
+ RestrictedLockUtils.EnforcedAdmin enforcedAdmin2 =
+ new RestrictedLockUtils.EnforcedAdmin(new ComponentName("pkg", "cls"),
+ /* enforcedRestriction */ "some_restriction", /* userHandle */ null);
+
+ mHelper.setDisabledByAdmin(enforcedAdmin1);
+
+ assertThat(mHelper.setDisabledByAdmin(enforcedAdmin2)).isTrue();
+ }
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void isRestrictionEnforcedByAdvancedProtection_notEnforced_returnsFalse() {
+ final Authority[] allNonAdvancedProtectionAuthorities = new Authority[] {
+ UnknownAuthority.UNKNOWN_AUTHORITY,
+ DeviceAdminAuthority.DEVICE_ADMIN_AUTHORITY,
+ DpcAuthority.DPC_AUTHORITY,
+ new RoleAuthority(Collections.singleton("some-role"))
+ };
+ final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS;
+
+ for (Authority authority : allNonAdvancedProtectionAuthorities) {
+ final EnforcingAdmin enforcingAdmin = new EnforcingAdmin(mPackage, authority,
+ UserHandle.of(UserHandle.myUserId()), mAdmin);
+
+ when(mDevicePolicyManager.getEnforcingAdmin(UserHandle.myUserId(), userRestriction))
+ .thenReturn(enforcingAdmin);
+
+ mHelper.setDisabledByAdmin(new RestrictedLockUtils.EnforcedAdmin(/* component */ null,
+ userRestriction, UserHandle.of(UserHandle.myUserId())));
+
+ assertWithMessage(authority + " is not an advanced protection authority")
+ .that(mHelper.isRestrictionEnforcedByAdvancedProtection())
+ .isFalse();
+ }
+ }
+
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_API)
+ @Test
+ public void isRestrictionEnforcedByAdvancedProtection_enforced_returnsTrue() {
+ final EnforcingAdmin advancedProtectionEnforcingAdmin = new EnforcingAdmin(mPackage,
+ mAdvancedProtectionAuthority, UserHandle.of(UserHandle.myUserId()), mAdmin);
+ final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS;
+
+ when(mDevicePolicyManager.getEnforcingAdmin(UserHandle.myUserId(), userRestriction))
+ .thenReturn(advancedProtectionEnforcingAdmin);
+
+ mHelper.setDisabledByAdmin(new RestrictedLockUtils.EnforcedAdmin(/* component */ null,
+ userRestriction, UserHandle.of(UserHandle.myUserId())));
+
+ assertThat(mHelper.isRestrictionEnforcedByAdvancedProtection()).isTrue();
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java
new file mode 100644
index 000000000000..abc1d226972b
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.AudioInputControl;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+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.RobolectricTestRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/** Tests for {@link AmbientVolumeController}. */
+@RunWith(RobolectricTestRunner.class)
+public class AmbientVolumeControllerTest {
+
+ @Rule
+ public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+ private static final String TEST_ADDRESS = "00:00:00:00:11";
+
+ @Mock
+ private LocalBluetoothProfileManager mProfileManager;
+ @Mock
+ private VolumeControlProfile mVolumeControlProfile;
+ @Mock
+ private AmbientVolumeController.AmbientVolumeControlCallback mCallback;
+ @Mock
+ private BluetoothDevice mDevice;
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private AmbientVolumeController mVolumeController;
+
+ @Before
+ public void setUp() {
+ when(mProfileManager.getVolumeControlProfile()).thenReturn(mVolumeControlProfile);
+ when(mDevice.getAddress()).thenReturn(TEST_ADDRESS);
+ when(mDevice.isConnected()).thenReturn(true);
+ mVolumeController = new AmbientVolumeController(mProfileManager, mCallback);
+ }
+
+ @Test
+ public void onServiceConnected_notifyCallback() {
+ when(mVolumeControlProfile.isProfileReady()).thenReturn(true);
+
+ mVolumeController.onServiceConnected();
+
+ verify(mCallback).onVolumeControlServiceConnected();
+ }
+
+ @Test
+ public void isAmbientControlAvailable_validControls_assertTrue() {
+ prepareValidAmbientControls();
+
+ assertThat(mVolumeController.isAmbientControlAvailable(mDevice)).isTrue();
+ }
+
+ @Test
+ public void isAmbientControlAvailable_streamingControls_assertFalse() {
+ prepareStreamingControls();
+
+ assertThat(mVolumeController.isAmbientControlAvailable(mDevice)).isFalse();
+ }
+
+ @Test
+ public void isAmbientControlAvailable_automaticAmbientControls_assertFalse() {
+ prepareAutomaticAmbientControls();
+
+ assertThat(mVolumeController.isAmbientControlAvailable(mDevice)).isFalse();
+ }
+
+ @Test
+ public void isAmbientControlAvailable_inactiveAmbientControls_assertFalse() {
+ prepareInactiveAmbientControls();
+
+ assertThat(mVolumeController.isAmbientControlAvailable(mDevice)).isFalse();
+ }
+
+ @Test
+ public void registerCallback_verifyRegisterOnAllControls() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.registerCallback(mContext.getMainExecutor(), mDevice);
+
+ for (AudioInputControl control : controls) {
+ verify(control).registerCallback(any(Executor.class), any());
+ }
+ }
+
+ @Test
+ public void unregisterCallback_verifyUnregisterOnAllControls() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.registerCallback(mContext.getMainExecutor(), mDevice);
+ mVolumeController.unregisterCallback(mDevice);
+
+ for (AudioInputControl control : controls) {
+ verify(control).unregisterCallback(any());
+ }
+ }
+
+ @Test
+ public void getAmbientMax_verifyGetOnFirstControl() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.getAmbientMax(mDevice);
+
+ verify(controls.getFirst()).getGainSettingMax();
+ }
+
+ @Test
+ public void getAmbientMin_verifyGetOnFirstControl() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.getAmbientMin(mDevice);
+
+ verify(controls.getFirst()).getGainSettingMin();
+ }
+
+ @Test
+ public void getAmbient_verifyGetOnFirstControl() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.getAmbient(mDevice);
+
+ verify(controls.getFirst()).getGainSetting();
+ }
+
+ @Test
+ public void setAmbient_verifySetOnAllControls() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.setAmbient(mDevice, 10);
+
+ for (AudioInputControl control : controls) {
+ verify(control).setGainSetting(10);
+ }
+ }
+
+ @Test
+ public void getMute_verifyGetOnFirstControl() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.getMute(mDevice);
+
+ verify(controls.getFirst()).getMute();
+ }
+
+ @Test
+ public void setMuted_true_verifySetOnAllControls() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.setMuted(mDevice, true);
+
+ for (AudioInputControl control : controls) {
+ verify(control).setMute(AudioInputControl.MUTE_MUTED);
+ }
+ }
+
+ @Test
+ public void setMuted_false_verifySetOnAllControls() {
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+
+ mVolumeController.setMuted(mDevice, false);
+
+ for (AudioInputControl control : controls) {
+ verify(control).setMute(AudioInputControl.MUTE_NOT_MUTED);
+ }
+ }
+
+ @Test
+ public void ambientCallback_onGainSettingChanged_verifyCallbackIsCalledWhenStateChange() {
+ AmbientVolumeController.AmbientCallback ambientCallback =
+ mVolumeController.new AmbientCallback(mDevice, mCallback);
+ final int testAmbient = 10;
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+ when(controls.getFirst().getGainSetting()).thenReturn(testAmbient);
+
+ mVolumeController.refreshAmbientState(mDevice);
+ ambientCallback.onGainSettingChanged(testAmbient);
+ verify(mCallback, never()).onAmbientChanged(mDevice, testAmbient);
+
+ final int updatedTestAmbient = 20;
+ ambientCallback.onGainSettingChanged(updatedTestAmbient);
+ verify(mCallback).onAmbientChanged(mDevice, updatedTestAmbient);
+ }
+
+
+ @Test
+ public void ambientCallback_onSetAmbientFailed_verifyCallbackIsCalled() {
+ AmbientVolumeController.AmbientCallback ambientCallback =
+ mVolumeController.new AmbientCallback(mDevice, mCallback);
+
+ ambientCallback.onSetGainSettingFailed();
+
+ verify(mCallback).onCommandFailed(mDevice);
+ }
+
+ @Test
+ public void ambientCallback_onMuteChanged_verifyCallbackIsCalledWhenStateChange() {
+ AmbientVolumeController.AmbientCallback ambientCallback =
+ mVolumeController.new AmbientCallback(mDevice, mCallback);
+ final int testMute = 0;
+ List<AudioInputControl> controls = prepareValidAmbientControls();
+ when(controls.getFirst().getMute()).thenReturn(testMute);
+
+ mVolumeController.refreshAmbientState(mDevice);
+ ambientCallback.onMuteChanged(testMute);
+ verify(mCallback, never()).onMuteChanged(mDevice, testMute);
+
+ final int updatedTestMute = 1;
+ ambientCallback.onMuteChanged(updatedTestMute);
+ verify(mCallback).onMuteChanged(mDevice, updatedTestMute);
+ }
+
+ @Test
+ public void ambientCallback_onSetMuteFailed_verifyCallbackIsCalled() {
+ AmbientVolumeController.AmbientCallback ambientCallback =
+ mVolumeController.new AmbientCallback(mDevice, mCallback);
+
+ ambientCallback.onSetMuteFailed();
+
+ verify(mCallback).onCommandFailed(mDevice);
+ }
+
+ private List<AudioInputControl> prepareValidAmbientControls() {
+ List<AudioInputControl> controls = new ArrayList<>();
+ final int controlsCount = 2;
+ for (int i = 0; i < controlsCount; i++) {
+ controls.add(prepareAudioInputControl(
+ AudioInputControl.AUDIO_INPUT_TYPE_AMBIENT,
+ AudioInputControl.GAIN_MODE_MANUAL,
+ AudioInputControl.AUDIO_INPUT_STATUS_ACTIVE));
+ }
+ when(mVolumeControlProfile.getAudioInputControlServices(mDevice)).thenReturn(controls);
+ return controls;
+ }
+
+ private List<AudioInputControl> prepareStreamingControls() {
+ List<AudioInputControl> controls = new ArrayList<>();
+ final int controlsCount = 2;
+ for (int i = 0; i < controlsCount; i++) {
+ controls.add(prepareAudioInputControl(
+ AudioInputControl.AUDIO_INPUT_TYPE_STREAMING,
+ AudioInputControl.GAIN_MODE_MANUAL,
+ AudioInputControl.AUDIO_INPUT_STATUS_ACTIVE));
+ }
+ when(mVolumeControlProfile.getAudioInputControlServices(mDevice)).thenReturn(controls);
+ return controls;
+ }
+
+ private List<AudioInputControl> prepareAutomaticAmbientControls() {
+ List<AudioInputControl> controls = new ArrayList<>();
+ final int controlsCount = 2;
+ for (int i = 0; i < controlsCount; i++) {
+ controls.add(prepareAudioInputControl(
+ AudioInputControl.AUDIO_INPUT_TYPE_STREAMING,
+ AudioInputControl.GAIN_MODE_AUTOMATIC,
+ AudioInputControl.AUDIO_INPUT_STATUS_ACTIVE));
+ }
+ when(mVolumeControlProfile.getAudioInputControlServices(mDevice)).thenReturn(controls);
+ return controls;
+ }
+
+ private List<AudioInputControl> prepareInactiveAmbientControls() {
+ List<AudioInputControl> controls = new ArrayList<>();
+ final int controlsCount = 2;
+ for (int i = 0; i < controlsCount; i++) {
+ controls.add(prepareAudioInputControl(
+ AudioInputControl.AUDIO_INPUT_TYPE_STREAMING,
+ AudioInputControl.GAIN_MODE_AUTOMATIC,
+ AudioInputControl.AUDIO_INPUT_STATUS_INACTIVE));
+ }
+ when(mVolumeControlProfile.getAudioInputControlServices(mDevice)).thenReturn(controls);
+ return controls;
+ }
+
+ private AudioInputControl prepareAudioInputControl(int type, int mode, int status) {
+ AudioInputControl control = mock(AudioInputControl.class);
+ when(control.getAudioInputType()).thenReturn(type);
+ when(control.getGainMode()).thenReturn(mode);
+ when(control.getAudioInputStatus()).thenReturn(status);
+ return control;
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
index 8cc997414d70..05f471f62f1d 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
@@ -139,6 +139,11 @@ public class CachedBluetoothDeviceManagerTest {
mCachedDevice1 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice1));
mCachedDevice2 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice2));
mCachedDevice3 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice3));
+
+ mHearingAidDeviceManager = spy(new HearingAidDeviceManager(mContext, mLocalBluetoothManager,
+ mCachedDeviceManager.mCachedDevices));
+ mCachedDeviceManager.mHearingAidDeviceManager = mHearingAidDeviceManager;
+ doNothing().when(mHearingAidDeviceManager).clearLocalDataIfNeeded(any());
}
/**
@@ -338,6 +343,8 @@ public class CachedBluetoothDeviceManagerTest {
// Call onDeviceUnpaired for the one in mCachedDevices.
mCachedDeviceManager.onDeviceUnpaired(cachedDevice2);
+
+ verify(mHearingAidDeviceManager).clearLocalDataIfNeeded(cachedDevice2);
verify(mDevice1).removeBond();
}
@@ -353,6 +360,8 @@ public class CachedBluetoothDeviceManagerTest {
// Call onDeviceUnpaired for the one in mCachedDevices.
mCachedDeviceManager.onDeviceUnpaired(cachedDevice1);
+
+ verify(mHearingAidDeviceManager).clearLocalDataIfNeeded(cachedDevice1);
verify(mDevice2).removeBond();
}
@@ -406,9 +415,6 @@ public class CachedBluetoothDeviceManagerTest {
*/
@Test
public void updateHearingAidDevices_directToHearingAidDeviceManager() {
- mHearingAidDeviceManager = spy(new HearingAidDeviceManager(mContext, mLocalBluetoothManager,
- mCachedDeviceManager.mCachedDevices));
- mCachedDeviceManager.mHearingAidDeviceManager = mHearingAidDeviceManager;
mCachedDeviceManager.updateHearingAidsDevices();
verify(mHearingAidDeviceManager).updateHearingAidsDevices();
@@ -535,6 +541,7 @@ public class CachedBluetoothDeviceManagerTest {
// Call onDeviceUnpaired for the one in mCachedDevices.
mCachedDeviceManager.onDeviceUnpaired(cachedDevice1);
+ verify(mHearingAidDeviceManager).clearLocalDataIfNeeded(cachedDevice1);
verify(mDevice2).removeBond();
assertThat(cachedDevice1.getGroupId()).isEqualTo(
BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
@@ -559,6 +566,7 @@ public class CachedBluetoothDeviceManagerTest {
// Call onDeviceUnpaired for the one in mCachedDevices.
mCachedDeviceManager.onDeviceUnpaired(cachedDevice2);
+ verify(mHearingAidDeviceManager).clearLocalDataIfNeeded(cachedDevice2);
verify(mDevice1).removeBond();
assertThat(cachedDevice2.getGroupId()).isEqualTo(
BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
@@ -611,10 +619,7 @@ public class CachedBluetoothDeviceManagerTest {
@Test
public void onActiveDeviceChanged_validHiSyncId_callExpectedFunction() {
- mHearingAidDeviceManager = spy(new HearingAidDeviceManager(mContext, mLocalBluetoothManager,
- mCachedDeviceManager.mCachedDevices));
doNothing().when(mHearingAidDeviceManager).onActiveDeviceChanged(any());
- mCachedDeviceManager.mHearingAidDeviceManager = mHearingAidDeviceManager;
when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
cachedDevice1.setHearingAidInfo(
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java
index bf927a1eb4cc..eb73eee90f0d 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java
@@ -17,7 +17,6 @@ package com.android.settingslib.bluetooth;
import static android.bluetooth.BluetoothHearingAid.HI_SYNC_ID_INVALID;
import static android.bluetooth.BluetoothLeAudio.AUDIO_LOCATION_FRONT_LEFT;
-import static android.bluetooth.BluetoothLeAudio.AUDIO_LOCATION_INVALID;
import static com.android.settingslib.bluetooth.HapClientProfile.HearingAidType.TYPE_BINAURAL;
import static com.android.settingslib.bluetooth.HapClientProfile.HearingAidType.TYPE_INVALID;
@@ -272,14 +271,14 @@ public class HearingAidDeviceManagerTest {
*
* Conditions:
* 1) LeAudio hearing aid
- * 2) Invalid audio location and device type
+ * 2) Invalid device type
* Result:
* Do not set hearing aid info to the device.
*/
@Test
public void initHearingAidDeviceIfNeeded_leAudio_invalidInfo_notToSetHearingAidInfo() {
when(mCachedDevice1.getProfiles()).thenReturn(List.of(mLeAudioProfile, mHapClientProfile));
- when(mLeAudioProfile.getAudioLocation(mDevice1)).thenReturn(AUDIO_LOCATION_INVALID);
+ when(mLeAudioProfile.getAudioLocation(mDevice1)).thenReturn(AUDIO_LOCATION_FRONT_LEFT);
when(mHapClientProfile.getHearingAidType(mDevice1)).thenReturn(TYPE_INVALID);
mHearingAidDeviceManager.initHearingAidDeviceIfNeeded(mCachedDevice1, null);
@@ -506,14 +505,14 @@ public class HearingAidDeviceManagerTest {
*
* Conditions:
* 1) LeAudio hearing aid
- * 2) Invalid audio location and device type
+ * 2) Invalid device type
* Result:
* Do not set hearing aid info to the device.
*/
@Test
public void updateHearingAidsDevices_leAudio_invalidInfo_notToSetHearingAidInfo() {
when(mCachedDevice1.getProfiles()).thenReturn(List.of(mLeAudioProfile, mHapClientProfile));
- when(mLeAudioProfile.getAudioLocation(mDevice1)).thenReturn(AUDIO_LOCATION_INVALID);
+ when(mLeAudioProfile.getAudioLocation(mDevice1)).thenReturn(AUDIO_LOCATION_FRONT_LEFT);
when(mHapClientProfile.getHearingAidType(mDevice1)).thenReturn(TYPE_INVALID);
mCachedDeviceManager.mCachedDevices.add(mCachedDevice1);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java
index b659c02a2540..6d83588e0f6e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingDeviceLocalDataManagerTest.java
@@ -194,6 +194,19 @@ public class HearingDeviceLocalDataManagerTest {
verify(mListener).onDeviceLocalDataChange(TEST_ADDRESS, newData);
}
+ @Test
+ public void clear_dataIsRemoved() {
+ String settings = Settings.Global.getStringForUser(mContext.getContentResolver(),
+ Settings.Global.HEARING_DEVICE_LOCAL_AMBIENT_VOLUME, UserHandle.USER_SYSTEM);
+ assertThat(settings.contains(TEST_ADDRESS)).isTrue();
+
+ HearingDeviceLocalDataManager.clear(mContext, mDevice);
+
+ settings = Settings.Global.getStringForUser(mContext.getContentResolver(),
+ Settings.Global.HEARING_DEVICE_LOCAL_AMBIENT_VOLUME, UserHandle.USER_SYSTEM);
+ assertThat(settings.contains(TEST_ADDRESS)).isFalse();
+ }
+
private void prepareTestDataInSettings() {
String data = generateSettingsString(TEST_ADDRESS, TEST_AMBIENT, TEST_GROUP_AMBIENT,
TEST_AMBIENT_CONTROL_EXPANDED);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java b/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java
index aca2c4ef2a49..91ac34ac8233 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java
@@ -72,7 +72,6 @@ import java.util.regex.Pattern;
public final class DeviceConfigService extends Binder {
private static final List<String> sAconfigTextProtoFilesOnDevice = List.of(
"/system/etc/aconfig_flags.pb",
- "/system_ext/etc/aconfig_flags.pb",
"/product/etc/aconfig_flags.pb",
"/vendor/etc/aconfig_flags.pb");
@@ -133,12 +132,7 @@ public final class DeviceConfigService extends Binder {
}
pw.println("DeviceConfig provider: ");
- try (ParcelFileDescriptor pfd = ParcelFileDescriptor.dup(fd)) {
- DeviceConfig.dump(pfd, pw, /* prefix= */ " ", args);
- } catch (IOException e) {
- pw.print("IOException creating ParcelFileDescriptor: ");
- pw.println(e);
- }
+ DeviceConfig.dump(pw, /* prefix= */ " ", args);
}
IContentProvider iprovider = mProvider.getIContentProvider();
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index 7aed61533aac..5cd534e62ea9 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -171,7 +171,6 @@ final class SettingsState {
private static final List<String> sAconfigTextProtoFilesOnDevice = List.of(
"/system/etc/aconfig_flags.pb",
- "/system_ext/etc/aconfig_flags.pb",
"/product/etc/aconfig_flags.pb",
"/vendor/etc/aconfig_flags.pb");
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index ee229158decc..3ac71bf8ef67 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -1339,16 +1339,6 @@ flag {
}
flag {
- name: "validate_keyboard_shortcut_helper_icon_uri"
- namespace: "systemui"
- description: "Adds a check that the caller can access the content URI of an icon in the shortcut helper."
- bug: "331180422"
- metadata {
- purpose: PURPOSE_BUGFIX
- }
-}
-
-flag {
name: "glanceable_hub_allow_keyguard_when_dreaming"
namespace: "systemui"
description: "Allows users to exit dream to keyguard with glanceable hub enabled"
diff --git a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt
index 92b6fd44e2f2..2a27a3033cf9 100644
--- a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt
+++ b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/ShadeDisplayAwareDetector.kt
@@ -59,9 +59,9 @@ class ShadeDisplayAwareDetector : Detector(), SourceCodeScanner {
private const val INJECT_ANNOTATION = "javax.inject.Inject"
private const val APPLICATION_ANNOTATION =
"com.android.systemui.dagger.qualifiers.Application"
- private const val GLOBAL_CONFIG_ANNOTATION = "com.android.systemui.common.ui.GlobalConfig"
private const val SHADE_DISPLAY_AWARE_ANNOTATION =
"com.android.systemui.shade.ShadeDisplayAware"
+ private const val MAIN_ANNOTATION = "com.android.systemui.dagger.qualifiers.Main"
private const val CONTEXT = "android.content.Context"
private const val WINDOW_MANAGER = "android.view.WindowManager"
@@ -108,13 +108,10 @@ class ShadeDisplayAwareDetector : Detector(), SourceCodeScanner {
// check if the parameter is a context-dependent class relevant to shade
if (className !in CONTEXT_DEPENDENT_SHADE_CLASSES) return false
- // check if it has @ShadeDisplayAware
- if (hasAnnotation(SHADE_DISPLAY_AWARE_ANNOTATION)) return false
+ if (hasAnnotation(SHADE_DISPLAY_AWARE_ANNOTATION) || hasAnnotation(MAIN_ANNOTATION))
+ return false
// check if its a @Application-annotated Context
if (className == CONTEXT && hasAnnotation(APPLICATION_ANNOTATION)) return false
- // check if its a @GlobalConfig-annotated ConfigurationState, ConfigurationController
- // or ConfigurationInteractor
- if (className in CONFIG_CLASSES && hasAnnotation(GLOBAL_CONFIG_ANNOTATION)) return false
return true
}
diff --git a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt
index 79f190782ee8..638d7cb7ee58 100644
--- a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt
+++ b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/ShadeDisplayAwareDetectorTest.kt
@@ -73,12 +73,12 @@ class ShadeDisplayAwareDetectorTest : SystemUILintDetectorTest() {
)
.indented()
- private val globalConfigStub: TestFile =
+ private val mainStub: TestFile =
kotlin(
"""
- package com.android.systemui.common.ui
+ package com.android.systemui.dagger.qualifiers
- @Retention(AnnotationRetention.RUNTIME) annotation class GlobalConfig
+ @Retention(AnnotationRetention.RUNTIME) annotation class Main
"""
)
.indented()
@@ -119,7 +119,7 @@ class ShadeDisplayAwareDetectorTest : SystemUILintDetectorTest() {
qsContext,
shadeDisplayAwareStub,
applicationStub,
- globalConfigStub,
+ mainStub,
configStateStub,
configControllerStub,
configInteractorStub,
@@ -308,7 +308,7 @@ class ShadeDisplayAwareDetectorTest : SystemUILintDetectorTest() {
}
@Test
- fun injectedConstructor_inRelevantPackage_withGlobalConfigAnnotatedConfigurationClass() {
+ fun injectedConstructor_inRelevantPackage_withMainAnnotatedConfigurationClass() {
lint()
.files(
TestFiles.kotlin(
@@ -317,11 +317,11 @@ class ShadeDisplayAwareDetectorTest : SystemUILintDetectorTest() {
import javax.inject.Inject
import com.android.systemui.common.ui.ConfigurationState
- import com.android.systemui.common.ui.GlobalConfig
+ import com.android.systemui.dagger.qualifiers.Main
class ExampleClass
@Inject
- constructor(@GlobalConfig private val configState: ConfigurationState)
+ constructor(@Main private val configState: ConfigurationState)
"""
.trimIndent()
),
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt
index 9fe85b7a7070..029b9cde4da9 100644
--- a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt
+++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt
@@ -38,6 +38,8 @@ import androidx.compose.ui.input.pointer.PointerId
import androidx.compose.ui.input.pointer.PointerInputChange
import androidx.compose.ui.input.pointer.PointerInputScope
import androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNode
+import androidx.compose.ui.input.pointer.changedToDownIgnoreConsumed
+import androidx.compose.ui.input.pointer.changedToUpIgnoreConsumed
import androidx.compose.ui.input.pointer.positionChange
import androidx.compose.ui.input.pointer.util.VelocityTracker
import androidx.compose.ui.input.pointer.util.addPointerInputChange
@@ -50,6 +52,7 @@ import androidx.compose.ui.platform.LocalViewConfiguration
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastSumBy
import com.android.compose.modifiers.thenIf
import kotlin.math.sign
import kotlinx.coroutines.CoroutineScope
@@ -65,9 +68,10 @@ import kotlinx.coroutines.launch
interface NestedDraggable {
/**
* Called when a drag is started in the given [position] (*before* dragging the touch slop) and
- * in the direction given by [sign].
+ * in the direction given by [sign], with the given number of [pointersDown] when the touch slop
+ * was detected.
*/
- fun onDragStarted(position: Offset, sign: Float): Controller
+ fun onDragStarted(position: Offset, sign: Float, pointersDown: Int): Controller
/**
* Whether this draggable should consume any scroll amount with the given [sign] coming from a
@@ -170,6 +174,9 @@ private class NestedDraggableNode(
*/
private var lastFirstDown: Offset? = null
+ /** The number of pointers down. */
+ private var pointersDownCount = 0
+
init {
delegate(nestedScrollModifierNode(this, nestedScrollDispatcher))
}
@@ -234,6 +241,11 @@ private class NestedDraggableNode(
awaitEachGesture {
val down = awaitFirstDown(requireUnconsumed = false)
+ check(down.position == lastFirstDown) {
+ "Position from detectDrags() is not the same as position in trackDownPosition()"
+ }
+ check(pointersDownCount == 1) { "pointersDownCount is equal to $pointersDownCount" }
+
var overSlop = 0f
val onTouchSlopReached = { change: PointerInputChange, over: Float ->
change.consume()
@@ -276,10 +288,13 @@ private class NestedDraggableNode(
if (drag != null) {
velocityTracker.resetTracking()
-
val sign = (drag.position - down.position).toFloat().sign
+ check(pointersDownCount > 0) { "pointersDownCount is equal to $pointersDownCount" }
val wrappedController =
- WrappedController(coroutineScope, draggable.onDragStarted(down.position, sign))
+ WrappedController(
+ coroutineScope,
+ draggable.onDragStarted(down.position, sign, pointersDownCount),
+ )
if (overSlop != 0f) {
onDrag(wrappedController, drag, overSlop, velocityTracker)
}
@@ -424,7 +439,22 @@ private class NestedDraggableNode(
*/
private suspend fun PointerInputScope.trackDownPosition() {
- awaitEachGesture { lastFirstDown = awaitFirstDown(requireUnconsumed = false).position }
+ awaitEachGesture {
+ val down = awaitFirstDown(requireUnconsumed = false)
+ lastFirstDown = down.position
+ pointersDownCount = 1
+
+ do {
+ pointersDownCount +=
+ awaitPointerEvent().changes.fastSumBy { change ->
+ when {
+ change.changedToDownIgnoreConsumed() -> 1
+ change.changedToUpIgnoreConsumed() -> -1
+ else -> 0
+ }
+ }
+ } while (pointersDownCount > 0)
+ }
}
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
@@ -451,8 +481,14 @@ private class NestedDraggableNode(
val sign = offset.sign
if (nestedScrollController == null && draggable.shouldConsumeNestedScroll(sign)) {
val startedPosition = checkNotNull(lastFirstDown) { "lastFirstDown is not set" }
+
+ // TODO(b/382665591): Replace this by check(pointersDownCount > 0).
+ val pointersDown = pointersDownCount.coerceAtLeast(1)
nestedScrollController =
- WrappedController(coroutineScope, draggable.onDragStarted(startedPosition, sign))
+ WrappedController(
+ coroutineScope,
+ draggable.onDragStarted(startedPosition, sign, pointersDown),
+ )
}
val controller = nestedScrollController ?: return Offset.Zero
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt b/packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt
index a499447fc367..fe3faafded6f 100644
--- a/packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt
+++ b/packages/SystemUI/compose/core/src/com/android/compose/theme/Color.kt
@@ -37,4 +37,4 @@ fun colorAttr(context: Context, @AttrRes attr: Int): Color {
@ColorInt val color = ta.getColor(0, 0)
ta.recycle()
return Color(color)
-}
+} \ No newline at end of file
diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt
index fd3902fa7dc8..735ab68bc6a6 100644
--- a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt
+++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt
@@ -41,6 +41,7 @@ import androidx.compose.ui.test.swipeDown
import androidx.compose.ui.test.swipeLeft
import androidx.compose.ui.unit.Velocity
import com.google.common.truth.Truth.assertThat
+import kotlin.math.ceil
import kotlinx.coroutines.awaitCancellation
import org.junit.Ignore
import org.junit.Rule
@@ -383,6 +384,79 @@ class NestedDraggableTest(override val orientation: Orientation) : OrientationAw
assertThat(draggable.onDragStoppedCalled).isTrue()
}
+ @Test
+ fun pointersDown() {
+ val draggable = TestDraggable()
+ val touchSlop =
+ rule.setContentWithTouchSlop {
+ Box(Modifier.fillMaxSize().nestedDraggable(draggable, orientation))
+ }
+
+ (1..5).forEach { nDown ->
+ rule.onRoot().performTouchInput {
+ repeat(nDown) { pointerId -> down(pointerId, center) }
+
+ moveBy(pointerId = 0, touchSlop.toOffset())
+ }
+
+ assertThat(draggable.onDragStartedPointersDown).isEqualTo(nDown)
+
+ rule.onRoot().performTouchInput {
+ repeat(nDown) { pointerId -> up(pointerId = pointerId) }
+ }
+ }
+ }
+
+ @Test
+ fun pointersDown_nestedScroll() {
+ val draggable = TestDraggable()
+ val touchSlop =
+ rule.setContentWithTouchSlop {
+ Box(
+ Modifier.fillMaxSize()
+ .nestedDraggable(draggable, orientation)
+ .nestedScrollable(rememberScrollState())
+ )
+ }
+
+ (1..5).forEach { nDown ->
+ rule.onRoot().performTouchInput {
+ repeat(nDown) { pointerId -> down(pointerId, center) }
+
+ moveBy(pointerId = 0, (touchSlop + 1f).toOffset())
+ }
+
+ assertThat(draggable.onDragStartedPointersDown).isEqualTo(nDown)
+
+ rule.onRoot().performTouchInput {
+ repeat(nDown) { pointerId -> up(pointerId = pointerId) }
+ }
+ }
+ }
+
+ @Test
+ fun pointersDown_downThenUpThenDown() {
+ val draggable = TestDraggable()
+ val touchSlop =
+ rule.setContentWithTouchSlop {
+ Box(Modifier.fillMaxSize().nestedDraggable(draggable, orientation))
+ }
+
+ val slopThird = ceil(touchSlop / 3f).toOffset()
+ rule.onRoot().performTouchInput {
+ repeat(5) { down(pointerId = it, center) } // + 5
+ moveBy(pointerId = 0, slopThird)
+
+ listOf(2, 3).forEach { up(pointerId = it) } // - 2
+ moveBy(pointerId = 0, slopThird)
+
+ listOf(5, 6, 7).forEach { down(pointerId = it, center) } // + 3
+ moveBy(pointerId = 0, slopThird)
+ }
+
+ assertThat(draggable.onDragStartedPointersDown).isEqualTo(6)
+ }
+
private fun ComposeContentTestRule.setContentWithTouchSlop(
content: @Composable () -> Unit
): Float {
@@ -413,12 +487,18 @@ class NestedDraggableTest(override val orientation: Orientation) : OrientationAw
var onDragStartedPosition = Offset.Zero
var onDragStartedSign = 0f
+ var onDragStartedPointersDown = 0
var onDragDelta = 0f
- override fun onDragStarted(position: Offset, sign: Float): NestedDraggable.Controller {
+ override fun onDragStarted(
+ position: Offset,
+ sign: Float,
+ pointersDown: Int,
+ ): NestedDraggable.Controller {
onDragStartedCalled = true
onDragStartedPosition = position
onDragStartedSign = sign
+ onDragStartedPointersDown = pointersDown
onDragDelta = 0f
onDragStarted.invoke(position, sign)
diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt
index 737853b88f7a..96989a2df2f0 100644
--- a/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt
+++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/theme/PlatformThemeTest.kt
@@ -16,8 +16,8 @@
package com.android.compose.theme
+import android.annotation.ColorRes
import android.content.Context
-import androidx.annotation.AttrRes
import androidx.compose.material3.ColorScheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -70,118 +70,118 @@ class PlatformThemeTest {
val colorValues = mutableListOf<ColorValue>()
fun onLaunch(colorScheme: ColorScheme, context: Context) {
- fun addValue(name: String, materialValue: Color, @AttrRes attr: Int) {
- colorValues.add(ColorValue(name, materialValue, colorAttr(context, attr)))
+ fun addValue(name: String, materialValue: Color, @ColorRes color: Int) {
+ colorValues.add(ColorValue(name, materialValue, Color(context.getColor(color))))
}
- addValue("primary", colorScheme.primary, R.attr.materialColorPrimary)
- addValue("onPrimary", colorScheme.onPrimary, R.attr.materialColorOnPrimary)
+ addValue("primary", colorScheme.primary, R.color.materialColorPrimary)
+ addValue("onPrimary", colorScheme.onPrimary, R.color.materialColorOnPrimary)
addValue(
"primaryContainer",
colorScheme.primaryContainer,
- R.attr.materialColorPrimaryContainer,
+ R.color.materialColorPrimaryContainer,
)
addValue(
"onPrimaryContainer",
colorScheme.onPrimaryContainer,
- R.attr.materialColorOnPrimaryContainer,
+ R.color.materialColorOnPrimaryContainer,
)
addValue(
"inversePrimary",
colorScheme.inversePrimary,
- R.attr.materialColorInversePrimary,
+ R.color.materialColorInversePrimary,
)
- addValue("secondary", colorScheme.secondary, R.attr.materialColorSecondary)
- addValue("onSecondary", colorScheme.onSecondary, R.attr.materialColorOnSecondary)
+ addValue("secondary", colorScheme.secondary, R.color.materialColorSecondary)
+ addValue("onSecondary", colorScheme.onSecondary, R.color.materialColorOnSecondary)
addValue(
"secondaryContainer",
colorScheme.secondaryContainer,
- R.attr.materialColorSecondaryContainer,
+ R.color.materialColorSecondaryContainer,
)
addValue(
"onSecondaryContainer",
colorScheme.onSecondaryContainer,
- R.attr.materialColorOnSecondaryContainer,
+ R.color.materialColorOnSecondaryContainer,
)
- addValue("tertiary", colorScheme.tertiary, R.attr.materialColorTertiary)
- addValue("onTertiary", colorScheme.onTertiary, R.attr.materialColorOnTertiary)
+ addValue("tertiary", colorScheme.tertiary, R.color.materialColorTertiary)
+ addValue("onTertiary", colorScheme.onTertiary, R.color.materialColorOnTertiary)
addValue(
"tertiaryContainer",
colorScheme.tertiaryContainer,
- R.attr.materialColorTertiaryContainer,
+ R.color.materialColorTertiaryContainer,
)
addValue(
"onTertiaryContainer",
colorScheme.onTertiaryContainer,
- R.attr.materialColorOnTertiaryContainer,
+ R.color.materialColorOnTertiaryContainer,
)
- addValue("onBackground", colorScheme.onBackground, R.attr.materialColorOnBackground)
- addValue("surface", colorScheme.surface, R.attr.materialColorSurface)
- addValue("onSurface", colorScheme.onSurface, R.attr.materialColorOnSurface)
+ addValue("onBackground", colorScheme.onBackground, R.color.materialColorOnBackground)
+ addValue("surface", colorScheme.surface, R.color.materialColorSurface)
+ addValue("onSurface", colorScheme.onSurface, R.color.materialColorOnSurface)
addValue(
"surfaceVariant",
colorScheme.surfaceVariant,
- R.attr.materialColorSurfaceVariant,
+ R.color.materialColorSurfaceVariant,
)
addValue(
"onSurfaceVariant",
colorScheme.onSurfaceVariant,
- R.attr.materialColorOnSurfaceVariant,
+ R.color.materialColorOnSurfaceVariant,
)
addValue(
"inverseSurface",
colorScheme.inverseSurface,
- R.attr.materialColorInverseSurface,
+ R.color.materialColorInverseSurface,
)
addValue(
"inverseOnSurface",
colorScheme.inverseOnSurface,
- R.attr.materialColorInverseOnSurface,
+ R.color.materialColorInverseOnSurface,
)
- addValue("error", colorScheme.error, R.attr.materialColorError)
- addValue("onError", colorScheme.onError, R.attr.materialColorOnError)
+ addValue("error", colorScheme.error, R.color.materialColorError)
+ addValue("onError", colorScheme.onError, R.color.materialColorOnError)
addValue(
"errorContainer",
colorScheme.errorContainer,
- R.attr.materialColorErrorContainer,
+ R.color.materialColorErrorContainer,
)
addValue(
"onErrorContainer",
colorScheme.onErrorContainer,
- R.attr.materialColorOnErrorContainer,
+ R.color.materialColorOnErrorContainer,
)
- addValue("outline", colorScheme.outline, R.attr.materialColorOutline)
+ addValue("outline", colorScheme.outline, R.color.materialColorOutline)
addValue(
"outlineVariant",
colorScheme.outlineVariant,
- R.attr.materialColorOutlineVariant,
+ R.color.materialColorOutlineVariant,
)
- addValue("surfaceBright", colorScheme.surfaceBright, R.attr.materialColorSurfaceBright)
- addValue("surfaceDim", colorScheme.surfaceDim, R.attr.materialColorSurfaceDim)
+ addValue("surfaceBright", colorScheme.surfaceBright, R.color.materialColorSurfaceBright)
+ addValue("surfaceDim", colorScheme.surfaceDim, R.color.materialColorSurfaceDim)
addValue(
"surfaceContainer",
colorScheme.surfaceContainer,
- R.attr.materialColorSurfaceContainer,
+ R.color.materialColorSurfaceContainer,
)
addValue(
"surfaceContainerHigh",
colorScheme.surfaceContainerHigh,
- R.attr.materialColorSurfaceContainerHigh,
+ R.color.materialColorSurfaceContainerHigh,
)
addValue(
"surfaceContainerHighest",
colorScheme.surfaceContainerHighest,
- R.attr.materialColorSurfaceContainerHighest,
+ R.color.materialColorSurfaceContainerHighest,
)
addValue(
"surfaceContainerLow",
colorScheme.surfaceContainerLow,
- R.attr.materialColorSurfaceContainerLow,
+ R.color.materialColorSurfaceContainerLow,
)
addValue(
"surfaceContainerLowest",
colorScheme.surfaceContainerLowest,
- R.attr.materialColorSurfaceContainerLowest,
+ R.color.materialColorSurfaceContainerLowest,
)
}
@@ -200,9 +200,9 @@ class PlatformThemeTest {
"MaterialTheme.colorScheme.${colorValue.name} matches attribute color"
)
.that(colorValue.materialValue)
- .isEqualTo(colorValue.attrValue)
+ .isEqualTo(colorValue.colorValue)
}
}
- private data class ColorValue(val name: String, val materialValue: Color, val attrValue: Color)
+ private data class ColorValue(val name: String, val materialValue: Color, val colorValue: Color)
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt b/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt
index 64b9f2df144b..81ae6b39e06b 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Color.kt
@@ -19,6 +19,7 @@ package com.android.systemui.common.ui.compose
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.colorResource
import com.android.compose.theme.colorAttr
/** Resolves [com.android.systemui.common.shared.model.Color] into [Color] */
@@ -28,5 +29,6 @@ fun com.android.systemui.common.shared.model.Color.toColor(): Color {
return when (this) {
is com.android.systemui.common.shared.model.Color.Attribute -> colorAttr(attribute)
is com.android.systemui.common.shared.model.Color.Loaded -> Color(color)
+ is com.android.systemui.common.shared.model.Color.Resource -> colorResource(colorRes)
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
index a55b6d720dd6..15edd0b05bfc 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
@@ -151,6 +151,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.LayoutDirection
@@ -947,12 +948,28 @@ private fun BoxScope.CommunalHubLazyGrid(
}
}
} else {
+ val itemAlpha =
+ if (communalResponsiveGrid()) {
+ val percentVisible by
+ remember(gridState, index) {
+ derivedStateOf { calculatePercentVisible(gridState, index) }
+ }
+ animateFloatAsState(percentVisible)
+ } else {
+ null
+ }
+
CommunalContent(
model = item,
viewModel = viewModel,
size = size,
selected = false,
- modifier = Modifier.requiredSize(dpSize).animateItem(),
+ modifier =
+ Modifier.requiredSize(dpSize).animateItem().thenIf(
+ communalResponsiveGrid()
+ ) {
+ Modifier.graphicsLayer { alpha = itemAlpha?.value ?: 1f }
+ },
index = index,
contentListState = contentListState,
interactionHandler = interactionHandler,
@@ -1856,6 +1873,44 @@ private fun CommunalContentModel.getSpanOrMax(maxSpan: Int?) =
size.span
}
+private fun IntRect.percentOverlap(other: IntRect): Float {
+ val intersection = intersect(other)
+ if (intersection.width < 0 || intersection.height < 0) {
+ return 0f
+ }
+ val overlapArea = intersection.width * intersection.height
+ val area = width * height
+ return overlapArea.toFloat() / area.toFloat()
+}
+
+private fun calculatePercentVisible(state: LazyGridState, index: Int): Float {
+ val viewportSize = state.layoutInfo.viewportSize
+ val visibleRect =
+ IntRect(
+ offset =
+ IntOffset(
+ state.layoutInfo.viewportStartOffset + state.layoutInfo.beforeContentPadding,
+ 0,
+ ),
+ size =
+ IntSize(
+ width =
+ viewportSize.width -
+ state.layoutInfo.beforeContentPadding -
+ state.layoutInfo.afterContentPadding,
+ height = viewportSize.height,
+ ),
+ )
+
+ val itemInfo = state.layoutInfo.visibleItemsInfo.find { it.index == index }
+ return if (itemInfo != null) {
+ val boundingBox = IntRect(itemInfo.offset, itemInfo.size)
+ boundingBox.percentOverlap(visibleRect)
+ } else {
+ 0f
+ }
+}
+
private object Colors {
val DisabledColorFilter by lazy { disabledColorMatrix() }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt
index 21b34748a364..c7930549abe8 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt
@@ -36,7 +36,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.toComposeRect
import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.Dp
@@ -45,6 +47,7 @@ import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.coerceAtMost
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.times
+import androidx.window.layout.WindowMetricsCalculator
/**
* Renders a responsive [LazyHorizontalGrid] with dynamic columns and rows. Each cell will maintain
@@ -71,7 +74,7 @@ fun ResponsiveLazyHorizontalGrid(
"$minHorizontalArrangement and $minVerticalArrangement, respectively."
}
BoxWithConstraints(modifier) {
- val gridSize = rememberGridSize(maxWidth = maxWidth, maxHeight = maxHeight)
+ val gridSize = rememberGridSize()
val layoutDirection = LocalLayoutDirection.current
val density = LocalDensity.current
@@ -128,25 +131,43 @@ fun ResponsiveLazyHorizontalGrid(
val extraWidth = maxWidth - usedWidth
val extraHeight = maxHeight - usedHeight
- val finalStartPadding = minStartPadding + extraWidth / 2
+ // If there is a single column or single row, distribute extra space evenly across the grid.
+ // Otherwise, distribute it along the content padding to center the content.
+ val distributeHorizontalSpaceAlongGutters = gridSize.height == 1 || gridSize.width == 1
+ val evenlyDistributedWidth =
+ if (distributeHorizontalSpaceAlongGutters) {
+ extraWidth / (gridSize.width + 1)
+ } else {
+ extraWidth / 2
+ }
+
+ val finalStartPadding = minStartPadding + evenlyDistributedWidth
+ val finalEndPadding = minEndPadding + evenlyDistributedWidth
val finalTopPadding = minTopPadding + extraHeight / 2
val finalContentPadding =
PaddingValues(
start = finalStartPadding,
- end = minEndPadding + extraWidth / 2,
+ end = finalEndPadding,
top = finalTopPadding,
bottom = minBottomPadding + extraHeight / 2,
)
with(density) { setContentOffset(Offset(finalStartPadding.toPx(), finalTopPadding.toPx())) }
+ val horizontalArrangement =
+ if (distributeHorizontalSpaceAlongGutters) {
+ minHorizontalArrangement + evenlyDistributedWidth
+ } else {
+ minHorizontalArrangement
+ }
+
LazyHorizontalGrid(
rows = GridCells.Fixed(gridSize.height),
modifier = Modifier.fillMaxSize(),
state = state,
contentPadding = finalContentPadding,
- horizontalArrangement = Arrangement.spacedBy(minHorizontalArrangement),
+ horizontalArrangement = Arrangement.spacedBy(horizontalArrangement),
verticalArrangement = Arrangement.spacedBy(minVerticalArrangement),
flingBehavior = flingBehavior,
userScrollEnabled = userScrollEnabled,
@@ -210,27 +231,38 @@ data class SizeInfo(
}
@Composable
-private fun rememberGridSize(maxWidth: Dp, maxHeight: Dp): IntSize {
+private fun rememberGridSize(): IntSize {
val configuration = LocalConfiguration.current
val orientation = configuration.orientation
+ val screenSize = calculateWindowSize()
- return remember(orientation, maxWidth, maxHeight) {
+ return remember(orientation, screenSize) {
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
IntSize(
- width = calculateNumCellsWidth(maxWidth),
- height = calculateNumCellsHeight(maxHeight),
+ width = calculateNumCellsWidth(screenSize.width),
+ height = calculateNumCellsHeight(screenSize.height),
)
} else {
// In landscape we invert the rows/columns to ensure we match the same area as portrait.
// This keeps the number of elements in the grid consistent when changing orientation.
IntSize(
- width = calculateNumCellsHeight(maxWidth),
- height = calculateNumCellsWidth(maxHeight),
+ width = calculateNumCellsHeight(screenSize.width),
+ height = calculateNumCellsWidth(screenSize.height),
)
}
}
}
+@Composable
+fun calculateWindowSize(): DpSize {
+ // Observe view configuration changes and recalculate the size class on each change.
+ LocalConfiguration.current
+ val density = LocalDensity.current
+ val context = LocalContext.current
+ val metrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(context)
+ return with(density) { metrics.bounds.toComposeRect().size.toDpSize() }
+}
+
private fun calculateNumCellsWidth(width: Dp) =
// See https://developer.android.com/develop/ui/views/layout/use-window-size-classes
when {
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt
index 35cdf81e8c14..59d0b55c1db8 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt
@@ -337,13 +337,6 @@ internal class SwipeAnimation<T : ContentKey>(
check(!isAnimatingOffset()) { "SwipeAnimation.animateOffset() can only be called once" }
val initialProgress = progress
- // Skip the animation if we have already reached the target content and the overscroll does
- // not animate anything.
- val hasReachedTargetContent =
- (targetContent == toContent && initialProgress >= 1f) ||
- (targetContent == fromContent && initialProgress <= 0f)
- val skipAnimation =
- hasReachedTargetContent && !contentTransition.isWithinProgressRange(initialProgress)
val targetContent =
if (targetContent != currentContent && !canChangeContent(targetContent)) {
@@ -352,6 +345,14 @@ internal class SwipeAnimation<T : ContentKey>(
targetContent
}
+ // Skip the animation if we have already reached the target content and the overscroll does
+ // not animate anything.
+ val hasReachedTargetContent =
+ (targetContent == toContent && initialProgress >= 1f) ||
+ (targetContent == fromContent && initialProgress <= 0f)
+ val skipAnimation =
+ hasReachedTargetContent && !contentTransition.isWithinProgressRange(initialProgress)
+
val targetOffset =
if (targetContent == fromContent) {
0f
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
index 2c8dc3264b7e..b20056d54de1 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
@@ -42,7 +42,6 @@ import com.android.compose.animation.scene.content.state.TransitionState.Transit
import com.android.compose.animation.scene.subjects.assertThat
import com.android.compose.test.MonotonicClockTestScope
import com.android.compose.test.runMonotonicClockTest
-import com.android.compose.test.transition
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
@@ -921,6 +920,28 @@ class DraggableHandlerTest {
}
@Test
+ fun blockTransition_animated() = runGestureTest {
+ assertIdle(SceneA)
+ layoutState.transitions = transitions { overscrollDisabled(SceneB, Orientation.Vertical) }
+
+ // Swipe up to scene B. Overscroll 50%.
+ val dragController = onDragStarted(overSlop = up(1.5f), expectedConsumedOverSlop = up(1.0f))
+ assertTransition(currentScene = SceneA, fromScene = SceneA, toScene = SceneB, progress = 1f)
+
+ // Block the transition when the user release their finger.
+ canChangeScene = { false }
+ val velocityConsumed =
+ dragController.onDragStoppedAnimateLater(velocity = -velocityThreshold)
+
+ // Start an animation: overscroll and from 1f to 0f.
+ assertTransition(currentScene = SceneA, fromScene = SceneA, toScene = SceneB, progress = 1f)
+
+ val consumed = velocityConsumed.await()
+ assertThat(consumed).isEqualTo(-velocityThreshold)
+ assertIdle(SceneA)
+ }
+
+ @Test
fun scrollFromIdleWithNoTargetScene_shouldUseOverscrollSpecIfAvailable() = runGestureTest {
layoutState.transitions = transitions {
overscroll(SceneC, Orientation.Vertical) { fade(TestElements.Foo) }
diff --git a/packages/SystemUI/lint-baseline.xml b/packages/SystemUI/lint-baseline.xml
index 43131b103e51..523adc6d3144 100644
--- a/packages/SystemUI/lint-baseline.xml
+++ b/packages/SystemUI/lint-baseline.xml
@@ -26857,8 +26857,8 @@
<issue
id="Overdraw"
- message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorOnSurfaceVariant` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
- errorLine1=" android:background=&quot;?androidprv:attr/materialColorOnSurfaceVariant&quot; />"
+ message="Possible overdraw: Root element paints background `@androidprv:color/materialColorOnSurfaceVariant` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background=&quot;@androidprv:color/materialColorOnSurfaceVariant&quot; />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="frameworks/base/packages/SystemUI/res/layout/notification_children_divider.xml"
@@ -26868,8 +26868,8 @@
<issue
id="Overdraw"
- message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainerHigh` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
- errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainerHigh&quot;"
+ message="Possible overdraw: Root element paints background `@androidprv:color/materialColorSurfaceContainerHigh` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background=&quot;@androidprv:color/materialColorSurfaceContainerHigh&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="frameworks/base/packages/SystemUI/res/layout/notification_snooze.xml"
@@ -33959,5 +33959,6 @@
file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt"
line="53"
column="5"/>
+ </issue>
</issues>
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java
index fa8cdcc4ce2b..80de087971c5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java
@@ -24,6 +24,7 @@ import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -39,6 +40,7 @@ import org.junit.Before;
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;
@@ -54,11 +56,15 @@ public class DragToInteractAnimationControllerTest extends SysuiTestCase {
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock
+ private AccessibilityManager mAccessibilityManager;
+
@Before
public void setUp() throws Exception {
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
final SecureSettings mockSecureSettings = TestUtils.mockSecureSettings();
- final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mockSecureSettings);
+ final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager,
+ mockSecureSettings);
final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext,
stubWindowManager);
final MenuView stubMenuView = spy(new MenuView(mContext, stubMenuViewModel,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java
index 7e4b6f913770..24f3a29e64ee 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java
@@ -16,11 +16,16 @@
package com.android.systemui.accessibility.floatingmenu;
+import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
+import android.content.Context;
import android.content.res.Configuration;
+import android.view.accessibility.AccessibilityManager;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -28,6 +33,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.settings.SecureSettings;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -36,6 +42,8 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Locale;
/** Tests for {@link MenuInfoRepository}. */
@@ -46,16 +54,30 @@ public class MenuInfoRepositoryTest extends SysuiTestCase {
public MockitoRule mockito = MockitoJUnit.rule();
@Mock
+ private AccessibilityManager mAccessibilityManager;
+
+ @Mock
private MenuInfoRepository.OnSettingsContentsChanged mMockSettingsContentsChanged;
@Mock
private SecureSettings mSecureSettings;
private MenuInfoRepository mMenuInfoRepository;
+ private final List<String> mShortcutTargets = new ArrayList<>();
@Before
public void setUp() {
- mMenuInfoRepository = new MenuInfoRepository(mContext, mMockSettingsContentsChanged,
- mSecureSettings);
+ mContext.addMockSystemService(Context.ACCESSIBILITY_SERVICE, mAccessibilityManager);
+ mShortcutTargets.add(MAGNIFICATION_CONTROLLER_NAME);
+ doReturn(mShortcutTargets).when(mAccessibilityManager).getAccessibilityShortcutTargets(
+ anyInt());
+
+ mMenuInfoRepository = new MenuInfoRepository(mContext, mAccessibilityManager,
+ mMockSettingsContentsChanged, mSecureSettings);
+ }
+
+ @After
+ public void tearDown() {
+ mShortcutTargets.clear();
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java
index 1f48bec97b2d..157cccc3d62f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java
@@ -83,7 +83,8 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase {
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext,
stubWindowManager);
- final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mSecureSettings);
+ final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager,
+ mSecureSettings);
final int halfScreenHeight =
stubWindowManager.getCurrentWindowMetrics().getBounds().height() / 2;
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java
index f7b81cc49f0b..46f076a75116 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java
@@ -33,6 +33,7 @@ import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.view.MotionEvent;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
import androidx.dynamicanimation.animation.DynamicAnimation;
import androidx.recyclerview.widget.RecyclerView;
@@ -52,6 +53,7 @@ import org.junit.Before;
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;
@@ -78,11 +80,15 @@ public class MenuListViewTouchHandlerTest extends SysuiTestCase {
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock
+ private AccessibilityManager mAccessibilityManager;
+
@Before
public void setUp() throws Exception {
final WindowManager windowManager = mContext.getSystemService(WindowManager.class);
final SecureSettings secureSettings = TestUtils.mockSecureSettings();
- final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, secureSettings);
+ final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager,
+ secureSettings);
final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext,
windowManager);
mStubMenuView = new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java
index c1708d175224..ee8ce17cecd4 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java
@@ -32,6 +32,7 @@ import android.graphics.drawable.GradientDrawable;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -48,6 +49,7 @@ import org.junit.Before;
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;
@@ -66,6 +68,9 @@ public class MenuViewTest extends SysuiTestCase {
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock
+ private AccessibilityManager mAccessibilityManager;
+
private SysuiTestableContext mSpyContext;
@Before
@@ -84,7 +89,8 @@ public class MenuViewTest extends SysuiTestCase {
doNothing().when(mSpyContext).startActivity(any());
final SecureSettings secureSettings = TestUtils.mockSecureSettings();
- final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, secureSettings);
+ final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager,
+ secureSettings);
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
mStubMenuViewAppearance = new MenuViewAppearance(mSpyContext, stubWindowManager);
mMenuView = spy(new MenuView(mSpyContext, stubMenuViewModel, mStubMenuViewAppearance,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
index d75c0138bcbf..ab936590de93 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
@@ -1589,7 +1589,8 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa
val logoInfo by collectLastValue(kosmos.promptViewModel.logoInfo)
assertThat(logoInfo).isNotNull()
assertThat(logoInfo!!.first).isEqualTo(defaultLogoIconWithBadge)
- assertThat(logoInfo!!.second).isEqualTo(defaultLogoDescriptionWithBadge)
+ // Logo label does not use badge info.
+ assertThat(logoInfo!!.second).isEqualTo(defaultLogoDescriptionFromAppInfo)
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
index 84d062a3e7be..831012c88f7b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
@@ -30,7 +30,6 @@ import android.view.windowManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.airbnb.lottie.model.KeyPath
-import com.android.settingslib.Utils
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider
import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
@@ -77,20 +76,14 @@ class SideFpsOverlayViewModelTest : SysuiTestCase() {
private val contextDisplayInfo = DisplayInfo()
- private val indicatorColor =
- Utils.getColorAttrDefaultColor(
- context,
- com.android.internal.R.attr.materialColorPrimaryFixed,
+ private val indicatorColor = context.getColor(
+ com.android.internal.R.color.materialColorPrimaryFixed,
)
- private val outerRimColor =
- Utils.getColorAttrDefaultColor(
- context,
- com.android.internal.R.attr.materialColorPrimaryFixedDim,
+ private val outerRimColor = context.getColor(
+ com.android.internal.R.color.materialColorPrimaryFixedDim,
)
- private val chevronFill =
- Utils.getColorAttrDefaultColor(
- context,
- com.android.internal.R.attr.materialColorOnPrimaryFixed,
+ private val chevronFill = context.getColor(
+ com.android.internal.R.color.materialColorOnPrimaryFixed,
)
private val color_blue400 =
context.getColor(com.android.settingslib.color.R.color.settingslib_color_blue400)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/OWNERS b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/OWNERS
new file mode 100644
index 000000000000..2355c48158f7
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 1562219
+chrisgollner@google.com
+jmokut@google.com \ No newline at end of file
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt
index 969dacec65a1..7dc7016e5e74 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/source/TestShortcuts.kt
@@ -40,7 +40,6 @@ import com.android.systemui.keyboard.shortcut.shared.model.KeyCombination
import com.android.systemui.keyboard.shortcut.shared.model.Shortcut
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategory
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType
-import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.AppCategories
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.MultiTasking
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.System
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCommand
@@ -553,18 +552,8 @@ object TestShortcuts {
simpleShortcutCategory(
MultiTasking,
"Split screen",
- "Switch to app on left or above while using split screen",
- ),
- simpleShortcutCategory(
- MultiTasking,
- "Split screen",
"Use split screen with app on the right",
),
- simpleShortcutCategory(
- MultiTasking,
- "Split screen",
- "Switch to app on right or below while using split screen",
- ),
simpleShortcutCategory(System, "System controls", "Show shortcuts"),
simpleShortcutCategory(System, "System controls", "View recent apps"),
)
@@ -595,15 +584,9 @@ object TestShortcuts {
keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT
),
simpleInputGestureData(
- keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT
- ),
- simpleInputGestureData(
keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT
),
simpleInputGestureData(
- keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT
- ),
- simpleInputGestureData(
keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER
),
simpleInputGestureData(keyGestureType = KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS),
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
index 5e9badc58d8b..4dbe7c8bdb5a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
@@ -28,6 +28,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.kosmos.testScope
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.shade.shadeTestUtil
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
@@ -171,8 +172,10 @@ class AodToLockscreenTransitionViewModelTest(flags: FlagsParameterization) : Sys
// WHEN transition is cancelled
repository.sendTransitionStep(step(.1f, TransitionState.CANCELED))
- // THEN alpha is immediately set to 1f (expected lockscreen alpha state)
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f)
+ // THEN alpha updates according to whether the scene framework is enabled (CANCELED is
+ // ignored when the scene framework is enabled).
+ assertThat(deviceEntryBackgroundViewAlpha)
+ .isEqualTo(if (SceneContainerFlag.isEnabled) 0f else 1f)
}
@Test
@@ -195,14 +198,14 @@ class AodToLockscreenTransitionViewModelTest(flags: FlagsParameterization) : Sys
private fun step(
value: Float,
- state: TransitionState = TransitionState.RUNNING
+ state: TransitionState = TransitionState.RUNNING,
): TransitionStep {
return TransitionStep(
from = KeyguardState.AOD,
to = KeyguardState.LOCKSCREEN,
value = value,
transitionState = state,
- ownerName = "AodToLockscreenTransitionViewModelTest"
+ ownerName = "AodToLockscreenTransitionViewModelTest",
)
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
index d0da2e9671c0..576795d7e293 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
@@ -38,6 +38,7 @@ import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.shade.ShadeTestUtil
import com.android.systemui.shade.shadeTestUtil
import com.android.systemui.testKosmos
@@ -178,11 +179,13 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization)
),
testScope = testScope,
)
- assertThat(values.size).isEqualTo(3)
+ assertThat(values.size).isEqualTo(if (SceneContainerFlag.isEnabled) 2 else 3)
values.forEach { assertThat(it).isIn(Range.closed(0f, 100f)) }
- // Cancel will reset the translation
- assertThat(values[2]).isEqualTo(0)
+ // When the scene framework is not enabled, cancel will reset the translation
+ if (!SceneContainerFlag.isEnabled) {
+ assertThat(values.last()).isEqualTo(0f)
+ }
}
@Test
@@ -242,8 +245,9 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization)
// WHEN transition is canceled
repository.sendTransitionStep(step(1f, TransitionState.CANCELED))
- // THEN alpha is immediately set to 0f
- assertThat(actual).isEqualTo(0f)
+ // THEN alpha updates according to whether the scene framework is enabled (CANCELED is
+ // ignored when the scene framework is enabled).
+ assertThat(actual).isEqualTo(if (SceneContainerFlag.isEnabled) 1f else 0f)
}
private fun step(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt
index ae7c44e9b146..8b9ae9a0606d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt
@@ -39,7 +39,7 @@ class EditTileListStateTest : SysuiTestCase() {
@Test
fun startDrag_listHasSpacers() {
- underTest.onStarted(TestEditTiles[0])
+ underTest.onStarted(TestEditTiles[0], DragType.Add)
// [ a ] [ b ] [ c ] [ X ]
// [ Large D ] [ e ] [ X ]
@@ -51,8 +51,8 @@ class EditTileListStateTest : SysuiTestCase() {
@Test
fun moveDrag_listChanges() {
- underTest.onStarted(TestEditTiles[4])
- underTest.onMoved(3, false)
+ underTest.onStarted(TestEditTiles[4], DragType.Add)
+ underTest.onTargeting(3, false)
// Tile E goes to index 3
// [ a ] [ b ] [ c ] [ e ]
@@ -65,8 +65,8 @@ class EditTileListStateTest : SysuiTestCase() {
fun moveDragOnSidesOfLargeTile_listChanges() {
val draggedCell = TestEditTiles[4]
- underTest.onStarted(draggedCell)
- underTest.onMoved(4, true)
+ underTest.onStarted(draggedCell, DragType.Add)
+ underTest.onTargeting(4, true)
// Tile E goes to the right side of tile D, list is unchanged
// [ a ] [ b ] [ c ] [ X ]
@@ -74,7 +74,7 @@ class EditTileListStateTest : SysuiTestCase() {
assertThat(underTest.tiles.toStrings())
.isEqualTo(listOf("a", "b", "c", "spacer", "d", "e", "spacer"))
- underTest.onMoved(4, false)
+ underTest.onTargeting(4, false)
// Tile E goes to the left side of tile D, they swap positions
// [ a ] [ b ] [ c ] [ e ]
@@ -87,8 +87,8 @@ class EditTileListStateTest : SysuiTestCase() {
fun moveNewTile_tileIsAdded() {
val newTile = createEditTile("newTile", 2)
- underTest.onStarted(newTile)
- underTest.onMoved(5, false)
+ underTest.onStarted(newTile, DragType.Add)
+ underTest.onTargeting(5, false)
// New tile goes to index 5
// [ a ] [ b ] [ c ] [ X ]
@@ -102,7 +102,7 @@ class EditTileListStateTest : SysuiTestCase() {
@Test
fun movedTileOutOfBounds_tileDisappears() {
- underTest.onStarted(TestEditTiles[0])
+ underTest.onStarted(TestEditTiles[0], DragType.Add)
underTest.movedOutOfBounds()
assertThat(underTest.tiles.toStrings()).doesNotContain(TestEditTiles[0].tile.tileSpec.spec)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt
index 583db722a759..bbfa7e7a81ee 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt
@@ -21,6 +21,7 @@ import android.content.ComponentName
import android.graphics.drawable.TestStubDrawable
import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
+import com.android.internal.logging.uiEventLoggerFake
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.shared.model.ContentDescription
@@ -29,9 +30,12 @@ import com.android.systemui.common.shared.model.Text
import com.android.systemui.common.ui.compose.toAnnotatedString
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.runCurrent
+import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.FakeQSFactory
import com.android.systemui.qs.FakeQSTile
+import com.android.systemui.qs.QSEditEvent
import com.android.systemui.qs.panels.data.repository.stockTilesRepository
import com.android.systemui.qs.panels.domain.interactor.FakeTileAvailabilityInteractor
import com.android.systemui.qs.panels.domain.interactor.tileAvailabilityInteractorsMap
@@ -42,8 +46,10 @@ import com.android.systemui.qs.pipeline.data.repository.fakeInstalledTilesReposi
import com.android.systemui.qs.pipeline.data.repository.fakeMinimumTilesRepository
import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor
import com.android.systemui.qs.pipeline.shared.TileSpec
+import com.android.systemui.qs.pipeline.shared.metricSpec
import com.android.systemui.qs.qsTileFactory
import com.android.systemui.qs.shared.model.TileCategory
+import com.android.systemui.qs.tiles.impl.airplane.qsAirplaneModeTileConfig
import com.android.systemui.qs.tiles.impl.alarm.qsAlarmTileConfig
import com.android.systemui.qs.tiles.impl.battery.qsBatterySaverTileConfig
import com.android.systemui.qs.tiles.impl.flashlight.qsFlashlightTileConfig
@@ -86,6 +92,7 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
qsFlashlightTileConfig,
qsBatterySaverTileConfig,
qsAlarmTileConfig,
+ qsAirplaneModeTileConfig,
qsCameraSensorPrivacyToggleTileConfig,
qsMicrophoneSensorPrivacyToggleTileConfig,
)
@@ -116,7 +123,7 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
fakeInstalledTilesRepository.setInstalledServicesForUser(
userTracker.userId,
- listOf(serviceInfo1, serviceInfo2)
+ listOf(serviceInfo1, serviceInfo2),
)
with(fakeQSTileConfigProvider) { configs.forEach { putConfig(it.tileSpec, it) } }
@@ -424,10 +431,7 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
testScope.runTest {
val tiles by collectLastValue(underTest.tiles)
val currentTiles =
- mutableListOf(
- TileSpec.create("flashlight"),
- TileSpec.create("airplane"),
- )
+ mutableListOf(TileSpec.create("flashlight"), TileSpec.create("airplane"))
currentTilesInteractor.setTiles(currentTiles)
assertThat(currentTiles.size).isLessThan(minNumberOfTiles)
@@ -549,6 +553,156 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
}
}
+ // UI EVENT TESTS
+
+ @Test
+ fun startEditing_onlyOneEvent() =
+ kosmos.runTest {
+ underTest.startEditing()
+ underTest.startEditing()
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+
+ assertThat(uiEventLoggerFake[0].eventId).isEqualTo(QSEditEvent.QS_EDIT_OPEN.id)
+ }
+
+ @Test
+ fun stopEditing_notEditing_noEvent() =
+ kosmos.runTest {
+ underTest.stopEditing()
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(0)
+ }
+
+ @Test
+ fun stopEditing_whenEditing_correctEvent() =
+ kosmos.runTest {
+ underTest.startEditing()
+ underTest.stopEditing()
+
+ assertThat(uiEventLoggerFake[1].eventId).isEqualTo(QSEditEvent.QS_EDIT_CLOSED.id)
+ }
+
+ @Test
+ fun addTile_correctPackageAndPosition() =
+ kosmos.runTest {
+ val flashlightTile = TileSpec.create("flashlight")
+ val airplaneTile = TileSpec.create("airplane")
+ val internetTile = TileSpec.create("internet")
+ val customTile = TileSpec.create(component2)
+ currentTilesInteractor.setTiles(listOf(flashlightTile))
+ runCurrent()
+
+ underTest.addTile(airplaneTile)
+ underTest.addTile(internetTile, position = 0)
+ underTest.addTile(customTile, position = 1)
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(3)
+
+ with(uiEventLoggerFake[0]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_ADD.id)
+ assertThat(packageName).isEqualTo(airplaneTile.metricSpec)
+ assertThat(position).isEqualTo(-1)
+ }
+ with(uiEventLoggerFake[1]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_ADD.id)
+ assertThat(packageName).isEqualTo(internetTile.metricSpec)
+ assertThat(position).isEqualTo(0)
+ }
+ with(uiEventLoggerFake[2]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_ADD.id)
+ assertThat(packageName).isEqualTo(customTile.metricSpec)
+ assertThat(position).isEqualTo(1)
+ }
+ }
+
+ @Test
+ fun addTile_alreadyThere_usesMoveEvent() =
+ kosmos.runTest {
+ val flashlightTile = TileSpec.create("flashlight")
+ val airplaneTile = TileSpec.create("airplane")
+ val internetTile = TileSpec.create("internet")
+ currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile))
+ runCurrent()
+
+ underTest.addTile(flashlightTile) // adding at the end, should use correct position
+ underTest.addTile(internetTile, 0)
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(2)
+
+ with(uiEventLoggerFake[0]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_MOVE.id)
+ assertThat(packageName).isEqualTo(flashlightTile.metricSpec)
+ // adding at the end, should use correct position
+ assertThat(position).isEqualTo(2)
+ }
+ with(uiEventLoggerFake[1]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_MOVE.id)
+ assertThat(packageName).isEqualTo(internetTile.metricSpec)
+ assertThat(position).isEqualTo(0)
+ }
+ }
+
+ @Test
+ fun removeTileEvent() =
+ kosmos.runTest {
+ val flashlightTile = TileSpec.create("flashlight")
+ val airplaneTile = TileSpec.create("airplane")
+ val internetTile = TileSpec.create("internet")
+ currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile))
+ runCurrent()
+
+ underTest.removeTile(airplaneTile)
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+
+ with(uiEventLoggerFake[0]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_REMOVE.id)
+ assertThat(packageName).isEqualTo(airplaneTile.metricSpec)
+ }
+ }
+
+ @Test
+ fun setTiles_emitsCorrectOperation_individualOperations() =
+ kosmos.runTest {
+ val flashlightTile = TileSpec.create("flashlight")
+ val airplaneTile = TileSpec.create("airplane")
+ val internetTile = TileSpec.create("internet")
+ val alarmTile = TileSpec.create("alarm")
+
+ currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile))
+ runCurrent()
+
+ // 0. Move flashlightTile to position 2
+ underTest.setTiles(listOf(airplaneTile, internetTile, flashlightTile))
+ runCurrent()
+
+ // 1. Add alarm tile at position 1
+ underTest.setTiles(listOf(airplaneTile, alarmTile, internetTile, flashlightTile))
+ runCurrent()
+
+ // 2. Remove internetTile
+ underTest.setTiles(listOf(airplaneTile, alarmTile, flashlightTile))
+ runCurrent()
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(3)
+
+ with(uiEventLoggerFake[0]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_MOVE.id)
+ assertThat(packageName).isEqualTo(flashlightTile.metricSpec)
+ assertThat(position).isEqualTo(2)
+ }
+ with(uiEventLoggerFake[1]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_ADD.id)
+ assertThat(packageName).isEqualTo(alarmTile.metricSpec)
+ assertThat(position).isEqualTo(1)
+ }
+ with(uiEventLoggerFake[2]) {
+ assertThat(eventId).isEqualTo(QSEditEvent.QS_EDIT_REMOVE.id)
+ assertThat(packageName).isEqualTo(internetTile.metricSpec)
+ }
+ }
+
companion object {
private val drawable1 = TestStubDrawable("drawable1")
private val appName1 = "App1"
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
index 869ab6c24fce..1fc1c0fd1e6b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
@@ -85,6 +85,24 @@ class TileSpecTest : SysuiTestCase() {
assertThat(TileSpec.create("")).isEqualTo(TileSpec.Invalid)
}
+ @Test
+ fun metricSpec_invalid() {
+ assertThat(TileSpec.Invalid.metricSpec).isEmpty()
+ }
+
+ @Test
+ fun metricSpec_platform_specName() {
+ val tile = "spec"
+ assertThat(TileSpec.create(tile).metricSpec).isEqualTo(tile)
+ }
+
+ @Test
+ fun metricSpec_custom_packageName() {
+ val componentName = ComponentName("test_pkg", "test_cls")
+
+ assertThat(TileSpec.create(componentName).metricSpec).isEqualTo(componentName.packageName)
+ }
+
companion object {
private const val CUSTOM_TILE_PREFIX = "custom("
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt
index ef1ae093bcc9..fd9f5f02ee62 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt
@@ -25,6 +25,7 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.display.data.repository.display
import com.android.systemui.display.data.repository.displayRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.testKosmos
@@ -38,17 +39,31 @@ import org.junit.runner.RunWith
class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
private val kosmos = testKosmos().useUnconfinedTestDispatcher()
private val testScope = kosmos.testScope
+ private val keyguardRepository = kosmos.fakeKeyguardRepository
private val displayRepository = kosmos.displayRepository
- val underTest = StatusBarTouchShadeDisplayPolicy(displayRepository, testScope.backgroundScope)
+
+ private fun createUnderTest(
+ shadeOnDefaultDisplayWhenLocked: Boolean = false
+ ): StatusBarTouchShadeDisplayPolicy {
+ return StatusBarTouchShadeDisplayPolicy(
+ displayRepository,
+ keyguardRepository,
+ testScope.backgroundScope,
+ shadeOnDefaultDisplayWhenLocked = shadeOnDefaultDisplayWhenLocked,
+ )
+ }
@Test
fun displayId_defaultToDefaultDisplay() {
+ val underTest = createUnderTest()
+
assertThat(underTest.displayId.value).isEqualTo(Display.DEFAULT_DISPLAY)
}
@Test
fun onStatusBarTouched_called_updatesDisplayId() =
testScope.runTest {
+ val underTest = createUnderTest()
val displayId by collectLastValue(underTest.displayId)
displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
@@ -60,6 +75,7 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
@Test
fun onStatusBarTouched_notExistentDisplay_displayIdNotUpdated() =
testScope.runTest {
+ val underTest = createUnderTest()
val displayIds by collectValues(underTest.displayId)
assertThat(displayIds).isEqualTo(listOf(Display.DEFAULT_DISPLAY))
@@ -72,6 +88,7 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
@Test
fun onStatusBarTouched_afterDisplayRemoved_goesBackToDefaultDisplay() =
testScope.runTest {
+ val underTest = createUnderTest()
val displayId by collectLastValue(underTest.displayId)
displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
@@ -83,4 +100,40 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY)
}
+
+ @Test
+ fun onStatusBarTouched_afterKeyguardVisible_goesBackToDefaultDisplay() =
+ testScope.runTest {
+ val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true)
+ val displayId by collectLastValue(underTest.displayId)
+
+ displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
+ underTest.onStatusBarTouched(2)
+
+ assertThat(displayId).isEqualTo(2)
+
+ keyguardRepository.setKeyguardShowing(true)
+
+ assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY)
+ }
+
+ @Test
+ fun onStatusBarTouched_afterKeyguardHides_goesBackToPreviousDisplay() =
+ testScope.runTest {
+ val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true)
+ val displayId by collectLastValue(underTest.displayId)
+
+ displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
+ underTest.onStatusBarTouched(2)
+
+ assertThat(displayId).isEqualTo(2)
+
+ keyguardRepository.setKeyguardShowing(true)
+
+ assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY)
+
+ keyguardRepository.setKeyguardShowing(false)
+
+ assertThat(displayId).isEqualTo(2)
+ }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt
index a8d5c31873de..e93d0effe742 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt
@@ -16,32 +16,26 @@
package com.android.systemui.shade.domain.interactor
-import android.content.mockedContext
import android.content.res.Configuration
import android.content.res.mockResources
import android.view.Display
-import android.view.mockWindowManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.scene.ui.view.mockShadeRootView
import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository
import com.android.systemui.testKosmos
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.advanceUntilIdle
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito.inOrder
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
-import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.whenever
-@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
@SmallTest
class ShadeDisplaysInteractorTest : SysuiTestCase() {
@@ -49,9 +43,7 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() {
private val shadeRootview = kosmos.mockShadeRootView
private val positionRepository = kosmos.fakeShadeDisplaysRepository
- private val shadeContext = kosmos.mockedContext
- private val testScope = kosmos.testScope
- private val shadeWm = kosmos.mockWindowManager
+ private val shadeContext = kosmos.mockedWindowContext
private val resources = kosmos.mockResources
private val configuration = mock<Configuration>()
private val display = mock<Display>()
@@ -66,8 +58,8 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() {
whenever(resources.configuration).thenReturn(configuration)
whenever(shadeContext.displayId).thenReturn(0)
- whenever(shadeContext.getSystemService(any())).thenReturn(shadeWm)
whenever(shadeContext.resources).thenReturn(resources)
+ whenever(shadeContext.display).thenReturn(display)
}
@Test
@@ -77,7 +69,7 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() {
underTest.start()
- verifyNoMoreInteractions(shadeWm)
+ verify(shadeContext, never()).reparentToDisplay(any())
}
@Test
@@ -87,24 +79,6 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() {
underTest.start()
- inOrder(shadeWm).apply {
- verify(shadeWm).removeView(eq(shadeRootview))
- verify(shadeWm).addView(eq(shadeRootview), any())
- }
- }
-
- @Test
- fun start_shadePositionChanges_removedThenAdded() {
- whenever(display.displayId).thenReturn(0)
- positionRepository.setDisplayId(0)
- underTest.start()
-
- positionRepository.setDisplayId(1)
- testScope.advanceUntilIdle()
-
- inOrder(shadeWm).apply {
- verify(shadeWm).removeView(eq(shadeRootview))
- verify(shadeWm).addView(eq(shadeRootview), any())
- }
+ verify(shadeContext).reparentToDisplay(eq(1))
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
index f06bab756acc..63efc55e1a09 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
@@ -29,6 +29,7 @@ import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.chips.notification.domain.model.NotificationChipModel
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.notification.data.model.activeNotificationModel
+import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import org.junit.Test
@@ -46,7 +47,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
kosmos.runTest {
val icon = mock<StatusBarIconView>()
val startingNotif =
- activeNotificationModel(key = "notif1", statusBarChipIcon = icon, whenTime = 5432)
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = icon,
+ whenTime = 5432,
+ promotedContent = PROMOTED_CONTENT,
+ )
val underTest = factory.create(startingNotif)
@@ -63,7 +69,11 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
val originalIconView = mock<StatusBarIconView>()
val underTest =
factory.create(
- activeNotificationModel(key = "notif1", statusBarChipIcon = originalIconView)
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = originalIconView,
+ promotedContent = PROMOTED_CONTENT,
+ )
)
val latest by collectLastValue(underTest.notificationChip)
@@ -74,6 +84,7 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
key = "notif1",
statusBarChipIcon = newIconView,
whenTime = 6543,
+ promotedContent = PROMOTED_CONTENT,
)
)
@@ -88,14 +99,22 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
val originalIconView = mock<StatusBarIconView>()
val underTest =
factory.create(
- activeNotificationModel(key = "notif1", statusBarChipIcon = originalIconView)
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = originalIconView,
+ promotedContent = PROMOTED_CONTENT,
+ )
)
val latest by collectLastValue(underTest.notificationChip)
val newIconView = mock<StatusBarIconView>()
underTest.setNotification(
- activeNotificationModel(key = "other_notif", statusBarChipIcon = newIconView)
+ activeNotificationModel(
+ key = "other_notif",
+ statusBarChipIcon = newIconView,
+ promotedContent = PROMOTED_CONTENT,
+ )
)
assertThat(latest!!.key).isEqualTo("notif1")
@@ -103,10 +122,43 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
}
@Test
+ fun notificationChip_ignoresSetWithNullPromotedContent() =
+ kosmos.runTest {
+ val originalIconView = mock<StatusBarIconView>()
+ val underTest =
+ factory.create(
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = originalIconView,
+ promotedContent = PROMOTED_CONTENT,
+ )
+ )
+
+ val latest by collectLastValue(underTest.notificationChip)
+
+ val newIconView = mock<StatusBarIconView>()
+ underTest.setNotification(
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = newIconView,
+ promotedContent = null,
+ )
+ )
+
+ assertThat(latest!!.statusBarChipIconView).isEqualTo(originalIconView)
+ }
+
+ @Test
fun notificationChip_missingStatusBarIconChipView_inConstructor_emitsNull() =
kosmos.runTest {
val underTest =
- factory.create(activeNotificationModel(key = "notif1", statusBarChipIcon = null))
+ factory.create(
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = null,
+ promotedContent = PROMOTED_CONTENT,
+ )
+ )
val latest by collectLastValue(underTest.notificationChip)
@@ -123,6 +175,7 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
key = "notif1",
statusBarChipIcon = null,
whenTime = 123L,
+ promotedContent = PROMOTED_CONTENT,
)
)
@@ -130,20 +183,34 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
assertThat(latest)
.isEqualTo(
- NotificationChipModel("notif1", statusBarChipIconView = null, whenTime = 123L)
+ NotificationChipModel(
+ "notif1",
+ statusBarChipIconView = null,
+ whenTime = 123L,
+ promotedContent = PROMOTED_CONTENT,
+ )
)
}
@Test
fun notificationChip_missingStatusBarIconChipView_inSet_emitsNull() =
kosmos.runTest {
- val startingNotif = activeNotificationModel(key = "notif1", statusBarChipIcon = mock())
+ val startingNotif =
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = mock(),
+ promotedContent = PROMOTED_CONTENT,
+ )
val underTest = factory.create(startingNotif)
val latest by collectLastValue(underTest.notificationChip)
assertThat(latest).isNotNull()
underTest.setNotification(
- activeNotificationModel(key = "notif1", statusBarChipIcon = null)
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = null,
+ promotedContent = PROMOTED_CONTENT,
+ )
)
assertThat(latest).isNull()
@@ -153,13 +220,23 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
@EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
fun notificationChip_missingStatusBarIconChipView_inSet_cdEnabled_emitsNotNull() =
kosmos.runTest {
- val startingNotif = activeNotificationModel(key = "notif1", statusBarChipIcon = mock())
+ val startingNotif =
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = mock(),
+ promotedContent = PROMOTED_CONTENT,
+ )
val underTest = factory.create(startingNotif)
val latest by collectLastValue(underTest.notificationChip)
assertThat(latest).isNotNull()
underTest.setNotification(
- activeNotificationModel(key = "notif1", statusBarChipIcon = null, whenTime = 123L)
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = null,
+ whenTime = 123L,
+ promotedContent = PROMOTED_CONTENT,
+ )
)
assertThat(latest)
@@ -168,8 +245,26 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
key = "notif1",
statusBarChipIconView = null,
whenTime = 123L,
+ promotedContent = PROMOTED_CONTENT,
+ )
+ )
+ }
+
+ @Test
+ fun notificationChip_missingPromotedContent_inConstructor_emitsNull() =
+ kosmos.runTest {
+ val underTest =
+ factory.create(
+ activeNotificationModel(
+ key = "notif1",
+ statusBarChipIcon = mock(),
+ promotedContent = null,
)
)
+
+ val latest by collectLastValue(underTest.notificationChip)
+
+ assertThat(latest).isNull()
}
@Test
@@ -179,7 +274,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
val underTest =
factory.create(
- activeNotificationModel(key = "notif", uid = UID, statusBarChipIcon = mock())
+ activeNotificationModel(
+ key = "notif",
+ uid = UID,
+ statusBarChipIcon = mock(),
+ promotedContent = PROMOTED_CONTENT,
+ )
)
val latest by collectLastValue(underTest.notificationChip)
@@ -194,7 +294,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
val underTest =
factory.create(
- activeNotificationModel(key = "notif", uid = UID, statusBarChipIcon = mock())
+ activeNotificationModel(
+ key = "notif",
+ uid = UID,
+ statusBarChipIcon = mock(),
+ promotedContent = PROMOTED_CONTENT,
+ )
)
val latest by collectLastValue(underTest.notificationChip)
@@ -207,7 +312,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
kosmos.runTest {
val underTest =
factory.create(
- activeNotificationModel(key = "notif", uid = UID, statusBarChipIcon = mock())
+ activeNotificationModel(
+ key = "notif",
+ uid = UID,
+ statusBarChipIcon = mock(),
+ promotedContent = PROMOTED_CONTENT,
+ )
)
val latest by collectLastValue(underTest.notificationChip)
@@ -239,6 +349,7 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
key = "notif",
uid = hiddenUid,
statusBarChipIcon = mock(),
+ promotedContent = PROMOTED_CONTENT,
)
)
val latest by collectLastValue(underTest.notificationChip)
@@ -247,7 +358,12 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
// WHEN the notif gets a new UID that starts as visible
activityManagerRepository.fake.startingIsAppVisibleValue = true
underTest.setNotification(
- activeNotificationModel(key = "notif", uid = shownUid, statusBarChipIcon = mock())
+ activeNotificationModel(
+ key = "notif",
+ uid = shownUid,
+ statusBarChipIcon = mock(),
+ promotedContent = PROMOTED_CONTENT,
+ )
)
// THEN we re-fetch the app visibility state with the new UID, and since that UID is
@@ -257,5 +373,6 @@ class SingleNotificationChipInteractorTest : SysuiTestCase() {
companion object {
private const val UID = 885
+ private val PROMOTED_CONTENT = PromotedNotificationContentModel.Builder("notif1").build()
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
index 8a4ddceb0d3a..b174fcee779c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
@@ -28,6 +28,7 @@ import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.chips.notification.domain.interactor.statusBarNotificationChipsInteractor
import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
+import com.android.systemui.statusbar.chips.ui.model.ColorsModel
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.notification.data.model.activeNotificationModel
@@ -132,6 +133,36 @@ class NotifChipsViewModelTest : SysuiTestCase() {
}
@Test
+ fun chips_onePromotedNotif_colorMatches() =
+ kosmos.runTest {
+ val latest by collectLastValue(underTest.chips)
+
+ val promotedContentBuilder =
+ PromotedNotificationContentModel.Builder("notif").apply {
+ this.colors =
+ PromotedNotificationContentModel.Colors(
+ backgroundColor = 56,
+ primaryTextColor = 89,
+ )
+ }
+ setNotifs(
+ listOf(
+ activeNotificationModel(
+ key = "notif",
+ statusBarChipIcon = mock<StatusBarIconView>(),
+ promotedContent = promotedContentBuilder.build(),
+ )
+ )
+ )
+
+ assertThat(latest).hasSize(1)
+ val colors = latest!![0].colors
+ assertThat(colors).isInstanceOf(ColorsModel.Custom::class.java)
+ assertThat((colors as ColorsModel.Custom).backgroundColorInt).isEqualTo(56)
+ assertThat((colors as ColorsModel.Custom).primaryTextColorInt).isEqualTo(89)
+ }
+
+ @Test
fun chips_onlyForPromotedNotifs() =
kosmos.runTest {
val latest by collectLastValue(underTest.chips)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
index c9ca67e6af94..615f4b01df9b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
@@ -78,7 +78,7 @@ public class FooterViewTest extends SysuiTestCase {
public void setUp() {
if (NotifRedesignFooter.isEnabled()) {
mView = (FooterView) LayoutInflater.from(mSpyContext).inflate(
- R.layout.status_bar_notification_footer_redesign, null, false);
+ R.layout.notification_2025_footer, null, false);
} else {
mView = (FooterView) LayoutInflater.from(mSpyContext).inflate(
R.layout.status_bar_notification_footer, null, false);
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
index 46c360aecd48..be20bc1bf9d4 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
@@ -225,16 +225,12 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati
val displayId = 123
darkIconRepository.darkState(displayId).value =
SysuiDarkIconDispatcher.DarkChange(emptyList(), 0f, 0xAABBCC)
- val iconColorsLookup by collectLastValue(underTest.iconColors(displayId))
- assertThat(iconColorsLookup).isNotNull()
-
- val iconColors = iconColorsLookup?.iconColors(Rect())
+ val iconColors by collectLastValue(underTest.iconColors(displayId))
assertThat(iconColors).isNotNull()
- iconColors!!
- assertThat(iconColors.tint).isEqualTo(0xAABBCC)
+ assertThat(iconColors!!.tint).isEqualTo(0xAABBCC)
- val staticDrawableColor = iconColors.staticDrawableColor(Rect())
+ val staticDrawableColor = iconColors!!.staticDrawableColor(Rect())
assertThat(staticDrawableColor).isEqualTo(0xAABBCC)
}
@@ -245,8 +241,7 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati
val displayId = 321
darkIconRepository.darkState(displayId).value =
SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC)
- val iconColorsLookup by collectLastValue(underTest.iconColors(displayId))
- val iconColors = iconColorsLookup?.iconColors(Rect(1, 1, 4, 4))
+ val iconColors by collectLastValue(underTest.iconColors(displayId))
val staticDrawableColor = iconColors?.staticDrawableColor(Rect(6, 6, 7, 7))
assertThat(staticDrawableColor).isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT)
}
@@ -257,9 +252,9 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati
val displayId = 987
darkIconRepository.darkState(displayId).value =
SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC)
- val iconColorsLookup by collectLastValue(underTest.iconColors(displayId))
- val iconColors = iconColorsLookup?.iconColors(Rect(6, 6, 7, 7))
- assertThat(iconColors).isNull()
+ val iconColors by collectLastValue(underTest.iconColors(displayId))
+ assertThat(iconColors!!.staticDrawableColor(Rect(6, 6, 7, 7)))
+ .isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT)
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt
index 9f98fd4c8508..5a5ec90a5f44 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt
@@ -21,9 +21,8 @@ import android.testing.TestableLooper.RunWithLooper
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.settingslib.Utils
-import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
+import com.android.systemui.res.R
import com.android.systemui.statusbar.notification.FakeShadowView
import com.android.systemui.statusbar.notification.NotificationUtils
import com.android.systemui.statusbar.notification.SourceType
@@ -62,8 +61,8 @@ class ActivatableNotificationViewTest : SysuiTestCase() {
} as T?
}
- mNormalColor = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorSurfaceContainerHigh)
+ mNormalColor =
+ mContext.getColor(com.android.internal.R.color.materialColorSurfaceContainerHigh)
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
deleted file mode 100644
index 41782a123f14..000000000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.systemui.statusbar.phone;
-
-import static android.view.Display.DEFAULT_DISPLAY;
-
-import static com.android.systemui.statusbar.notification.interruption.VisualInterruptionType.BUBBLE;
-import static com.android.systemui.statusbar.notification.interruption.VisualInterruptionType.PEEK;
-import static com.android.systemui.statusbar.notification.interruption.VisualInterruptionType.PULSE;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.app.StatusBarManager;
-import android.platform.test.annotations.DisableFlags;
-import android.platform.test.annotations.EnableFlags;
-import android.testing.TestableLooper;
-import android.testing.TestableLooper.RunWithLooper;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.InitController;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.power.domain.interactor.PowerInteractor;
-import com.android.systemui.settings.FakeDisplayTracker;
-import com.android.systemui.shade.NotificationShadeWindowView;
-import com.android.systemui.shade.QuickSettingsController;
-import com.android.systemui.shade.ShadeController;
-import com.android.systemui.shade.ShadeViewController;
-import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.LockscreenShadeTransitionController;
-import com.android.systemui.statusbar.NotificationLockscreenUserManager;
-import com.android.systemui.statusbar.NotificationMediaManager;
-import com.android.systemui.statusbar.NotificationRemoteInputManager;
-import com.android.systemui.statusbar.NotificationShadeWindowController;
-import com.android.systemui.statusbar.SysuiStatusBarStateController;
-import com.android.systemui.statusbar.notification.DynamicPrivacyController;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
-import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;
-import com.android.systemui.statusbar.notification.domain.interactor.NotificationAlertsInteractor;
-import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor;
-import com.android.systemui.statusbar.notification.interruption.VisualInterruptionCondition;
-import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider;
-import com.android.systemui.statusbar.notification.interruption.VisualInterruptionFilter;
-import com.android.systemui.statusbar.notification.interruption.VisualInterruptionRefactor;
-import com.android.systemui.statusbar.notification.interruption.VisualInterruptionType;
-import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
-import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
-import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
-import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
-import com.android.systemui.statusbar.notification.headsup.HeadsUpManager;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-
-import java.util.List;
-import java.util.Set;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@RunWithLooper()
-public class StatusBarNotificationPresenterTest extends SysuiTestCase {
- private StatusBarNotificationPresenter mStatusBarNotificationPresenter;
- private final VisualInterruptionDecisionProvider mVisualInterruptionDecisionProvider =
- mock(VisualInterruptionDecisionProvider.class);
- private NotificationInterruptSuppressor mInterruptSuppressor;
- private VisualInterruptionCondition mAlertsDisabledCondition;
- private VisualInterruptionCondition mVrModeCondition;
- private VisualInterruptionFilter mNeedsRedactionFilter;
- private VisualInterruptionCondition mPanelsDisabledCondition;
- private CommandQueue mCommandQueue;
- private final ShadeController mShadeController = mock(ShadeController.class);
- private final NotificationAlertsInteractor mNotificationAlertsInteractor =
- mock(NotificationAlertsInteractor.class);
- private final KeyguardStateController mKeyguardStateController =
- mock(KeyguardStateController.class);
-
- @Before
- public void setup() {
- mCommandQueue = new CommandQueue(mContext, new FakeDisplayTracker(mContext));
- mDependency.injectTestDependency(StatusBarStateController.class,
- mock(SysuiStatusBarStateController.class));
- mDependency.injectTestDependency(ShadeController.class, mShadeController);
- mDependency.injectMockDependency(NotificationRemoteInputManager.Callback.class);
- mDependency.injectMockDependency(NotificationShadeWindowController.class);
-
- when(mNotificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(true);
-
- createPresenter();
- if (VisualInterruptionRefactor.isEnabled()) {
- verifyAndCaptureSuppressors();
- } else {
- verifyAndCaptureLegacySuppressor();
- }
- }
-
- @Test
- @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testInit_refactorDisabled() {
- assertFalse(VisualInterruptionRefactor.isEnabled());
- assertNull(mAlertsDisabledCondition);
- assertNull(mVrModeCondition);
- assertNull(mNeedsRedactionFilter);
- assertNull(mPanelsDisabledCondition);
- assertNotNull(mInterruptSuppressor);
- }
-
- @Test
- @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testInit_refactorEnabled() {
- assertTrue(VisualInterruptionRefactor.isEnabled());
- assertNotNull(mAlertsDisabledCondition);
- assertNotNull(mVrModeCondition);
- assertNotNull(mNeedsRedactionFilter);
- assertNotNull(mPanelsDisabledCondition);
- assertNull(mInterruptSuppressor);
- }
-
- @Test
- @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testNoSuppressHeadsUp_default_refactorDisabled() {
- assertFalse(mInterruptSuppressor.suppressAwakeHeadsUp(createNotificationEntry()));
- }
-
- @Test
- @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testNoSuppressHeadsUp_default_refactorEnabled() {
- assertFalse(mAlertsDisabledCondition.shouldSuppress());
- assertFalse(mVrModeCondition.shouldSuppress());
- assertFalse(mNeedsRedactionFilter.shouldSuppress(createNotificationEntry()));
- assertFalse(mAlertsDisabledCondition.shouldSuppress());
- }
-
- @Test
- @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testSuppressHeadsUp_disabledStatusBar_refactorDisabled() {
- mCommandQueue.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_EXPAND, 0,
- false /* animate */);
- TestableLooper.get(this).processAllMessages();
-
- assertTrue("The panel should suppress heads up while disabled",
- mInterruptSuppressor.suppressAwakeHeadsUp(createNotificationEntry()));
- }
-
- @Test
- @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testSuppressHeadsUp_disabledStatusBar_refactorEnabled() {
- mCommandQueue.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_EXPAND, 0,
- false /* animate */);
- TestableLooper.get(this).processAllMessages();
-
- assertTrue("The panel should suppress heads up while disabled",
- mPanelsDisabledCondition.shouldSuppress());
- }
-
- @Test
- @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testSuppressHeadsUp_disabledNotificationShade_refactorDisabled() {
- mCommandQueue.disable(DEFAULT_DISPLAY, 0, StatusBarManager.DISABLE2_NOTIFICATION_SHADE,
- false /* animate */);
- TestableLooper.get(this).processAllMessages();
-
- assertTrue("The panel should suppress interruptions while notification shade disabled",
- mInterruptSuppressor.suppressAwakeHeadsUp(createNotificationEntry()));
- }
-
- @Test
- @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testSuppressHeadsUp_disabledNotificationShade_refactorEnabled() {
- mCommandQueue.disable(DEFAULT_DISPLAY, 0, StatusBarManager.DISABLE2_NOTIFICATION_SHADE,
- false /* animate */);
- TestableLooper.get(this).processAllMessages();
-
- assertTrue("The panel should suppress interruptions while notification shade disabled",
- mPanelsDisabledCondition.shouldSuppress());
- }
-
- @Test
- @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testPanelsDisabledConditionSuppressesPeek() {
- final Set<VisualInterruptionType> types = mPanelsDisabledCondition.getTypes();
- assertTrue(types.contains(PEEK));
- assertFalse(types.contains(PULSE));
- assertFalse(types.contains(BUBBLE));
- }
-
- @Test
- @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testNoSuppressHeadsUp_FSI_nonOccludedKeyguard_refactorDisabled() {
- when(mKeyguardStateController.isShowing()).thenReturn(true);
- when(mKeyguardStateController.isOccluded()).thenReturn(false);
-
- assertFalse(mInterruptSuppressor.suppressAwakeHeadsUp(createFsiNotificationEntry()));
- }
-
- @Test
- @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testNoSuppressHeadsUp_FSI_nonOccludedKeyguard_refactorEnabled() {
- when(mKeyguardStateController.isShowing()).thenReturn(true);
- when(mKeyguardStateController.isOccluded()).thenReturn(false);
-
- assertFalse(mNeedsRedactionFilter.shouldSuppress(createFsiNotificationEntry()));
-
- final Set<VisualInterruptionType> types = mNeedsRedactionFilter.getTypes();
- assertTrue(types.contains(PEEK));
- assertFalse(types.contains(PULSE));
- assertFalse(types.contains(BUBBLE));
- }
-
- @Test
- @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testSuppressInterruptions_vrMode_refactorDisabled() {
- mStatusBarNotificationPresenter.mVrMode = true;
-
- assertTrue("Vr mode should suppress interruptions",
- mInterruptSuppressor.suppressAwakeInterruptions(createNotificationEntry()));
- }
-
- @Test
- @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testSuppressInterruptions_vrMode_refactorEnabled() {
- mStatusBarNotificationPresenter.mVrMode = true;
-
- assertTrue("Vr mode should suppress interruptions", mVrModeCondition.shouldSuppress());
-
- final Set<VisualInterruptionType> types = mVrModeCondition.getTypes();
- assertTrue(types.contains(PEEK));
- assertFalse(types.contains(PULSE));
- assertTrue(types.contains(BUBBLE));
- }
-
- @Test
- @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testSuppressInterruptions_statusBarAlertsDisabled_refactorDisabled() {
- when(mNotificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(false);
-
- assertTrue("When alerts aren't enabled, interruptions are suppressed",
- mInterruptSuppressor.suppressInterruptions(createNotificationEntry()));
- }
-
- @Test
- @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
- public void testSuppressInterruptions_statusBarAlertsDisabled_refactorEnabled() {
- when(mNotificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(false);
-
- assertTrue("When alerts aren't enabled, interruptions are suppressed",
- mAlertsDisabledCondition.shouldSuppress());
-
- final Set<VisualInterruptionType> types = mAlertsDisabledCondition.getTypes();
- assertTrue(types.contains(PEEK));
- assertTrue(types.contains(PULSE));
- assertTrue(types.contains(BUBBLE));
- }
-
- private void createPresenter() {
- final ShadeViewController shadeViewController = mock(ShadeViewController.class);
-
- final NotificationShadeWindowView notificationShadeWindowView =
- mock(NotificationShadeWindowView.class);
- when(notificationShadeWindowView.getResources()).thenReturn(mContext.getResources());
-
- NotificationStackScrollLayoutController stackScrollLayoutController =
- mock(NotificationStackScrollLayoutController.class);
- when(stackScrollLayoutController.getView()).thenReturn(
- mock(NotificationStackScrollLayout.class));
-
- final InitController initController = new InitController();
-
- mStatusBarNotificationPresenter = new StatusBarNotificationPresenter(
- mContext,
- shadeViewController,
- mock(PanelExpansionInteractor.class),
- mock(QuickSettingsController.class),
- mock(HeadsUpManager.class),
- notificationShadeWindowView,
- mock(ActivityStarter.class),
- stackScrollLayoutController,
- mock(DozeScrimController.class),
- mock(NotificationShadeWindowController.class),
- mock(DynamicPrivacyController.class),
- mKeyguardStateController,
- mNotificationAlertsInteractor,
- mock(LockscreenShadeTransitionController.class),
- mock(PowerInteractor.class),
- mCommandQueue,
- mock(NotificationLockscreenUserManager.class),
- mock(SysuiStatusBarStateController.class),
- mock(NotifShadeEventSource.class),
- mock(NotificationMediaManager.class),
- mock(NotificationGutsManager.class),
- initController,
- mVisualInterruptionDecisionProvider,
- mock(NotificationRemoteInputManager.class),
- mock(NotificationRemoteInputManager.Callback.class),
- mock(NotificationListContainer.class));
-
- initController.executePostInitTasks();
- }
-
- private void verifyAndCaptureSuppressors() {
- mInterruptSuppressor = null;
-
- final ArgumentCaptor<VisualInterruptionCondition> conditionCaptor =
- ArgumentCaptor.forClass(VisualInterruptionCondition.class);
- verify(mVisualInterruptionDecisionProvider, times(3)).addCondition(
- conditionCaptor.capture());
- final List<VisualInterruptionCondition> conditions = conditionCaptor.getAllValues();
- mAlertsDisabledCondition = conditions.get(0);
- mVrModeCondition = conditions.get(1);
- mPanelsDisabledCondition = conditions.get(2);
-
- final ArgumentCaptor<VisualInterruptionFilter> needsRedactionFilterCaptor =
- ArgumentCaptor.forClass(VisualInterruptionFilter.class);
- verify(mVisualInterruptionDecisionProvider).addFilter(needsRedactionFilterCaptor.capture());
- mNeedsRedactionFilter = needsRedactionFilterCaptor.getValue();
- }
-
- private void verifyAndCaptureLegacySuppressor() {
- mAlertsDisabledCondition = null;
- mVrModeCondition = null;
- mNeedsRedactionFilter = null;
- mPanelsDisabledCondition = null;
-
- final ArgumentCaptor<NotificationInterruptSuppressor> suppressorCaptor =
- ArgumentCaptor.forClass(NotificationInterruptSuppressor.class);
- verify(mVisualInterruptionDecisionProvider).addLegacySuppressor(suppressorCaptor.capture());
- mInterruptSuppressor = suppressorCaptor.getValue();
- }
-
- private NotificationEntry createNotificationEntry() {
- return new NotificationEntryBuilder()
- .setPkg("a")
- .setOpPkg("a")
- .setTag("a")
- .setNotification(new Notification.Builder(getContext(), "a").build())
- .build();
- }
-
- private NotificationEntry createFsiNotificationEntry() {
- final Notification notification = new Notification.Builder(getContext(), "a")
- .setFullScreenIntent(mock(PendingIntent.class), true)
- .build();
-
- return new NotificationEntryBuilder()
- .setPkg("a")
- .setOpPkg("a")
- .setTag("a")
- .setNotification(notification)
- .build();
- }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt
new file mode 100644
index 000000000000..31fbcb984105
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt
@@ -0,0 +1,385 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.phone
+
+import android.app.Notification
+import android.app.Notification.Builder
+import android.app.StatusBarManager
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.testing.TestableLooper
+import android.testing.TestableLooper.RunWithLooper
+import android.view.Display.DEFAULT_DISPLAY
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.InitController
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.plugins.activityStarter
+import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.settings.FakeDisplayTracker
+import com.android.systemui.shade.NotificationShadeWindowView
+import com.android.systemui.shade.ShadeController
+import com.android.systemui.shade.ShadeViewController
+import com.android.systemui.shade.domain.interactor.panelExpansionInteractor
+import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.statusbar.NotificationRemoteInputManager
+import com.android.systemui.statusbar.NotificationShadeWindowController
+import com.android.systemui.statusbar.lockscreenShadeTransitionController
+import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
+import com.android.systemui.statusbar.notification.domain.interactor.NotificationAlertsInteractor
+import com.android.systemui.statusbar.notification.dynamicPrivacyController
+import com.android.systemui.statusbar.notification.headsup.headsUpManager
+import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor
+import com.android.systemui.statusbar.notification.interruption.VisualInterruptionCondition
+import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider
+import com.android.systemui.statusbar.notification.interruption.VisualInterruptionFilter
+import com.android.systemui.statusbar.notification.interruption.VisualInterruptionRefactor
+import com.android.systemui.statusbar.notification.interruption.VisualInterruptionType
+import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
+import com.android.systemui.statusbar.notificationLockscreenUserManager
+import com.android.systemui.statusbar.notificationRemoteInputManager
+import com.android.systemui.statusbar.notificationShadeWindowController
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.statusbar.sysuiStatusBarStateController
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@RunWithLooper
+class StatusBarNotificationPresenterTest : SysuiTestCase() {
+ private val kosmos = testKosmos()
+
+ private val visualInterruptionDecisionProvider: VisualInterruptionDecisionProvider = mock()
+
+ private var interruptSuppressor: NotificationInterruptSuppressor? = null
+ private var alertsDisabledCondition: VisualInterruptionCondition? = null
+ private var vrModeCondition: VisualInterruptionCondition? = null
+ private var needsRedactionFilter: VisualInterruptionFilter? = null
+ private var panelsDisabledCondition: VisualInterruptionCondition? = null
+
+ private val commandQueue: CommandQueue = CommandQueue(mContext, FakeDisplayTracker(mContext))
+ private val shadeController: ShadeController = mock()
+ private val notificationAlertsInteractor: NotificationAlertsInteractor = mock()
+ private val keyguardStateController: KeyguardStateController = mock()
+
+ private lateinit var underTest: StatusBarNotificationPresenter
+
+ @Before
+ fun setup() {
+ mDependency.injectTestDependency(StatusBarStateController::class.java, mock())
+ mDependency.injectTestDependency(ShadeController::class.java, shadeController)
+ mDependency.injectMockDependency(NotificationRemoteInputManager.Callback::class.java)
+ mDependency.injectMockDependency(NotificationShadeWindowController::class.java)
+
+ whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(true)
+
+ underTest = createPresenter()
+ if (VisualInterruptionRefactor.isEnabled) {
+ verifyAndCaptureSuppressors()
+ } else {
+ verifyAndCaptureLegacySuppressor()
+ }
+ }
+
+ @Test
+ @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testInit_refactorDisabled() {
+ assertThat(VisualInterruptionRefactor.isEnabled).isFalse()
+ assertThat(alertsDisabledCondition).isNull()
+ assertThat(vrModeCondition).isNull()
+ assertThat(needsRedactionFilter).isNull()
+ assertThat(panelsDisabledCondition).isNull()
+ assertThat(interruptSuppressor).isNotNull()
+ }
+
+ @Test
+ @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testInit_refactorEnabled() {
+ assertThat(VisualInterruptionRefactor.isEnabled).isTrue()
+ assertThat(alertsDisabledCondition).isNotNull()
+ assertThat(vrModeCondition).isNotNull()
+ assertThat(needsRedactionFilter).isNotNull()
+ assertThat(panelsDisabledCondition).isNotNull()
+ assertThat(interruptSuppressor).isNull()
+ }
+
+ @Test
+ @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testNoSuppressHeadsUp_default_refactorDisabled() {
+ assertThat(interruptSuppressor!!.suppressAwakeHeadsUp(createNotificationEntry())).isFalse()
+ }
+
+ @Test
+ @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testNoSuppressHeadsUp_default_refactorEnabled() {
+ assertThat(alertsDisabledCondition!!.shouldSuppress()).isFalse()
+ assertThat(vrModeCondition!!.shouldSuppress()).isFalse()
+ assertThat(needsRedactionFilter!!.shouldSuppress(createNotificationEntry())).isFalse()
+ assertThat(alertsDisabledCondition!!.shouldSuppress()).isFalse()
+ }
+
+ @Test
+ @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testSuppressHeadsUp_disabledStatusBar_refactorDisabled() {
+ commandQueue.disable(
+ DEFAULT_DISPLAY,
+ StatusBarManager.DISABLE_EXPAND,
+ 0,
+ false, /* animate */
+ )
+ TestableLooper.get(this).processAllMessages()
+
+ assertWithMessage("The panel should suppress heads up while disabled")
+ .that(interruptSuppressor!!.suppressAwakeHeadsUp(createNotificationEntry()))
+ .isTrue()
+ }
+
+ @Test
+ @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testSuppressHeadsUp_disabledStatusBar_refactorEnabled() {
+ commandQueue.disable(
+ DEFAULT_DISPLAY,
+ StatusBarManager.DISABLE_EXPAND,
+ 0,
+ false, /* animate */
+ )
+ TestableLooper.get(this).processAllMessages()
+
+ assertWithMessage("The panel should suppress heads up while disabled")
+ .that(panelsDisabledCondition!!.shouldSuppress())
+ .isTrue()
+ }
+
+ @Test
+ @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testSuppressHeadsUp_disabledNotificationShade_refactorDisabled() {
+ commandQueue.disable(
+ DEFAULT_DISPLAY,
+ 0,
+ StatusBarManager.DISABLE2_NOTIFICATION_SHADE,
+ false, /* animate */
+ )
+ TestableLooper.get(this).processAllMessages()
+
+ assertWithMessage(
+ "The panel should suppress interruptions while notification shade disabled"
+ )
+ .that(interruptSuppressor!!.suppressAwakeHeadsUp(createNotificationEntry()))
+ .isTrue()
+ }
+
+ @Test
+ @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testSuppressHeadsUp_disabledNotificationShade_refactorEnabled() {
+ commandQueue.disable(
+ DEFAULT_DISPLAY,
+ 0,
+ StatusBarManager.DISABLE2_NOTIFICATION_SHADE,
+ false, /* animate */
+ )
+ TestableLooper.get(this).processAllMessages()
+
+ assertWithMessage(
+ "The panel should suppress interruptions while notification shade disabled"
+ )
+ .that(panelsDisabledCondition!!.shouldSuppress())
+ .isTrue()
+ }
+
+ @Test
+ @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testPanelsDisabledConditionSuppressesPeek() {
+ val types: Set<VisualInterruptionType> = panelsDisabledCondition!!.types
+ assertThat(types).contains(VisualInterruptionType.PEEK)
+ assertThat(types)
+ .containsNoneOf(VisualInterruptionType.BUBBLE, VisualInterruptionType.PULSE)
+ }
+
+ @Test
+ @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testNoSuppressHeadsUp_FSI_nonOccludedKeyguard_refactorDisabled() {
+ whenever(keyguardStateController.isShowing()).thenReturn(true)
+ whenever(keyguardStateController.isOccluded()).thenReturn(false)
+
+ assertThat(interruptSuppressor!!.suppressAwakeHeadsUp(createFsiNotificationEntry()))
+ .isFalse()
+ }
+
+ @Test
+ @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testNoSuppressHeadsUp_FSI_nonOccludedKeyguard_refactorEnabled() {
+ whenever(keyguardStateController.isShowing()).thenReturn(true)
+ whenever(keyguardStateController.isOccluded()).thenReturn(false)
+
+ assertThat(needsRedactionFilter!!.shouldSuppress(createFsiNotificationEntry())).isFalse()
+
+ val types: Set<VisualInterruptionType> = needsRedactionFilter!!.types
+ assertThat(types).contains(VisualInterruptionType.PEEK)
+ assertThat(types)
+ .containsNoneOf(VisualInterruptionType.BUBBLE, VisualInterruptionType.PULSE)
+ }
+
+ @Test
+ @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testSuppressInterruptions_vrMode_refactorDisabled() {
+ underTest.mVrMode = true
+
+ assertWithMessage("Vr mode should suppress interruptions")
+ .that(interruptSuppressor!!.suppressAwakeInterruptions(createNotificationEntry()))
+ .isTrue()
+ }
+
+ @Test
+ @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testSuppressInterruptions_vrMode_refactorEnabled() {
+ underTest.mVrMode = true
+
+ assertWithMessage("Vr mode should suppress interruptions")
+ .that(vrModeCondition!!.shouldSuppress())
+ .isTrue()
+
+ val types: Set<VisualInterruptionType> = vrModeCondition!!.types
+ assertThat(types).contains(VisualInterruptionType.PEEK)
+ assertThat(types).doesNotContain(VisualInterruptionType.PULSE)
+ assertThat(types).contains(VisualInterruptionType.BUBBLE)
+ }
+
+ @Test
+ @DisableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testSuppressInterruptions_statusBarAlertsDisabled_refactorDisabled() {
+ whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(false)
+
+ assertWithMessage("When alerts aren't enabled, interruptions are suppressed")
+ .that(interruptSuppressor!!.suppressInterruptions(createNotificationEntry()))
+ .isTrue()
+ }
+
+ @Test
+ @EnableFlags(VisualInterruptionRefactor.FLAG_NAME)
+ fun testSuppressInterruptions_statusBarAlertsDisabled_refactorEnabled() {
+ whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(false)
+
+ assertWithMessage("When alerts aren't enabled, interruptions are suppressed")
+ .that(alertsDisabledCondition!!.shouldSuppress())
+ .isTrue()
+
+ val types: Set<VisualInterruptionType> = alertsDisabledCondition!!.types
+ assertThat(types).contains(VisualInterruptionType.PEEK)
+ assertThat(types).contains(VisualInterruptionType.PULSE)
+ assertThat(types).contains(VisualInterruptionType.BUBBLE)
+ }
+
+ private fun createPresenter(): StatusBarNotificationPresenter {
+ val shadeViewController: ShadeViewController = mock()
+
+ val notificationShadeWindowView: NotificationShadeWindowView = mock()
+ whenever(notificationShadeWindowView.resources).thenReturn(mContext.resources)
+
+ val stackScrollLayoutController: NotificationStackScrollLayoutController = mock()
+ whenever(stackScrollLayoutController.view).thenReturn(mock())
+
+ val initController: InitController = InitController()
+
+ return StatusBarNotificationPresenter(
+ mContext,
+ shadeViewController,
+ kosmos.panelExpansionInteractor,
+ /* quickSettingsController = */ mock(),
+ kosmos.headsUpManager,
+ notificationShadeWindowView,
+ kosmos.activityStarter,
+ stackScrollLayoutController,
+ kosmos.dozeScrimController,
+ kosmos.notificationShadeWindowController,
+ kosmos.dynamicPrivacyController,
+ keyguardStateController,
+ notificationAlertsInteractor,
+ kosmos.lockscreenShadeTransitionController,
+ kosmos.powerInteractor,
+ commandQueue,
+ kosmos.notificationLockscreenUserManager,
+ kosmos.sysuiStatusBarStateController,
+ /* notifShadeEventSource = */ mock(),
+ /* notificationMediaManager = */ mock(),
+ /* notificationGutsManager = */ mock(),
+ initController,
+ visualInterruptionDecisionProvider,
+ kosmos.notificationRemoteInputManager,
+ /* remoteInputManagerCallback = */ mock(),
+ /* notificationListContainer = */ mock(),
+ )
+ .also { initController.executePostInitTasks() }
+ }
+
+ private fun verifyAndCaptureSuppressors() {
+ interruptSuppressor = null
+
+ val conditionCaptor = argumentCaptor<VisualInterruptionCondition>()
+ verify(visualInterruptionDecisionProvider, times(3)).addCondition(conditionCaptor.capture())
+ val conditions: List<VisualInterruptionCondition> = conditionCaptor.allValues
+ alertsDisabledCondition = conditions[0]
+ vrModeCondition = conditions[1]
+ panelsDisabledCondition = conditions[2]
+
+ val needsRedactionFilterCaptor = argumentCaptor<VisualInterruptionFilter>()
+ verify(visualInterruptionDecisionProvider).addFilter(needsRedactionFilterCaptor.capture())
+ needsRedactionFilter = needsRedactionFilterCaptor.lastValue
+ }
+
+ private fun verifyAndCaptureLegacySuppressor() {
+ alertsDisabledCondition = null
+ vrModeCondition = null
+ needsRedactionFilter = null
+ panelsDisabledCondition = null
+
+ val suppressorCaptor = argumentCaptor<NotificationInterruptSuppressor>()
+ verify(visualInterruptionDecisionProvider).addLegacySuppressor(suppressorCaptor.capture())
+ interruptSuppressor = suppressorCaptor.lastValue
+ }
+
+ private fun createNotificationEntry(): NotificationEntry {
+ return NotificationEntryBuilder()
+ .setPkg("a")
+ .setOpPkg("a")
+ .setTag("a")
+ .setNotification(Builder(mContext, "a").build())
+ .build()
+ }
+
+ private fun createFsiNotificationEntry(): NotificationEntry {
+ val notification: Notification =
+ Builder(mContext, "a").setFullScreenIntent(mock(), true).build()
+
+ return NotificationEntryBuilder()
+ .setPkg("a")
+ .setOpPkg("a")
+ .setTag("a")
+ .setNotification(notification)
+ .build()
+ }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt
index ca1413e48966..b19645fadbdf 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorTest.kt
@@ -30,11 +30,13 @@ import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.statusbar.StatusBarIconView
+import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository
import com.android.systemui.statusbar.notification.data.model.activeNotificationModel
import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore
import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
import com.android.systemui.statusbar.notification.shared.CallType
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
+import com.android.systemui.statusbar.window.fakeStatusBarWindowControllerStore
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
@@ -72,7 +74,7 @@ class OngoingCallInteractorTest : SysuiTestCase() {
whenTime = 1000L,
callType = CallType.Ongoing,
statusBarChipIcon = testIconView,
- contentIntent = testIntent
+ contentIntent = testIntent,
)
)
}
@@ -95,7 +97,9 @@ class OngoingCallInteractorTest : SysuiTestCase() {
.apply {
addIndividualNotif(
activeNotificationModel(
- key = "notif1", whenTime = 1000L, callType = CallType.Ongoing
+ key = "notif1",
+ whenTime = 1000L,
+ callType = CallType.Ongoing,
)
)
}
@@ -114,7 +118,9 @@ class OngoingCallInteractorTest : SysuiTestCase() {
.apply {
addIndividualNotif(
activeNotificationModel(
- key = "notif1", whenTime = 1000L, callType = CallType.Ongoing
+ key = "notif1",
+ whenTime = 1000L,
+ callType = CallType.Ongoing,
)
)
}
@@ -138,7 +144,7 @@ class OngoingCallInteractorTest : SysuiTestCase() {
key = "notif1",
whenTime = 1000L,
callType = CallType.Ongoing,
- uid = UID
+ uid = UID,
)
)
}
@@ -161,7 +167,7 @@ class OngoingCallInteractorTest : SysuiTestCase() {
key = "notif1",
whenTime = 1000L,
callType = CallType.Ongoing,
- uid = UID
+ uid = UID,
)
)
}
@@ -185,13 +191,12 @@ class OngoingCallInteractorTest : SysuiTestCase() {
key = "notif1",
whenTime = 1000L,
callType = CallType.Ongoing,
- uid = UID
+ uid = UID,
)
)
}
.build()
- assertThat(latest)
- .isInstanceOf(OngoingCallModel.InCall::class.java)
+ assertThat(latest).isInstanceOf(OngoingCallModel.InCall::class.java)
// App becomes visible
kosmos.activityManagerRepository.fake.setIsAppVisible(UID, true)
@@ -202,6 +207,120 @@ class OngoingCallInteractorTest : SysuiTestCase() {
assertThat(latest).isInstanceOf(OngoingCallModel.InCall::class.java)
}
+ @Test
+ fun ongoingCallNotification_setsRequiresStatusBarVisibleTrue() =
+ kosmos.runTest {
+ val ongoingCallState by collectLastValue(underTest.ongoingCallState)
+
+ val requiresStatusBarVisibleInRepository by
+ collectLastValue(
+ kosmos.fakeStatusBarModeRepository.defaultDisplay
+ .ongoingProcessRequiresStatusBarVisible
+ )
+ val requiresStatusBarVisibleInWindowController by
+ collectLastValue(
+ kosmos.fakeStatusBarWindowControllerStore.defaultDisplay
+ .ongoingProcessRequiresStatusBarVisible
+ )
+ repository.activeNotifications.value =
+ ActiveNotificationsStore.Builder()
+ .apply {
+ addIndividualNotif(
+ activeNotificationModel(
+ key = "notif1",
+ whenTime = 1000L,
+ callType = CallType.Ongoing,
+ uid = UID,
+ )
+ )
+ }
+ .build()
+
+ assertThat(ongoingCallState).isInstanceOf(OngoingCallModel.InCall::class.java)
+ assertThat(requiresStatusBarVisibleInRepository).isTrue()
+ assertThat(requiresStatusBarVisibleInWindowController).isTrue()
+ }
+
+ @Test
+ fun notificationRemoved_setsRequiresStatusBarVisibleFalse() =
+ kosmos.runTest {
+ val ongoingCallState by collectLastValue(underTest.ongoingCallState)
+
+ val requiresStatusBarVisibleInRepository by
+ collectLastValue(
+ kosmos.fakeStatusBarModeRepository.defaultDisplay
+ .ongoingProcessRequiresStatusBarVisible
+ )
+ val requiresStatusBarVisibleInWindowController by
+ collectLastValue(
+ kosmos.fakeStatusBarWindowControllerStore.defaultDisplay
+ .ongoingProcessRequiresStatusBarVisible
+ )
+
+ repository.activeNotifications.value =
+ ActiveNotificationsStore.Builder()
+ .apply {
+ addIndividualNotif(
+ activeNotificationModel(
+ key = "notif1",
+ whenTime = 1000L,
+ callType = CallType.Ongoing,
+ uid = UID,
+ )
+ )
+ }
+ .build()
+
+ repository.activeNotifications.value = ActiveNotificationsStore()
+
+ assertThat(ongoingCallState).isInstanceOf(OngoingCallModel.NoCall::class.java)
+ assertThat(requiresStatusBarVisibleInRepository).isFalse()
+ assertThat(requiresStatusBarVisibleInWindowController).isFalse()
+ }
+
+ @Test
+ fun ongoingCallNotification_appBecomesVisible_setsRequiresStatusBarVisibleFalse() =
+ kosmos.runTest {
+ val ongoingCallState by collectLastValue(underTest.ongoingCallState)
+
+ val requiresStatusBarVisibleInRepository by
+ collectLastValue(
+ kosmos.fakeStatusBarModeRepository.defaultDisplay
+ .ongoingProcessRequiresStatusBarVisible
+ )
+ val requiresStatusBarVisibleInWindowController by
+ collectLastValue(
+ kosmos.fakeStatusBarWindowControllerStore.defaultDisplay
+ .ongoingProcessRequiresStatusBarVisible
+ )
+
+ kosmos.activityManagerRepository.fake.startingIsAppVisibleValue = false
+ repository.activeNotifications.value =
+ ActiveNotificationsStore.Builder()
+ .apply {
+ addIndividualNotif(
+ activeNotificationModel(
+ key = "notif1",
+ whenTime = 1000L,
+ callType = CallType.Ongoing,
+ uid = UID,
+ )
+ )
+ }
+ .build()
+
+ assertThat(ongoingCallState).isInstanceOf(OngoingCallModel.InCall::class.java)
+ assertThat(requiresStatusBarVisibleInRepository).isTrue()
+ assertThat(requiresStatusBarVisibleInWindowController).isTrue()
+
+ kosmos.activityManagerRepository.fake.setIsAppVisible(UID, true)
+
+ assertThat(ongoingCallState)
+ .isInstanceOf(OngoingCallModel.InCallWithVisibleApp::class.java)
+ assertThat(requiresStatusBarVisibleInRepository).isFalse()
+ assertThat(requiresStatusBarVisibleInWindowController).isFalse()
+ }
+
companion object {
private const val UID = 885
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt
index 038722cd9608..bf1fbad074cd 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt
@@ -20,8 +20,6 @@ import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.settingslib.AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH
-import com.android.settingslib.AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH_NONE
import com.android.settingslib.mobile.MobileMappings
import com.android.settingslib.mobile.TelephonyIcons.G
import com.android.settingslib.mobile.TelephonyIcons.THREE_G
@@ -40,12 +38,15 @@ import com.android.systemui.statusbar.connectivity.MobileIconCarrierIdOverridesF
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState
+import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionRepository
+import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionRepository.Companion.DEFAULT_NETWORK_NAME
import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconInteractorImpl
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractorImpl
import com.android.systemui.statusbar.pipeline.mobile.domain.model.SignalIconModel
+import com.android.systemui.statusbar.pipeline.mobile.ui.model.MobileContentDescription
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
@@ -255,59 +256,146 @@ class MobileIconViewModelTest : SysuiTestCase() {
@Test
fun contentDescription_notInService_usesNoPhone() =
testScope.runTest {
- var latest: ContentDescription? = null
- val job = underTest.contentDescription.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.contentDescription)
repository.isInService.value = false
- assertThat((latest as ContentDescription.Resource).res)
- .isEqualTo(PHONE_SIGNAL_STRENGTH_NONE)
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL))
+ }
- job.cancel()
+ @Test
+ fun contentDescription_includesNetworkName() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.contentDescription)
+
+ repository.isInService.value = true
+ repository.networkName.value = NetworkNameModel.SubscriptionDerived("Test Network Name")
+ repository.numberOfLevels.value = 5
+ repository.setAllLevels(3)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular("Test Network Name", THREE_BARS))
}
@Test
fun contentDescription_inService_usesLevel() =
testScope.runTest {
- var latest: ContentDescription? = null
- val job = underTest.contentDescription.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.contentDescription)
repository.setAllLevels(2)
- assertThat((latest as ContentDescription.Resource).res)
- .isEqualTo(PHONE_SIGNAL_STRENGTH[2])
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, TWO_BARS))
repository.setAllLevels(0)
- assertThat((latest as ContentDescription.Resource).res)
- .isEqualTo(PHONE_SIGNAL_STRENGTH[0])
- job.cancel()
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL))
}
@Test
- fun contentDescription_nonInflated_invalidLevelIsNull() =
+ fun contentDescription_nonInflated_invalidLevelUsesNoSignalText() =
testScope.runTest {
val latest by collectLastValue(underTest.contentDescription)
repository.inflateSignalStrength.value = false
repository.setAllLevels(-1)
- assertThat(latest).isNull()
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL))
repository.setAllLevels(100)
- assertThat(latest).isNull()
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL))
+ }
+
+ @Test
+ fun contentDescription_nonInflated_levelStrings() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.contentDescription)
+
+ repository.inflateSignalStrength.value = false
+ repository.setAllLevels(0)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL))
+
+ repository.setAllLevels(1)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, ONE_BAR))
+
+ repository.setAllLevels(2)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, TWO_BARS))
+
+ repository.setAllLevels(3)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, THREE_BARS))
+
+ repository.setAllLevels(4)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, FULL_BARS))
}
@Test
- fun contentDescription_inflated_invalidLevelIsNull() =
+ fun contentDescription_inflated_invalidLevelUsesNoSignalText() =
testScope.runTest {
val latest by collectLastValue(underTest.contentDescription)
repository.inflateSignalStrength.value = true
repository.numberOfLevels.value = 6
+
repository.setAllLevels(-2)
- assertThat(latest).isNull()
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL))
repository.setAllLevels(100)
- assertThat(latest).isNull()
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, NO_SIGNAL))
+ }
+
+ @Test
+ fun contentDescription_inflated_levelStrings() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.contentDescription)
+
+ repository.inflateSignalStrength.value = true
+ repository.numberOfLevels.value = 6
+
+ // Note that the _repo_ level is 1 lower than the reported level through the interactor
+
+ repository.setAllLevels(0)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, ONE_BAR))
+
+ repository.setAllLevels(1)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, TWO_BARS))
+
+ repository.setAllLevels(2)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, THREE_BARS))
+
+ repository.setAllLevels(3)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, FOUR_BARS))
+
+ repository.setAllLevels(4)
+
+ assertThat(latest as MobileContentDescription.Cellular)
+ .isEqualTo(MobileContentDescription.Cellular(DEFAULT_NETWORK_NAME, FULL_BARS))
}
@Test
@@ -323,7 +411,10 @@ class MobileIconViewModelTest : SysuiTestCase() {
repository.setAllLevels(i)
when (i) {
-1,
- 5 -> assertWithMessage("Level $i is expected to be null").that(latest).isNull()
+ 5 ->
+ assertWithMessage("Level $i is expected to be 'no signal'")
+ .that((latest as MobileContentDescription.Cellular).levelDescriptionRes)
+ .isEqualTo(NO_SIGNAL)
else ->
assertWithMessage("Level $i is expected not to be null")
.that(latest)
@@ -344,7 +435,10 @@ class MobileIconViewModelTest : SysuiTestCase() {
repository.setAllLevels(i)
when (i) {
-2,
- 5 -> assertWithMessage("Level $i is expected to be null").that(latest).isNull()
+ 5 ->
+ assertWithMessage("Level $i is expected to be 'no signal'")
+ .that((latest as MobileContentDescription.Cellular).levelDescriptionRes)
+ .isEqualTo(NO_SIGNAL)
else ->
assertWithMessage("Level $i is not expected to be null")
.that(latest)
@@ -967,5 +1061,13 @@ class MobileIconViewModelTest : SysuiTestCase() {
companion object {
private const val SUB_1_ID = 1
+
+ // For convenience, just define these as constants
+ private val NO_SIGNAL = R.string.accessibility_no_signal
+ private val ONE_BAR = R.string.accessibility_one_bar
+ private val TWO_BARS = R.string.accessibility_two_bars
+ private val THREE_BARS = R.string.accessibility_three_bars
+ private val FOUR_BARS = R.string.accessibility_four_bars
+ private val FULL_BARS = R.string.accessibility_signal_full
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt
index 3dcb82811408..72527ddf65b1 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/view/ViewUtilTest.kt
@@ -105,6 +105,20 @@ class ViewUtilTest : SysuiTestCase() {
assertThat(outRect.top).isEqualTo(VIEW_TOP)
assertThat(outRect.bottom).isEqualTo(VIEW_BOTTOM)
}
+
+ @Test
+ fun viewBoundsOnScreen_viewAnchoredAtOriginInWindow() {
+ // view is anchored at 0,0 in its window
+ view.setLeftTopRightBottom(0, 0, VIEW_RIGHT - VIEW_LEFT, VIEW_BOTTOM - VIEW_TOP)
+
+ val outRect = Rect()
+ view.viewBoundsOnScreen(outRect)
+
+ assertThat(outRect.left).isEqualTo(VIEW_LEFT)
+ assertThat(outRect.right).isEqualTo(VIEW_RIGHT)
+ assertThat(outRect.top).isEqualTo(VIEW_TOP)
+ assertThat(outRect.bottom).isEqualTo(VIEW_BOTTOM)
+ }
}
private const val VIEW_LEFT = 30
diff --git a/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml b/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml
index 47641ee64ee1..4a14f3baaafc 100644
--- a/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml
+++ b/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?androidprv:attr/materialColorSecondaryFixedDim"/>
+ <item android:color="@androidprv:color/materialColorSecondaryFixedDim"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml b/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml
index 5e7cf3ee41fb..6a885a733dba 100644
--- a/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml
+++ b/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml
@@ -19,7 +19,7 @@
android:color="?attr/wallpaperTextColorSecondary">
<item android:id="@android:id/background">
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorTertiaryFixed"/>
+ <solid android:color="@androidprv:color/materialColorTertiaryFixed"/>
<corners android:radius="24dp"/>
</shape>
</item>
diff --git a/packages/SystemUI/res-keyguard/drawable/progress_bar.xml b/packages/SystemUI/res-keyguard/drawable/progress_bar.xml
index 910a74ad5faf..455d9d3c00fa 100644
--- a/packages/SystemUI/res-keyguard/drawable/progress_bar.xml
+++ b/packages/SystemUI/res-keyguard/drawable/progress_bar.xml
@@ -26,7 +26,7 @@
android:layout_height="match_parent"
android:shape="rectangle">
<corners android:radius="30dp" />
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHighest" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHighest" />
</shape>
</item>
<item
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml
index 83736e9d9473..eb9ee03a2cd4 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml
@@ -27,8 +27,8 @@
android:background="@drawable/kg_bouncer_secondary_button"
android:drawablePadding="10dp"
android:drawableStart="@drawable/ic_no_sim"
- android:drawableTint="?androidprv:attr/materialColorOnSurface"
+ android:drawableTint="@androidprv:color/materialColorOnSurface"
android:text="@string/disable_carrier_button_text"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="@dimen/kg_status_line_font_size"
android:visibility="gone" />
diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml
index da12dd731c23..b256518e99ac 100644
--- a/packages/SystemUI/res-keyguard/values/styles.xml
+++ b/packages/SystemUI/res-keyguard/values/styles.xml
@@ -23,13 +23,13 @@
<style name="Keyguard.TextView" parent="@android:style/Widget.DeviceDefault.TextView">
<item name="android:textSize">@dimen/kg_status_line_font_size</item>
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="Keyguard.Bouncer.PrimaryMessage" parent="Theme.SystemUI">
<item name="android:textSize">18sp</item>
<item name="android:lineHeight">24dp</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:singleLine">true</item>
<item name="android:textAlignment">center</item>
<item name="android:ellipsize">marquee</item>
@@ -41,10 +41,10 @@
<item name="android:textAlignment">center</item>
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
<item name="android:ellipsize">end</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
</style>
<style name="Keyguard.TextView.EmergencyButton" parent="Theme.SystemUI">
- <item name="android:textColor">?androidprv:attr/materialColorOnTertiaryFixed</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnTertiaryFixed</item>
<item name="android:textSize">16sp</item>
<item name="android:background">@drawable/kg_emergency_button_background</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
diff --git a/packages/SystemUI/res/color/connected_network_primary_color.xml b/packages/SystemUI/res/color/connected_network_primary_color.xml
index f173c8dd5473..920047a705e8 100644
--- a/packages/SystemUI/res/color/connected_network_primary_color.xml
+++ b/packages/SystemUI/res/color/connected_network_primary_color.xml
@@ -16,5 +16,5 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?androidprv:attr/materialColorOnPrimaryContainer" />
+ <item android:color="@androidprv:color/materialColorOnPrimaryContainer" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/disconnected_network_primary_color.xml b/packages/SystemUI/res/color/disconnected_network_primary_color.xml
index 536bf78b7b60..f4b19a71fefd 100644
--- a/packages/SystemUI/res/color/disconnected_network_primary_color.xml
+++ b/packages/SystemUI/res/color/disconnected_network_primary_color.xml
@@ -16,5 +16,5 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?androidprv:attr/materialColorPrimaryContainer" />
+ <item android:color="@androidprv:color/materialColorPrimaryContainer" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/menu_item_text.xml b/packages/SystemUI/res/color/menu_item_text.xml
index 0d05650b8082..c1c9e2c1938e 100644
--- a/packages/SystemUI/res/color/menu_item_text.xml
+++ b/packages/SystemUI/res/color/menu_item_text.xml
@@ -17,8 +17,8 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_enabled="false"
- android:color="?androidprv:attr/materialColorOnSurface"
+ android:color="@androidprv:color/materialColorOnSurface"
android:alpha="0.38" />
- <item android:color="?androidprv:attr/materialColorOnSurface"/>
+ <item android:color="@androidprv:color/materialColorOnSurface"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/notification_focus_overlay_color.xml b/packages/SystemUI/res/color/notification_focus_overlay_color.xml
index 6a3c7a148963..55843635dee7 100644
--- a/packages/SystemUI/res/color/notification_focus_overlay_color.xml
+++ b/packages/SystemUI/res/color/notification_focus_overlay_color.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:state_focused="true" android:color="?androidprv:attr/materialColorSecondary" />
+ <item android:state_focused="true" android:color="@androidprv:color/materialColorSecondary" />
<item android:color="@color/transparent" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml b/packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml
index d1b8a064724d..e0873b887d8d 100644
--- a/packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml
+++ b/packages/SystemUI/res/color/notification_guts_priority_button_bg_stroke.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_selected="true"
- android:color="?androidprv:attr/materialColorOnSurfaceVariant" />
+ android:color="@androidprv:color/materialColorOnSurfaceVariant" />
<item android:color="@color/notification_guts_priority_button_bg_stroke_color" />
</selector>
diff --git a/packages/SystemUI/res/color/notification_guts_priority_contents.xml b/packages/SystemUI/res/color/notification_guts_priority_contents.xml
index cc8c25a2d1ec..3b221e76a91d 100644
--- a/packages/SystemUI/res/color/notification_guts_priority_contents.xml
+++ b/packages/SystemUI/res/color/notification_guts_priority_contents.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_selected="true"
- android:color="?androidprv:attr/materialColorOnSurfaceVariant" />
+ android:color="@androidprv:color/materialColorOnSurfaceVariant" />
<item android:color="@color/notification_guts_priority_button_content_color" />
</selector>
diff --git a/packages/SystemUI/res/color/notification_state_color_default.xml b/packages/SystemUI/res/color/notification_state_color_default.xml
index a14a7ad9d2da..9d77f604c166 100644
--- a/packages/SystemUI/res/color/notification_state_color_default.xml
+++ b/packages/SystemUI/res/color/notification_state_color_default.xml
@@ -19,7 +19,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<!-- Pressed state's alpha is set to 0.00 temporarily until this bug is resolved permanently
b/313920497 Design intended alpha is 0.15-->
- <item android:state_pressed="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.00" />
- <item android:state_hovered="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.11" />
+ <item android:state_pressed="true" android:color="@androidprv:color/materialColorOnSurface" android:alpha="0.00" />
+ <item android:state_hovered="true" android:color="@androidprv:color/materialColorOnSurface" android:alpha="0.11" />
<item android:color="@color/transparent" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml b/packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml
index 40bab5ed08f2..898d5891b7e2 100644
--- a/packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml
+++ b/packages/SystemUI/res/color/qs_dialog_btn_filled_background.xml
@@ -17,7 +17,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_enabled="false"
- android:color="?androidprv:attr/materialColorPrimary"
+ android:color="@androidprv:color/materialColorPrimary"
android:alpha="0.30"/>
- <item android:color="?androidprv:attr/materialColorPrimary"/>
+ <item android:color="@androidprv:color/materialColorPrimary"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml b/packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml
index f8d4af57229b..c8ab4ad88ca1 100644
--- a/packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml
+++ b/packages/SystemUI/res/color/qs_dialog_btn_filled_large_background.xml
@@ -16,7 +16,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_enabled="false"
- android:color="?androidprv:attr/materialColorPrimaryFixed"
+ android:color="@androidprv:color/materialColorPrimaryFixed"
android:alpha="0.30"/>
- <item android:color="?androidprv:attr/materialColorPrimaryFixed"/>
+ <item android:color="@androidprv:color/materialColorPrimaryFixed"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml b/packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml
index faba8fc4c755..60b6245ca301 100644
--- a/packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml
+++ b/packages/SystemUI/res/color/qs_dialog_btn_filled_large_text.xml
@@ -16,7 +16,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_enabled="false"
- android:color="?androidprv:attr/materialColorOnPrimaryFixed"
+ android:color="@androidprv:color/materialColorOnPrimaryFixed"
android:alpha="0.30"/>
- <item android:color="?androidprv:attr/materialColorOnPrimaryFixed"/>
+ <item android:color="@androidprv:color/materialColorOnPrimaryFixed"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml b/packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml
index e76ad991a92c..a5497a54ec66 100644
--- a/packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml
+++ b/packages/SystemUI/res/color/qs_dialog_btn_filled_text_color.xml
@@ -17,7 +17,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_enabled="false"
- android:color="?androidprv:attr/materialColorOnPrimary"
+ android:color="@androidprv:color/materialColorOnPrimary"
android:alpha="0.30"/>
- <item android:color="?androidprv:attr/materialColorOnPrimary"/>
+ <item android:color="@androidprv:color/materialColorOnPrimary"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/qs_dialog_btn_outline.xml b/packages/SystemUI/res/color/qs_dialog_btn_outline.xml
index 1adfe5b19d70..7ef7e062e579 100644
--- a/packages/SystemUI/res/color/qs_dialog_btn_outline.xml
+++ b/packages/SystemUI/res/color/qs_dialog_btn_outline.xml
@@ -17,7 +17,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_enabled="false"
- android:color="?androidprv:attr/materialColorPrimary"
+ android:color="@androidprv:color/materialColorPrimary"
android:alpha="0.30"/>
- <item android:color="?androidprv:attr/materialColorPrimary"/>
+ <item android:color="@androidprv:color/materialColorPrimary"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml b/packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml
index 5dc994f23f2b..f139008640ad 100644
--- a/packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml
+++ b/packages/SystemUI/res/color/qs_dialog_btn_outline_text.xml
@@ -17,7 +17,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_enabled="false"
- android:color="?androidprv:attr/materialColorOnSurface"
+ android:color="@androidprv:color/materialColorOnSurface"
android:alpha="0.30"/>
- <item android:color="?androidprv:attr/materialColorOnSurface"/>
+ <item android:color="@androidprv:color/materialColorOnSurface"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/remote_input_hint.xml b/packages/SystemUI/res/color/remote_input_hint.xml
index 0d90ee6b47c6..75d2bb8f2dfe 100644
--- a/packages/SystemUI/res/color/remote_input_hint.xml
+++ b/packages/SystemUI/res/color/remote_input_hint.xml
@@ -16,5 +16,5 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?androidprv:attr/materialColorOnSurfaceVariant" android:alpha=".6" />
+ <item android:color="@androidprv:color/materialColorOnSurfaceVariant" android:alpha=".6" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/remote_input_send.xml b/packages/SystemUI/res/color/remote_input_send.xml
index 0acc66b9050f..4c61c0c69ca1 100644
--- a/packages/SystemUI/res/color/remote_input_send.xml
+++ b/packages/SystemUI/res/color/remote_input_send.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:state_enabled="false" android:color="?androidprv:attr/materialColorPrimary" android:alpha=".3" />
- <item android:color="?androidprv:attr/materialColorPrimary" />
+ <item android:state_enabled="false" android:color="@androidprv:color/materialColorPrimary" android:alpha=".3" />
+ <item android:color="@androidprv:color/materialColorPrimary" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/remote_input_text.xml b/packages/SystemUI/res/color/remote_input_text.xml
index bf2c198fe540..2ec09cde26ca 100644
--- a/packages/SystemUI/res/color/remote_input_text.xml
+++ b/packages/SystemUI/res/color/remote_input_text.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:state_enabled="false" android:color="?androidprv:attr/materialColorOnSurfaceVariant" android:alpha=".6" />
- <item android:color="?androidprv:attr/materialColorOnSurfaceVariant" />
+ <item android:state_enabled="false" android:color="@androidprv:color/materialColorOnSurfaceVariant" android:alpha=".6" />
+ <item android:color="@androidprv:color/materialColorOnSurfaceVariant" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/screenshare_options_spinner_background.xml b/packages/SystemUI/res/color/screenshare_options_spinner_background.xml
index 922813dcbe64..f3059f6e4627 100644
--- a/packages/SystemUI/res/color/screenshare_options_spinner_background.xml
+++ b/packages/SystemUI/res/color/screenshare_options_spinner_background.xml
@@ -17,6 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_hovered="false" android:state_focused="false" android:color="@android:color/transparent" />
- <item android:state_focused="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha=".1" />
- <item android:state_hovered="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha=".08" />
+ <item android:state_focused="true" android:color="@androidprv:color/materialColorOnSurface" android:alpha=".1" />
+ <item android:state_hovered="true" android:color="@androidprv:color/materialColorOnSurface" android:alpha=".08" />
</selector>
diff --git a/packages/SystemUI/res/color/slider_active_track_color.xml b/packages/SystemUI/res/color/slider_active_track_color.xml
index a5aa58dd6b51..8ba5e4901a7a 100644
--- a/packages/SystemUI/res/color/slider_active_track_color.xml
+++ b/packages/SystemUI/res/color/slider_active_track_color.xml
@@ -14,6 +14,6 @@
~ limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?androidprv:attr/materialColorPrimary" android:state_enabled="true" />
- <item android:color="?androidprv:attr/materialColorSurfaceContainerHighest" />
+ <item android:color="@androidprv:color/materialColorPrimary" android:state_enabled="true" />
+ <item android:color="@androidprv:color/materialColorSurfaceContainerHighest" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/slider_inactive_track_color.xml b/packages/SystemUI/res/color/slider_inactive_track_color.xml
index 89aef776c00e..7980f804a516 100644
--- a/packages/SystemUI/res/color/slider_inactive_track_color.xml
+++ b/packages/SystemUI/res/color/slider_inactive_track_color.xml
@@ -14,6 +14,6 @@
~ limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?androidprv:attr/materialColorSurfaceContainerHighest" android:state_enabled="true" />
- <item android:color="?androidprv:attr/materialColorPrimary" />
+ <item android:color="@androidprv:color/materialColorSurfaceContainerHighest" android:state_enabled="true" />
+ <item android:color="@androidprv:color/materialColorPrimary" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/slider_thumb_color.xml b/packages/SystemUI/res/color/slider_thumb_color.xml
index 5206049edd41..8a98902426f8 100644
--- a/packages/SystemUI/res/color/slider_thumb_color.xml
+++ b/packages/SystemUI/res/color/slider_thumb_color.xml
@@ -15,6 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?androidprv:attr/materialColorSurfaceContainerHighest" android:state_enabled="false" />
- <item android:color="?androidprv:attr/materialColorPrimary" />
+ <item android:color="@androidprv:color/materialColorSurfaceContainerHighest" android:state_enabled="false" />
+ <item android:color="@androidprv:color/materialColorPrimary" />
</selector>
diff --git a/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml b/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml
index 16076b17a6e5..d54164be4632 100644
--- a/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml
+++ b/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_down.xml
@@ -24,8 +24,8 @@
android:viewportHeight="24">
<path
android:pathData="M0,12C0,5.373 5.373,0 12,0C18.627,0 24,5.373 24,12C24,18.627 18.627,24 12,24C5.373,24 0,18.627 0,12Z"
- android:fillColor="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ android:fillColor="@androidprv:color/materialColorSurfaceContainerHigh"/>
<path
android:pathData="M7.607,9.059L6.667,9.999L12,15.332L17.333,9.999L16.393,9.059L12,13.445"
- android:fillColor="?androidprv:attr/materialColorOnSurface"/>
+ android:fillColor="@androidprv:color/materialColorOnSurface"/>
</vector>
diff --git a/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml b/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml
index 309770ddd76d..81184a111d25 100644
--- a/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml
+++ b/packages/SystemUI/res/drawable-night/privacy_dialog_expand_toggle_up.xml
@@ -24,8 +24,8 @@
android:viewportHeight="24">
<path
android:pathData="M0,12C0,5.3726 5.3726,0 12,0C18.6274,0 24,5.3726 24,12C24,18.6274 18.6274,24 12,24C5.3726,24 0,18.6274 0,12Z"
- android:fillColor="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ android:fillColor="@androidprv:color/materialColorSurfaceContainerHigh"/>
<path
android:pathData="M16.3934,14.9393L17.3334,13.9993L12.0001,8.666L6.6667,13.9993L7.6068,14.9393L12.0001,10.5527"
- android:fillColor="?androidprv:attr/materialColorOnSurface"/>
+ android:fillColor="@androidprv:color/materialColorOnSurface"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/action_chip_background.xml b/packages/SystemUI/res/drawable/action_chip_background.xml
index 9492472a2be1..0958c840994d 100644
--- a/packages/SystemUI/res/drawable/action_chip_background.xml
+++ b/packages/SystemUI/res/drawable/action_chip_background.xml
@@ -20,7 +20,7 @@
android:color="@color/overlay_button_ripple">
<item android:id="@android:id/background">
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSecondary"/>
+ <solid android:color="@androidprv:color/materialColorSecondary"/>
<corners android:radius="@dimen/overlay_button_corner_radius"/>
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/action_chip_container_background.xml b/packages/SystemUI/res/drawable/action_chip_container_background.xml
index 2ee27107d900..5aced9d424fa 100644
--- a/packages/SystemUI/res/drawable/action_chip_container_background.xml
+++ b/packages/SystemUI/res/drawable/action_chip_container_background.xml
@@ -18,6 +18,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceBright"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceBright"/>
<corners android:radius="@dimen/overlay_action_container_corner_radius"/>
</shape>
diff --git a/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml b/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml
index fdafe6d8e335..63d026842234 100644
--- a/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml
+++ b/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml
@@ -18,6 +18,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/>
<corners android:radius="@dimen/biometric_prompt_content_corner_radius"/>
</shape>
diff --git a/packages/SystemUI/res/drawable/brightness_bar.xml b/packages/SystemUI/res/drawable/brightness_bar.xml
index 3d1c1fbd6ce7..a32496b25041 100644
--- a/packages/SystemUI/res/drawable/brightness_bar.xml
+++ b/packages/SystemUI/res/drawable/brightness_bar.xml
@@ -21,7 +21,7 @@
android:viewportHeight="48">
<path
android:pathData="M2,22L302,22A2,2 0,0 1,304 24L304,24A2,2 0,0 1,302 26L2,26A2,2 0,0 1,0 24L0,24A2,2 0,0 1,2 22z"
- android:fillColor="?androidprv:attr/customColorShadeInactive"/>
+ android:fillColor="@androidprv:color/customColorShadeInactive"/>
<path
android:pathData="M24,0L205.71,0A24,24 0,0 1,229.71 24L229.71,24A24,24 0,0 1,205.71 48L24,48A24,24 0,0 1,0 24L0,24A24,24 0,0 1,24 0z"
android:fillColor="?attr/shadeActive"/>
diff --git a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
index ec15b10851c5..88d3ecb3f423 100644
--- a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
+++ b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
@@ -25,7 +25,7 @@
<shape>
<size android:height="@dimen/rounded_slider_track_width" />
<corners android:radius="@dimen/rounded_slider_track_corner_radius" />
- <solid android:color="?androidprv:attr/customColorShadeInactive" />
+ <solid android:color="@androidprv:color/customColorShadeInactive" />
</shape>
</inset>
</item>
diff --git a/packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml b/packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml
index 22406ec52d00..546289837e8f 100644
--- a/packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml
+++ b/packages/SystemUI/res/drawable/brightness_slider_focus_bg.xml
@@ -22,7 +22,7 @@
<inset android:inset="-5dp">
<shape>
<corners android:radius="16dp"/>
- <stroke android:width="3dp" android:color="?androidprv:attr/materialColorSecondaryFixed"/>
+ <stroke android:width="3dp" android:color="@androidprv:color/materialColorSecondaryFixed"/>
</shape>
</inset>
</item>
diff --git a/packages/SystemUI/res/drawable/chipbar_background.xml b/packages/SystemUI/res/drawable/chipbar_background.xml
index 7530f5ba244a..15c9fcb1370a 100644
--- a/packages/SystemUI/res/drawable/chipbar_background.xml
+++ b/packages/SystemUI/res/drawable/chipbar_background.xml
@@ -17,6 +17,6 @@
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <solid android:color="?androidprv:attr/materialColorSecondaryFixed" />
+ <solid android:color="@androidprv:color/materialColorSecondaryFixed" />
<corners android:radius="32dp" />
</shape>
diff --git a/packages/SystemUI/res/drawable/chipbar_end_button_background.xml b/packages/SystemUI/res/drawable/chipbar_end_button_background.xml
index a3832eef957f..fcf5b30f6211 100644
--- a/packages/SystemUI/res/drawable/chipbar_end_button_background.xml
+++ b/packages/SystemUI/res/drawable/chipbar_end_button_background.xml
@@ -20,7 +20,7 @@
android:color="?android:textColorPrimary">
<item android:id="@android:id/background">
<shape>
- <solid android:color="?androidprv:attr/materialColorPrimaryFixedDim"/>
+ <solid android:color="@androidprv:color/materialColorPrimaryFixedDim"/>
<corners android:radius="24dp" />
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml b/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml
index d7000d7f5a5c..b8911637f300 100644
--- a/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml
+++ b/packages/SystemUI/res/drawable/contextual_edu_dialog_bg.xml
@@ -19,6 +19,6 @@
android:insetBottom="@dimen/contextual_edu_dialog_elevation">
<shape>
<corners android:radius="28dp" />
- <solid android:color="?androidprv:attr/materialColorTertiaryFixed" />
+ <solid android:color="@androidprv:color/materialColorTertiaryFixed" />
</shape>
</inset> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml b/packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml
index f35975ee8548..5ddc860f85a2 100644
--- a/packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml
+++ b/packages/SystemUI/res/drawable/hearing_devices_spinner_popup_background.xml
@@ -18,5 +18,5 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/hearing_devices_preset_spinner_background_radius"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer" />
</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml b/packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml
index 16e2a3db2e95..307f7eb8f17e 100644
--- a/packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml
+++ b/packages/SystemUI/res/drawable/ic_check_circle_filled_24dp.xml
@@ -18,7 +18,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:width="24dp"
android:height="24dp"
- android:tint="?androidprv:attr/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorPrimary"
android:viewportHeight="24"
android:viewportWidth="24">
<path
diff --git a/packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml b/packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml
index 82fa4f08d0c8..8304fd5be16e 100644
--- a/packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml
+++ b/packages/SystemUI/res/drawable/ic_circle_outline_24dp.xml
@@ -18,7 +18,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:width="24dp"
android:height="24dp"
- android:tint="?androidprv:attr/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorPrimary"
android:viewportHeight="24"
android:viewportWidth="24">
<path
diff --git a/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml b/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml
index 0406f0e4304e..ddff88484796 100644
--- a/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml
+++ b/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml
@@ -19,7 +19,7 @@
android:height="24dp"
android:viewportWidth="48"
android:viewportHeight="48"
- android:tint="?androidprv:attr/materialColorOnSurfaceVariant">
+ android:tint="@androidprv:color/materialColorOnSurfaceVariant">
<path
android:fillColor="@android:color/white"
android:strokeColor="@android:color/white"
diff --git a/packages/SystemUI/res/drawable/immersive_cling_bg.xml b/packages/SystemUI/res/drawable/immersive_cling_bg.xml
index de29c32390e1..b28a423ea06b 100644
--- a/packages/SystemUI/res/drawable/immersive_cling_bg.xml
+++ b/packages/SystemUI/res/drawable/immersive_cling_bg.xml
@@ -20,5 +20,5 @@
<corners
android:bottomLeftRadius="28dp"
android:bottomRightRadius="28dp"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer" />
</shape>
diff --git a/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml b/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml
index 32dc4b335f7e..6ad46d837acd 100644
--- a/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml
+++ b/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml
@@ -20,7 +20,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/>
<size
android:width="@dimen/keyguard_affordance_fixed_width"
android:height="@dimen/keyguard_affordance_fixed_height"/>
diff --git a/packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml b/packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml
index fe76ba7e5b8c..fab0cc204e87 100644
--- a/packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml
+++ b/packages/SystemUI/res/drawable/keyguard_settings_popup_menu_background.xml
@@ -26,7 +26,7 @@
</item>
<item>
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSecondaryFixed" />
+ <solid android:color="@androidprv:color/materialColorSecondaryFixed" />
<corners android:radius="@dimen/keyguard_affordance_fixed_radius" />
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/notif_footer_btn_background.xml b/packages/SystemUI/res/drawable/notif_footer_btn_background.xml
index b9597375c3df..1d5e09d9b260 100644
--- a/packages/SystemUI/res/drawable/notif_footer_btn_background.xml
+++ b/packages/SystemUI/res/drawable/notif_footer_btn_background.xml
@@ -26,7 +26,7 @@
<padding
android:left="20dp"
android:right="20dp" />
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" />
</shape>
</inset>
</item>
diff --git a/packages/SystemUI/res/drawable/notification_guts_bg.xml b/packages/SystemUI/res/drawable/notification_guts_bg.xml
index 84e2231738d4..200976b1fb31 100644
--- a/packages/SystemUI/res/drawable/notification_guts_bg.xml
+++ b/packages/SystemUI/res/drawable/notification_guts_bg.xml
@@ -17,7 +17,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" />
<!--The radius is 1dp smaller than the notification one, to avoid aliasing bugs on the corners -->
<corners android:radius="1dp" />
</shape>
diff --git a/packages/SystemUI/res/drawable/notification_material_bg.xml b/packages/SystemUI/res/drawable/notification_material_bg.xml
index 715be074eaa8..db3b969cca39 100644
--- a/packages/SystemUI/res/drawable/notification_material_bg.xml
+++ b/packages/SystemUI/res/drawable/notification_material_bg.xml
@@ -20,7 +20,7 @@
android:color="?android:attr/colorControlHighlight">
<item>
<shape>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh" />
</shape>
</item>
<item>
diff --git a/packages/SystemUI/res/drawable/overlay_border.xml b/packages/SystemUI/res/drawable/overlay_border.xml
index a59f9239dfca..381849be5730 100644
--- a/packages/SystemUI/res/drawable/overlay_border.xml
+++ b/packages/SystemUI/res/drawable/overlay_border.xml
@@ -18,6 +18,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceBright"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceBright"/>
<corners android:radius="16dp"/>
</shape>
diff --git a/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml b/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml
index f8b99f4a0ee4..299b4c9ab1d0 100644
--- a/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml
+++ b/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_down.xml
@@ -23,8 +23,8 @@
android:viewportHeight="24">
<path
android:pathData="M0,12C0,5.373 5.373,0 12,0C18.627,0 24,5.373 24,12C24,18.627 18.627,24 12,24C5.373,24 0,18.627 0,12Z"
- android:fillColor="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ android:fillColor="@androidprv:color/materialColorSurfaceContainerHigh"/>
<path
android:pathData="M7.607,9.059L6.667,9.999L12,15.332L17.333,9.999L16.393,9.059L12,13.445"
- android:fillColor="?androidprv:attr/materialColorOnSurface"/>
+ android:fillColor="@androidprv:color/materialColorOnSurface"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml b/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml
index ae60d517ceb4..68e73e941e00 100644
--- a/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml
+++ b/packages/SystemUI/res/drawable/privacy_dialog_expand_toggle_up.xml
@@ -23,8 +23,8 @@
android:viewportHeight="24">
<path
android:pathData="M0,12C0,5.3726 5.3726,0 12,0C18.6274,0 24,5.3726 24,12C24,18.6274 18.6274,24 12,24C5.3726,24 0,18.6274 0,12Z"
- android:fillColor="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ android:fillColor="@androidprv:color/materialColorSurfaceContainerHigh"/>
<path
android:pathData="M16.3934,14.9393L17.3334,13.9993L12.0001,8.666L6.6667,13.9993L7.6068,14.9393L12.0001,10.5527"
- android:fillColor="?androidprv:attr/materialColorOnSurface"/>
+ android:fillColor="@androidprv:color/materialColorOnSurface"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml b/packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml
index 3c1668405909..e90473bf54f3 100644
--- a/packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml
+++ b/packages/SystemUI/res/drawable/qs_hearing_devices_related_tools_background.xml
@@ -21,7 +21,7 @@
android:color="?android:attr/colorControlHighlight">
<item>
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorPrimaryContainer"/>
+ <solid android:color="@androidprv:color/materialColorPrimaryContainer"/>
<corners android:radius="@dimen/hearing_devices_preset_spinner_background_radius"/>
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/qs_tile_focused_background.xml b/packages/SystemUI/res/drawable/qs_tile_focused_background.xml
index 33f0d02efb2a..cdf6a1a00316 100644
--- a/packages/SystemUI/res/drawable/qs_tile_focused_background.xml
+++ b/packages/SystemUI/res/drawable/qs_tile_focused_background.xml
@@ -21,6 +21,6 @@
<corners android:radius="30dp" />
<stroke
android:width="3dp"
- android:color="?androidprv:attr/materialColorSecondaryFixed" />
+ android:color="@androidprv:color/materialColorSecondaryFixed" />
</shape>
</inset> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/remote_input_view_text_bg.xml b/packages/SystemUI/res/drawable/remote_input_view_text_bg.xml
index 45d1a530cd20..01ecbcf9956b 100644
--- a/packages/SystemUI/res/drawable/remote_input_view_text_bg.xml
+++ b/packages/SystemUI/res/drawable/remote_input_view_text_bg.xml
@@ -17,10 +17,10 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceDim" />
+ <solid android:color="@androidprv:color/materialColorSurfaceDim" />
<stroke
android:width="@dimen/remote_input_view_text_stroke"
- android:color="?androidprv:attr/materialColorPrimary"/>
+ android:color="@androidprv:color/materialColorPrimary"/>
<padding
android:bottom="0dp"
android:left="12dp"
diff --git a/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml b/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml
index 321a04a1fb5e..323cb77eb37f 100644
--- a/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml
@@ -17,5 +17,5 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/screenrecord_spinner_background_radius"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer" />
</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/screenshot_edit_background.xml b/packages/SystemUI/res/drawable/screenshot_edit_background.xml
index 07e5aff3954d..ef1c30f10605 100644
--- a/packages/SystemUI/res/drawable/screenshot_edit_background.xml
+++ b/packages/SystemUI/res/drawable/screenshot_edit_background.xml
@@ -20,7 +20,7 @@
android:color="@color/overlay_button_ripple">
<item android:id="@android:id/background">
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSecondaryFixedDim"/>
+ <solid android:color="@androidprv:color/materialColorSecondaryFixedDim"/>
<corners android:radius="16dp"/>
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml b/packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml
index fab2d8db859f..2063d9fa55e0 100644
--- a/packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml
+++ b/packages/SystemUI/res/drawable/settingslib_switch_bar_bg_on.xml
@@ -20,7 +20,7 @@
android:color="?android:attr/colorControlHighlight">
<item>
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorPrimaryContainer"/>
+ <solid android:color="@androidprv:color/materialColorPrimaryContainer"/>
<corners android:radius="@dimen/settingslib_switch_bar_radius"/>
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/settingslib_thumb_on.xml b/packages/SystemUI/res/drawable/settingslib_thumb_on.xml
index e316a93c1c3d..70a1e84e7e40 100644
--- a/packages/SystemUI/res/drawable/settingslib_thumb_on.xml
+++ b/packages/SystemUI/res/drawable/settingslib_thumb_on.xml
@@ -24,7 +24,7 @@
<size
android:height="@dimen/settingslib_switch_thumb_size"
android:width="@dimen/settingslib_switch_thumb_size"/>
- <solid android:color="?androidprv:attr/materialColorOnPrimary"/>
+ <solid android:color="@androidprv:color/materialColorOnPrimary"/>
</shape>
</item>
</layer-list>
diff --git a/packages/SystemUI/res/drawable/settingslib_track_on_background.xml b/packages/SystemUI/res/drawable/settingslib_track_on_background.xml
index e2e64684f9c3..e3476a42b2bc 100644
--- a/packages/SystemUI/res/drawable/settingslib_track_on_background.xml
+++ b/packages/SystemUI/res/drawable/settingslib_track_on_background.xml
@@ -22,6 +22,6 @@
android:height="@dimen/settingslib_switch_track_height">
<padding android:left="@dimen/settingslib_switch_thumb_margin"
android:right="@dimen/settingslib_switch_thumb_margin"/>
- <solid android:color="?androidprv:attr/materialColorPrimary"/>
+ <solid android:color="@androidprv:color/materialColorPrimary"/>
<corners android:radius="@dimen/settingslib_switch_track_radius"/>
</shape>
diff --git a/packages/SystemUI/res/drawable/shelf_action_chip_background.xml b/packages/SystemUI/res/drawable/shelf_action_chip_background.xml
index 63600beff126..faa3d6869a34 100644
--- a/packages/SystemUI/res/drawable/shelf_action_chip_background.xml
+++ b/packages/SystemUI/res/drawable/shelf_action_chip_background.xml
@@ -20,7 +20,7 @@
android:color="@color/overlay_button_ripple">
<item android:id="@android:id/background">
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSecondary"/>
+ <solid android:color="@androidprv:color/materialColorSecondary"/>
<corners android:radius="10000dp"/> <!-- fully-rounded radius -->
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml b/packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml
index ad6c154692ec..82f034bb1cdd 100644
--- a/packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml
+++ b/packages/SystemUI/res/drawable/shelf_action_chip_container_background.xml
@@ -21,7 +21,7 @@
<shape
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceBright"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceBright"/>
<corners android:radius="10000dp"/> <!-- fully-rounded radius -->
</shape>
</inset> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/shortcut_button_colored.xml b/packages/SystemUI/res/drawable/shortcut_button_colored.xml
index 2e2d9b9a3e35..b6a14c8188ab 100644
--- a/packages/SystemUI/res/drawable/shortcut_button_colored.xml
+++ b/packages/SystemUI/res/drawable/shortcut_button_colored.xml
@@ -22,7 +22,7 @@
<item>
<shape android:shape="rectangle">
<corners android:radius="@dimen/ksh_button_corner_radius"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceBright"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceBright"/>
</shape>
</item>
</ripple>
diff --git a/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml b/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml
index 5b88bb922a9e..2b95a9462365 100644
--- a/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml
+++ b/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml
@@ -22,7 +22,7 @@
<item>
<shape android:shape="rectangle">
<corners android:radius="@dimen/ksh_button_corner_radius"/>
- <solid android:color="?androidprv:attr/materialColorPrimary"/>
+ <solid android:color="@androidprv:color/materialColorPrimary"/>
</shape>
</item>
</ripple>
diff --git a/packages/SystemUI/res/drawable/shortcut_search_background.xml b/packages/SystemUI/res/drawable/shortcut_search_background.xml
index d6847f0abb8d..07e5b3dec059 100644
--- a/packages/SystemUI/res/drawable/shortcut_search_background.xml
+++ b/packages/SystemUI/res/drawable/shortcut_search_background.xml
@@ -19,7 +19,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item>
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSurfaceBright" />
+ <solid android:color="@androidprv:color/materialColorSurfaceBright" />
<corners android:radius="@dimen/ksh_search_box_corner_radius" />
</shape>
</item>
diff --git a/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml b/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml
index 2675906580f1..6390c11dae36 100644
--- a/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml
+++ b/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml
@@ -20,7 +20,7 @@
<shape android:shape="oval">
<size android:width="24dp"
android:height="24dp" />
- <solid android:color="?androidprv:attr/materialColorSurfaceBright"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceBright"/>
</shape>
</item>
</ripple>
diff --git a/packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml b/packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml
index 06bed001ae1a..42a5d305fb65 100644
--- a/packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml
+++ b/packages/SystemUI/res/drawable/status_bar_notification_section_header_clear_btn.xml
@@ -21,6 +21,6 @@
android:viewportWidth="40"
android:viewportHeight="40">
<path
- android:fillColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:fillColor="@androidprv:color/materialColorOnSurfaceVariant"
android:pathData="M24.6667 16.2733L23.7267 15.3333L20 19.06L16.2734 15.3333L15.3334 16.2733L19.06 20L15.3334 23.7267L16.2734 24.6667L20 20.94L23.7267 24.6667L24.6667 23.7267L20.94 20L24.6667 16.2733Z"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/volume_background_top.xml b/packages/SystemUI/res/drawable/volume_background_top.xml
index 132572a41a36..7185d03a9910 100644
--- a/packages/SystemUI/res/drawable/volume_background_top.xml
+++ b/packages/SystemUI/res/drawable/volume_background_top.xml
@@ -17,7 +17,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item>
<shape>
- <solid android:color="?androidprv:attr/materialColorSurface" />
+ <solid android:color="@androidprv:color/materialColorSurface" />
<corners android:topLeftRadius="@dimen/volume_dialog_background_corner_radius"
android:topRightRadius="@dimen/volume_dialog_background_corner_radius"/>
</shape>
diff --git a/packages/SystemUI/res/drawable/volume_dialog_background.xml b/packages/SystemUI/res/drawable/volume_dialog_background.xml
index 7d7498feeba6..25d78e3474d5 100644
--- a/packages/SystemUI/res/drawable/volume_dialog_background.xml
+++ b/packages/SystemUI/res/drawable/volume_dialog_background.xml
@@ -18,5 +18,5 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/volume_dialog_background_corner_radius" />
- <solid android:color="?androidprv:attr/materialColorSurface" />
+ <solid android:color="@androidprv:color/materialColorSurface" />
</shape>
diff --git a/packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml b/packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml
index 7d794966c480..9026d64aa969 100644
--- a/packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml
+++ b/packages/SystemUI/res/drawable/volume_dialog_background_small_radius.xml
@@ -17,5 +17,5 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/volume_dialog_background_square_corner_radius" />
- <solid android:color="?androidprv:attr/materialColorSurface" />
+ <solid android:color="@androidprv:color/materialColorSurface" />
</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml b/packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml
index 131201e7a94f..555eebd77b1e 100644
--- a/packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml
+++ b/packages/SystemUI/res/drawable/volume_drawer_selection_bg.xml
@@ -19,6 +19,6 @@
<size
android:height="@dimen/volume_dialog_ringer_drawer_button_size"
android:width="@dimen/volume_dialog_ringer_drawer_button_size" />
- <solid android:color="?androidprv:attr/materialColorPrimary" />
+ <solid android:color="@androidprv:color/materialColorPrimary" />
<corners android:radius="@dimen/volume_dialog_ringer_selected_button_background_radius" />
</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/volume_ringer_item_bg.xml b/packages/SystemUI/res/drawable/volume_ringer_item_bg.xml
index a8c9818b58a3..4b3edb905dca 100644
--- a/packages/SystemUI/res/drawable/volume_ringer_item_bg.xml
+++ b/packages/SystemUI/res/drawable/volume_ringer_item_bg.xml
@@ -17,6 +17,6 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle" >
<size android:width="@dimen/volume_dialog_ringer_drawer_button_size" android:height="@dimen/volume_dialog_ringer_drawer_button_size"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHighest" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHighest" />
<corners android:radius="@dimen/volume_dialog_background_square_corner_radius" />
</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/volume_row_seekbar.xml b/packages/SystemUI/res/drawable/volume_row_seekbar.xml
index d7d75d4304d0..c47d7c0e8eb1 100644
--- a/packages/SystemUI/res/drawable/volume_row_seekbar.xml
+++ b/packages/SystemUI/res/drawable/volume_row_seekbar.xml
@@ -26,7 +26,7 @@
<shape>
<size android:height="@dimen/volume_dialog_track_width" />
<corners android:radius="@dimen/volume_dialog_panel_width_half" />
- <solid android:color="?androidprv:attr/materialColorOutlineVariant" />
+ <solid android:color="@androidprv:color/materialColorOutlineVariant" />
</shape>
</item>
<item android:id="@android:id/progress"
diff --git a/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml b/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml
index ca7df86d8296..3e53bf45cff8 100644
--- a/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml
+++ b/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml
@@ -42,7 +42,7 @@
android:layout_marginBottom="16dp"
android:scaleType="fitCenter"
android:src="@null"
- android:tint="?androidprv:attr/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorPrimary"
/>
<TextView
diff --git a/packages/SystemUI/res/layout/app_clips_screenshot.xml b/packages/SystemUI/res/layout/app_clips_screenshot.xml
index 7b7c96cb0322..afc58cc8e163 100644
--- a/packages/SystemUI/res/layout/app_clips_screenshot.xml
+++ b/packages/SystemUI/res/layout/app_clips_screenshot.xml
@@ -31,10 +31,10 @@
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:background="@drawable/overlay_button_background"
- android:backgroundTint="?androidprv:attr/materialColorPrimary"
+ android:backgroundTint="@androidprv:color/materialColorPrimary"
android:paddingHorizontal="24dp"
android:text="@string/app_clips_save_add_to_note"
- android:textColor="?androidprv:attr/materialColorOnPrimary"
+ android:textColor="@androidprv:color/materialColorOnPrimary"
app:layout_constraintBottom_toTopOf="@id/preview"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -61,7 +61,7 @@
android:button="@drawable/checkbox_circle_shape"
android:checked="true"
android:text="@string/backlinks_include_link"
- android:textColor="?androidprv:attr/materialColorOnBackground"
+ android:textColor="@androidprv:color/materialColorOnBackground"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/preview"
app:layout_constraintStart_toEndOf="@id/cancel"
@@ -89,11 +89,11 @@
android:layout_marginStart="8dp"
android:drawablePadding="4dp"
android:drawableStart="@drawable/ic_info_outline"
- android:drawableTint="?androidprv:attr/materialColorOnBackground"
+ android:drawableTint="@androidprv:color/materialColorOnBackground"
android:gravity="center"
android:paddingHorizontal="8dp"
android:text="@string/backlinks_cross_profile_error"
- android:textColor="?androidprv:attr/materialColorOnBackground"
+ android:textColor="@androidprv:color/materialColorOnBackground"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/preview"
app:layout_constraintStart_toEndOf="@id/backlinks_data"
diff --git a/packages/SystemUI/res/layout/bundle_notification_info.xml b/packages/SystemUI/res/layout/bundle_notification_info.xml
index 8700832c0eb0..745066a7bdbb 100644
--- a/packages/SystemUI/res/layout/bundle_notification_info.xml
+++ b/packages/SystemUI/res/layout/bundle_notification_info.xml
@@ -103,7 +103,7 @@ asked for it -->
android:contentDescription="@string/notification_app_settings"
android:src="@drawable/ic_info"
android:layout_toStartOf="@id/info"
- android:tint="?androidprv:attr/materialColorPrimary"/>
+ android:tint="@androidprv:color/materialColorPrimary"/>
<ImageButton
android:id="@+id/info"
android:layout_width="@dimen/notification_importance_toggle_size"
@@ -112,7 +112,7 @@ asked for it -->
android:contentDescription="@string/notification_more_settings"
android:background="@drawable/ripple_drawable_20dp"
android:src="@drawable/ic_settings"
- android:tint="?androidprv:attr/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorPrimary"
android:layout_alignParentEnd="true" />
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/chipbar.xml b/packages/SystemUI/res/layout/chipbar.xml
index e1b8ab469765..2fecf79e926e 100644
--- a/packages/SystemUI/res/layout/chipbar.xml
+++ b/packages/SystemUI/res/layout/chipbar.xml
@@ -56,10 +56,10 @@
android:layout_height="wrap_content"
android:layout_weight="1"
style="@style/Chipbar.Text"
- android:textColor="?androidprv:attr/materialColorOnSecondaryFixed"
+ android:textColor="@androidprv:color/materialColorOnSecondaryFixed"
android:alpha="0.0"
/>
- <!-- LINT.ThenChange(systemui.temporarydisplay.chipbar.ChipbarInfo.kt) -->
+ <!-- LINT.ThenChange(/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt) -->
<!-- At most one of [loading, failure_icon, undo] will be visible at a time. -->
<ImageView
@@ -68,7 +68,7 @@
android:layout_height="@dimen/chipbar_end_icon_size"
android:layout_marginStart="@dimen/chipbar_end_item_start_margin"
android:src="@drawable/ic_progress_activity"
- android:tint="?androidprv:attr/materialColorOnSecondaryFixedVariant"
+ android:tint="@androidprv:color/materialColorOnSecondaryFixedVariant"
android:alpha="0.0"
/>
@@ -88,7 +88,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/chipbar_end_item_start_margin"
style="@style/Chipbar.Text"
- android:textColor="?androidprv:attr/materialColorOnPrimaryFixed"
+ android:textColor="@androidprv:color/materialColorOnPrimaryFixed"
android:paddingStart="@dimen/chipbar_outer_padding"
android:paddingEnd="@dimen/chipbar_outer_padding"
android:paddingTop="@dimen/chipbar_end_button_vertical_padding"
diff --git a/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml b/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml
index 14b3b55df0a4..3378dcced537 100644
--- a/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml
+++ b/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml
@@ -17,8 +17,8 @@
android:paddingHorizontal="16dp"
android:background="@drawable/overlay_button_background"
android:text="@string/clipboard_edit_text_done"
- android:backgroundTint="?androidprv:attr/materialColorPrimary"
- android:textColor="?androidprv:attr/materialColorOnPrimary"
+ android:backgroundTint="@androidprv:color/materialColorPrimary"
+ android:textColor="@androidprv:color/materialColorOnPrimary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
diff --git a/packages/SystemUI/res/layout/clipboard_overlay.xml b/packages/SystemUI/res/layout/clipboard_overlay.xml
index 572f063c20c4..448b3e7d5ea0 100644
--- a/packages/SystemUI/res/layout/clipboard_overlay.xml
+++ b/packages/SystemUI/res/layout/clipboard_overlay.xml
@@ -222,8 +222,8 @@
android:layout_height="match_parent"
android:layout_margin="@dimen/overlay_dismiss_button_margin"
android:background="@drawable/circular_background"
- android:backgroundTint="?androidprv:attr/materialColorPrimaryFixedDim"
- android:tint="?androidprv:attr/materialColorOnPrimaryFixed"
+ android:backgroundTint="@androidprv:color/materialColorPrimaryFixedDim"
+ android:tint="@androidprv:color/materialColorOnPrimaryFixed"
android:padding="4dp"
android:src="@drawable/ic_close"/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/connected_display_dialog.xml b/packages/SystemUI/res/layout/connected_display_dialog.xml
index a71782b0a109..b22355551fe3 100644
--- a/packages/SystemUI/res/layout/connected_display_dialog.xml
+++ b/packages/SystemUI/res/layout/connected_display_dialog.xml
@@ -30,11 +30,11 @@
android:layout_width="@dimen/connected_display_dialog_logo_size"
android:layout_height="@dimen/connected_display_dialog_logo_size"
android:background="@drawable/circular_background"
- android:backgroundTint="?androidprv:attr/materialColorSecondary"
+ android:backgroundTint="@androidprv:color/materialColorSecondary"
android:importantForAccessibility="no"
android:padding="6dp"
android:src="@drawable/stat_sys_connected_display"
- android:tint="?androidprv:attr/materialColorOnSecondary" />
+ android:tint="@androidprv:color/materialColorOnSecondary" />
<TextView
android:id="@+id/connected_display_dialog_title"
diff --git a/packages/SystemUI/res/layout/contextual_edu_dialog.xml b/packages/SystemUI/res/layout/contextual_edu_dialog.xml
index 7eb6efe4afa4..09aa8daa217e 100644
--- a/packages/SystemUI/res/layout/contextual_edu_dialog.xml
+++ b/packages/SystemUI/res/layout/contextual_edu_dialog.xml
@@ -39,6 +39,7 @@
android:ellipsize="end"
android:fontFamily="google-sans-medium"
android:maxWidth="280dp"
- android:textColor="?androidprv:attr/materialColorOnTertiaryFixed"
- android:textSize="14sp" />
+ android:textColor="@androidprv:color/materialColorOnTertiaryFixed"
+ android:textSize="14sp"
+ android:textStyle="bold" />
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml b/packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml
index 70f2cd5fcc28..2d799ae34575 100644
--- a/packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml
+++ b/packages/SystemUI/res/layout/hearing_devices_spinner_dropdown_view.xml
@@ -28,7 +28,7 @@
android:layout_height="@dimen/hearing_devices_preset_spinner_icon_size"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/hearing_devices_layout_margin"
- android:tint="?androidprv:attr/materialColorOnPrimaryContainer"
+ android:tint="@androidprv:color/materialColorOnPrimaryContainer"
android:src="@drawable/ic_check"
android:contentDescription="@string/hearing_devices_spinner_item_selected"/>
<TextView
diff --git a/packages/SystemUI/res/layout/immersive_mode_cling.xml b/packages/SystemUI/res/layout/immersive_mode_cling.xml
index 20b7cd3add4b..f12cf96c5597 100644
--- a/packages/SystemUI/res/layout/immersive_mode_cling.xml
+++ b/packages/SystemUI/res/layout/immersive_mode_cling.xml
@@ -42,7 +42,7 @@
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:text="@string/immersive_cling_title"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="24sp"
android:fontFamily="google-sans" />
@@ -54,7 +54,7 @@
android:paddingTop="14dp"
android:gravity="center_horizontal"
android:text="@string/immersive_cling_description"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textSize="14sp"
android:fontFamily="google-sans" />
@@ -72,7 +72,7 @@
android:minWidth="48dp"
android:minHeight="48dp"
android:text="@string/immersive_cling_positive"
- android:textColor="?androidprv:attr/materialColorOnPrimary"
+ android:textColor="@androidprv:color/materialColorOnPrimary"
android:textAllCaps="false"
android:textSize="14sp"
android:textFontWeight="500"
diff --git a/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml b/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml
index 5ab23271922c..4a40dda4a9a8 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml
@@ -40,7 +40,7 @@
android:layout_height="wrap_content"
android:paddingEnd="12dp"
android:paddingBottom="4dp"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="16sp"
android:maxLines="5"
diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml
index 6e7fde68ca04..3e69a6655a27 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml
@@ -21,7 +21,7 @@
android:layout_height="match_parent"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="14sp"
- android:textColor="?androidprv:attr/materialColorPrimary"
+ android:textColor="@androidprv:color/materialColorPrimary"
android:importantForAccessibility="yes"
android:paddingTop="20dp"
android:paddingBottom="10dp"/>
diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml
index 8772a732e829..5bba9ba21759 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcuts_key_separator_view.xml
@@ -22,7 +22,7 @@
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:text="@string/keyboard_shortcut_join"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:singleLine="true"
android:gravity="center"
android:textSize="@dimen/ksh_item_text_size" />
diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml
index 42bbf25d6c26..91558fdadb36 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml
@@ -25,7 +25,7 @@
android:paddingBottom="@dimen/ksh_key_view_padding_vertical"
android:layout_marginStart="@dimen/ksh_item_margin_start"
android:background="@drawable/ksh_key_item_background"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:singleLine="true"
android:gravity="center"
android:textSize="@dimen/ksh_item_text_size" />
diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml
index 45a4af92339c..18716ef00815 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml
@@ -52,14 +52,14 @@
android:drawableStart="@drawable/ic_shortcutlist_search"
android:drawablePadding="15dp"
android:singleLine="true"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:inputType="text"
android:textDirection="locale"
android:textAlignment="viewStart"
android:hint="@string/keyboard_shortcut_search_list_hint"
android:textAppearance="@android:style/TextAppearance.Material"
android:textSize="16sp"
- android:textColorHint="?androidprv:attr/materialColorOutline" />
+ android:textColorHint="@androidprv:color/materialColorOutline" />
<ImageButton
android:id="@+id/keyboard_shortcuts_search_cancel"
diff --git a/packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml b/packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml
index 636f479e5778..e47fc62c6e16 100644
--- a/packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml
+++ b/packages/SystemUI/res/layout/keyguard_settings_popup_menu.xml
@@ -32,7 +32,7 @@
android:layout_width="@dimen/keyguard_settings_popup_menu_icon_height"
android:layout_height="@dimen/keyguard_settings_popup_menu_icon_width"
android:layout_marginEnd="@dimen/keyguard_settings_popup_menu_icon_end_margin"
- android:tint="?androidprv:attr/materialColorOnSecondaryFixed"
+ android:tint="@androidprv:color/materialColorOnSecondaryFixed"
android:importantForAccessibility="no"
tools:ignore="UseAppTint" />
@@ -41,7 +41,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?androidprv:attr/materialColorOnSecondaryFixed"
+ android:textColor="@androidprv:color/materialColorOnSecondaryFixed"
android:textSize="14sp"
android:maxLines="1"
android:ellipsize="end" />
diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml
index 4d207da851cd..87433be45a7a 100644
--- a/packages/SystemUI/res/layout/long_screenshot.xml
+++ b/packages/SystemUI/res/layout/long_screenshot.xml
@@ -32,8 +32,8 @@
android:layout_marginStart="8dp"
android:layout_marginTop="@dimen/long_screenshot_action_bar_top_margin"
android:background="@drawable/overlay_button_background"
- android:backgroundTint="?androidprv:attr/materialColorPrimary"
- android:textColor="?androidprv:attr/materialColorOnPrimary"
+ android:backgroundTint="@androidprv:color/materialColorPrimary"
+ android:textColor="@androidprv:color/materialColorOnPrimary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/preview" />
@@ -47,8 +47,8 @@
android:layout_marginStart="6dp"
android:layout_marginTop="@dimen/long_screenshot_action_bar_top_margin"
android:background="@drawable/overlay_button_outline"
- android:backgroundTint="?androidprv:attr/materialColorPrimary"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:backgroundTint="@androidprv:color/materialColorPrimary"
+ android:textColor="@androidprv:color/materialColorOnSurface"
app:layout_constraintStart_toEndOf="@id/save"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/preview"
@@ -57,7 +57,7 @@
<ImageButton
android:id="@+id/share"
style="@android:style/Widget.Material.Button.Borderless"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginEnd="8dp"
@@ -114,10 +114,10 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:handleThickness="@dimen/screenshot_crop_handle_thickness"
- app:handleColor="?androidprv:attr/materialColorSecondary"
- app:scrimColor="?androidprv:attr/materialColorSurfaceContainer"
+ app:handleColor="@androidprv:color/materialColorSecondary"
+ app:scrimColor="@androidprv:color/materialColorSurfaceContainer"
app:scrimAlpha="128"
- app:containerBackgroundColor="?androidprv:attr/materialColorSurfaceContainer"
+ app:containerBackgroundColor="@androidprv:color/materialColorSurfaceContainer"
tools:background="?android:colorBackground"
tools:minHeight="100dp"
tools:minWidth="100dp" />
@@ -131,11 +131,11 @@
app:layout_constraintTop_toTopOf="@id/preview"
app:layout_constraintLeft_toLeftOf="parent"
app:handleThickness="@dimen/screenshot_crop_handle_thickness"
- app:handleColor="?androidprv:attr/materialColorSecondary"
- app:scrimColor="?androidprv:attr/materialColorSurfaceContainer"
+ app:handleColor="@androidprv:color/materialColorSecondary"
+ app:scrimColor="@androidprv:color/materialColorSurfaceContainer"
app:scrimAlpha="128"
app:borderThickness="4dp"
- app:borderColor="?androidprv:attr/materialColorSurfaceBright" />
+ app:borderColor="@androidprv:color/materialColorSurfaceBright" />
<ImageButton
android:id="@+id/edit"
@@ -147,7 +147,7 @@
android:background="@drawable/screenshot_edit_background"
android:src="@drawable/ic_screenshot_edit"
android:contentDescription="@string/screenshot_edit_label"
- android:tint="?androidprv:attr/materialColorOnSecondaryFixed"
+ android:tint="@androidprv:color/materialColorOnSecondaryFixed"
android:padding="16dp"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
diff --git a/packages/SystemUI/res/layout/notif_half_shelf.xml b/packages/SystemUI/res/layout/notif_half_shelf.xml
index d8d298573d04..9a66ca9f3baa 100644
--- a/packages/SystemUI/res/layout/notif_half_shelf.xml
+++ b/packages/SystemUI/res/layout/notif_half_shelf.xml
@@ -66,7 +66,7 @@
android:gravity="center_vertical|start"
android:ellipsize="end"
android:maxLines="2"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:textSize="16sp"
/>
diff --git a/packages/SystemUI/res/layout/notif_half_shelf_row.xml b/packages/SystemUI/res/layout/notif_half_shelf_row.xml
index 9ef342ce5220..b2eaa6ce92b5 100644
--- a/packages/SystemUI/res/layout/notif_half_shelf_row.xml
+++ b/packages/SystemUI/res/layout/notif_half_shelf_row.xml
@@ -60,7 +60,7 @@
android:ellipsize="end"
android:maxLines="1"
android:fontFamily="@*android:string/config_headlineFontFamily"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="16sp"
/>
@@ -75,7 +75,7 @@
android:maxLines="1"
android:layout_below="@id/channel_name"
android:fontFamily="@*android:string/config_bodyFontFamily"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textSize="14sp"
/>
</RelativeLayout>
diff --git a/packages/SystemUI/res/layout/status_bar_notification_footer_redesign.xml b/packages/SystemUI/res/layout/notification_2025_footer.xml
index 71c77a56b6a8..9b3d67f7b4a2 100644
--- a/packages/SystemUI/res/layout/status_bar_notification_footer_redesign.xml
+++ b/packages/SystemUI/res/layout/notification_2025_footer.xml
@@ -64,6 +64,8 @@
android:contentDescription="@string/accessibility_clear_all"
android:focusable="true"
android:text="@string/clear_all_notifications_text"
+ android:ellipsize="end"
+ android:maxLines="1"
app:layout_constraintEnd_toStartOf="@id/settings_button"
app:layout_constraintStart_toEndOf="@id/history_button" />
diff --git a/packages/SystemUI/res/layout/notification_children_divider.xml b/packages/SystemUI/res/layout/notification_children_divider.xml
index 13e24a9ea277..c1d94f990d25 100644
--- a/packages/SystemUI/res/layout/notification_children_divider.xml
+++ b/packages/SystemUI/res/layout/notification_children_divider.xml
@@ -21,4 +21,4 @@
android:id="@+id/notification_more_divider"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_divider_height"
- android:background="?androidprv:attr/materialColorOnSurfaceVariant" />
+ android:background="@androidprv:color/materialColorOnSurfaceVariant" />
diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml
index 3a752c81b95a..cb9d8115d674 100644
--- a/packages/SystemUI/res/layout/notification_conversation_info.xml
+++ b/packages/SystemUI/res/layout/notification_conversation_info.xml
@@ -174,7 +174,7 @@
android:contentDescription="@string/notification_more_settings"
android:background="@drawable/ripple_drawable_20dp"
android:src="@drawable/ic_settings"
- android:tint="?androidprv:attr/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorPrimary"
android:layout_alignParentEnd="true" />
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 19a3f2fd521c..edca7e3a9940 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -103,7 +103,7 @@ asked for it -->
android:contentDescription="@string/notification_app_settings"
android:src="@drawable/ic_info"
android:layout_toStartOf="@id/info"
- android:tint="?androidprv:attr/materialColorPrimary"/>
+ android:tint="@androidprv:color/materialColorPrimary"/>
<ImageButton
android:id="@+id/info"
android:layout_width="@dimen/notification_importance_toggle_size"
@@ -112,7 +112,7 @@ asked for it -->
android:contentDescription="@string/notification_more_settings"
android:background="@drawable/ripple_drawable_20dp"
android:src="@drawable/ic_settings"
- android:tint="?androidprv:attr/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorPrimary"
android:layout_alignParentEnd="true" />
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/notification_snooze.xml b/packages/SystemUI/res/layout/notification_snooze.xml
index ce09385eaf45..f114f4cc02fa 100644
--- a/packages/SystemUI/res/layout/notification_snooze.xml
+++ b/packages/SystemUI/res/layout/notification_snooze.xml
@@ -23,7 +23,7 @@
android:orientation="vertical"
android:paddingTop="2dp"
android:paddingBottom="2dp"
- android:background="?androidprv:attr/materialColorSurfaceContainerHigh"
+ android:background="@androidprv:color/materialColorSurfaceContainerHigh"
android:theme="@style/Theme.SystemUI">
<RelativeLayout
@@ -38,7 +38,7 @@
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:paddingStart="@*android:dimen/notification_content_margin_end"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:paddingEnd="4dp"/>
<ImageView
diff --git a/packages/SystemUI/res/layout/notification_snooze_option.xml b/packages/SystemUI/res/layout/notification_snooze_option.xml
index fa6f965198d4..364b44c97d61 100644
--- a/packages/SystemUI/res/layout/notification_snooze_option.xml
+++ b/packages/SystemUI/res/layout/notification_snooze_option.xml
@@ -23,4 +23,4 @@
android:layout_marginEnd="@*android:dimen/notification_content_margin_end"
android:gravity="center_vertical"
android:textSize="14sp"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"/> \ No newline at end of file
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"/> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml b/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml
index b84f3a9794be..3ca4b94d3003 100644
--- a/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml
+++ b/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml
@@ -25,7 +25,7 @@
android:foreground="?android:attr/selectableItemBackground"
app:cardCornerRadius="28dp"
app:cardElevation="0dp"
- app:cardBackgroundColor="?androidprv:attr/materialColorSurfaceBright">
+ app:cardBackgroundColor="@androidprv:color/materialColorSurfaceBright">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/layout/privacy_dialog_v2.xml b/packages/SystemUI/res/layout/privacy_dialog_v2.xml
index 76098a1ab486..0392322aa1c1 100644
--- a/packages/SystemUI/res/layout/privacy_dialog_v2.xml
+++ b/packages/SystemUI/res/layout/privacy_dialog_v2.xml
@@ -45,7 +45,7 @@
android:layout_height="wrap_content"
android:text="@string/privacy_dialog_summary"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:gravity="center"
android:layout_marginBottom="20dp"/>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/record_issue_dialog.xml b/packages/SystemUI/res/layout/record_issue_dialog.xml
index b2a8c4ce96db..76a7d3432380 100644
--- a/packages/SystemUI/res/layout/record_issue_dialog.xml
+++ b/packages/SystemUI/res/layout/record_issue_dialog.xml
@@ -55,7 +55,7 @@
android:layout_height="@dimen/screenrecord_option_icon_size"
android:layout_weight="0"
android:src="@drawable/ic_screenrecord"
- app:tint="?androidprv:attr/materialColorOnSurface"
+ app:tint="@androidprv:color/materialColorOnSurface"
android:importantForAccessibility="no"
android:layout_gravity="center"
android:layout_marginEnd="@dimen/screenrecord_option_padding" />
@@ -95,7 +95,7 @@
android:layout_height="@dimen/screenrecord_option_icon_size"
android:layout_weight="0"
android:src="@drawable/ic_bugreport"
- app:tint="?androidprv:attr/materialColorOnSurface"
+ app:tint="@androidprv:color/materialColorOnSurface"
android:importantForAccessibility="no"
android:layout_gravity="center"
android:layout_marginEnd="@dimen/screenrecord_option_padding" />
diff --git a/packages/SystemUI/res/layout/screen_share_dialog.xml b/packages/SystemUI/res/layout/screen_share_dialog.xml
index 0533c7e3fc50..78d1ab25ffa9 100644
--- a/packages/SystemUI/res/layout/screen_share_dialog.xml
+++ b/packages/SystemUI/res/layout/screen_share_dialog.xml
@@ -36,7 +36,7 @@
android:layout_width="@dimen/screenrecord_logo_size"
android:layout_height="@dimen/screenrecord_logo_size"
android:src="@drawable/ic_media_projection_permission"
- android:tint="?androidprv:attr/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorPrimary"
android:importantForAccessibility="no"/>
<TextView
android:id="@+id/screen_share_dialog_title"
diff --git a/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml b/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml
index 8c31713a5e34..1ef010b62d81 100644
--- a/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml
+++ b/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml
@@ -39,6 +39,6 @@
android:ellipsize="marquee"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?androidprv:attr/materialColorError" />
+ android:textColor="@androidprv:color/materialColorError" />
</LinearLayout> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/screenshot_shelf.xml b/packages/SystemUI/res/layout/screenshot_shelf.xml
index fff1de7c1049..f03c0323a7b7 100644
--- a/packages/SystemUI/res/layout/screenshot_shelf.xml
+++ b/packages/SystemUI/res/layout/screenshot_shelf.xml
@@ -127,8 +127,8 @@
android:layout_height="match_parent"
android:layout_margin="@dimen/overlay_dismiss_button_margin"
android:background="@drawable/circular_background"
- android:backgroundTint="?androidprv:attr/materialColorPrimary"
- android:tint="?androidprv:attr/materialColorOnPrimary"
+ android:backgroundTint="@androidprv:color/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorOnPrimary"
android:padding="4dp"
android:src="@drawable/ic_close"/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml b/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml
index 39ec09b14157..980387176cff 100644
--- a/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml
+++ b/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml
@@ -38,8 +38,8 @@
android:layout_height="24dp"
android:layout_gravity="center"
android:background="@drawable/circular_background"
- android:backgroundTint="?androidprv:attr/materialColorSurfaceContainerHigh"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:backgroundTint="@androidprv:color/materialColorSurfaceContainerHigh"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:padding="2dp"
android:src="@drawable/ic_close"/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/shelf_action_chip.xml b/packages/SystemUI/res/layout/shelf_action_chip.xml
index 1c65e366d619..430e9f742a07 100644
--- a/packages/SystemUI/res/layout/shelf_action_chip.xml
+++ b/packages/SystemUI/res/layout/shelf_action_chip.xml
@@ -27,7 +27,7 @@
>
<ImageView
android:id="@+id/overlay_action_chip_icon"
- android:tint="?androidprv:attr/materialColorOnSecondary"
+ android:tint="@androidprv:color/materialColorOnSecondary"
android:tintMode="src_in"
android:layout_width="@dimen/overlay_action_chip_icon_size"
android:layout_height="@dimen/overlay_action_chip_icon_size"/>
@@ -37,5 +37,5 @@
android:layout_height="wrap_content"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:textSize="@dimen/overlay_action_chip_text_size"
- android:textColor="?androidprv:attr/materialColorOnSecondary"/>
+ android:textColor="@androidprv:color/materialColorOnSecondary"/>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index b8544a64d9da..a3bad8f012ac 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -58,7 +58,7 @@
android:contentDescription="@string/accessibility_volume_settings"
android:soundEffectsEnabled="false"
android:src="@drawable/horizontal_ellipsis"
- android:tint="?androidprv:attr/materialColorPrimary"
+ android:tint="@androidprv:color/materialColorPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/volume_dialog_main_slider_container"
app:layout_constraintStart_toStartOf="@id/volume_dialog_main_slider_container"
@@ -79,4 +79,4 @@
app:layout_constraintEnd_toStartOf="@id/volume_dialog_background"
app:layout_constraintTop_toTopOf="@id/volume_dialog_main_slider_container" />
-</androidx.constraintlayout.motion.widget.MotionLayout> \ No newline at end of file
+</androidx.constraintlayout.motion.widget.MotionLayout>
diff --git a/packages/SystemUI/res/layout/volume_ringer_button.xml b/packages/SystemUI/res/layout/volume_ringer_button.xml
index 38bb783c2920..e65d0b938b65 100644
--- a/packages/SystemUI/res/layout/volume_ringer_button.xml
+++ b/packages/SystemUI/res/layout/volume_ringer_button.xml
@@ -26,7 +26,7 @@
android:layout_marginBottom="@dimen/volume_dialog_components_spacing"
android:contentDescription="@string/volume_ringer_mode"
android:gravity="center"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:src="@drawable/volume_ringer_item_bg"
android:background="@drawable/volume_ringer_item_bg"/>
diff --git a/packages/SystemUI/res/values-land/styles.xml b/packages/SystemUI/res/values-land/styles.xml
index 73812c965a17..ae0006fbbf73 100644
--- a/packages/SystemUI/res/values-land/styles.xml
+++ b/packages/SystemUI/res/values-land/styles.xml
@@ -43,21 +43,21 @@
<item name="android:layout_marginTop">6dp</item>
<item name="android:textSize">36dp</item>
<item name="android:focusable">true</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Subtitle">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:layout_marginTop">6dp</item>
<item name="android:textSize">18sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Description">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:layout_marginTop">6dp</item>
<item name="android:textSize">18sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp-land/styles.xml b/packages/SystemUI/res/values-sw600dp-land/styles.xml
index cde1a1373bed..45698f78d03a 100644
--- a/packages/SystemUI/res/values-sw600dp-land/styles.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/styles.xml
@@ -22,20 +22,20 @@
<item name="android:layout_marginTop">16dp</item>
<item name="android:textSize">36sp</item>
<item name="android:focusable">true</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Subtitle">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:layout_marginTop">16dp</item>
<item name="android:textSize">18sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Description">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:layout_marginTop">16dp</item>
<item name="android:textSize">18sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp-port/styles.xml b/packages/SystemUI/res/values-sw600dp-port/styles.xml
index 85e7af6ee1de..8b3e6fde0b74 100644
--- a/packages/SystemUI/res/values-sw600dp-port/styles.xml
+++ b/packages/SystemUI/res/values-sw600dp-port/styles.xml
@@ -30,7 +30,7 @@
<item name="android:layout_marginTop">24dp</item>
<item name="android:textSize">36sp</item>
<item name="android:focusable">true</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
</resources>
diff --git a/packages/SystemUI/res/values-sw720dp-land/styles.xml b/packages/SystemUI/res/values-sw720dp-land/styles.xml
index e75173d152b0..451a9a901cce 100644
--- a/packages/SystemUI/res/values-sw720dp-land/styles.xml
+++ b/packages/SystemUI/res/values-sw720dp-land/styles.xml
@@ -22,21 +22,21 @@
<item name="android:layout_marginTop">16dp</item>
<item name="android:textSize">36sp</item>
<item name="android:focusable">true</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Subtitle">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:layout_marginTop">16dp</item>
<item name="android:textSize">18sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Description">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:layout_marginTop">16dp</item>
<item name="android:textSize">18sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
</resources>
diff --git a/packages/SystemUI/res/values-sw720dp-port/styles.xml b/packages/SystemUI/res/values-sw720dp-port/styles.xml
index 85e7af6ee1de..8b3e6fde0b74 100644
--- a/packages/SystemUI/res/values-sw720dp-port/styles.xml
+++ b/packages/SystemUI/res/values-sw720dp-port/styles.xml
@@ -30,7 +30,7 @@
<item name="android:layout_marginTop">24dp</item>
<item name="android:textSize">36sp</item>
<item name="android:focusable">true</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index a3752640e7ed..28df2e2a1b8c 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -124,7 +124,7 @@
<!-- Keyboard shortcuts colors -->
<color name="ksh_application_group_color">#fff44336</color>
<color name="ksh_key_item_color">@*android:color/system_on_surface_variant_light</color>
- <color name="ksh_key_item_background">?androidprv:attr/materialColorSurfaceContainerHighest</color>
+ <color name="ksh_key_item_background">@androidprv:color/materialColorSurfaceContainerHighest</color>
<color name="instant_apps_color">#ff4d5a64</color>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 05c13f20f6d2..ff459e92ca28 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1950,6 +1950,21 @@
<!-- Text displayed indicating that the user might be able to use satellite SOS. -->
<string name="satellite_emergency_only_carrier_text">Emergency calls or SOS</string>
+ <!-- Content description skeleton. Input strings should be carrier name and signal bar description [CHAR LIMIT=NONE]-->
+ <string name="accessibility_phone_string_format"><xliff:g id="carrier_name" example="Carrier Name">%1$s</xliff:g>, <xliff:g id="signal_strength_description" example="two bars">%2$s</xliff:g>.</string>
+ <!-- Content description describing 0 signal bars. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_no_signal">no signal</string>
+ <!-- Content description describing 1 signal bar. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_one_bar">one bar</string>
+ <!-- Content description describing 2 signal bars. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_two_bars">two bars</string>
+ <!-- Content description describing 3 signal bars. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_three_bars">three bars</string>
+ <!-- Content description describing 4 signal bars. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_four_bars">four bars</string>
+ <!-- Content description describing full signal bars. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_signal_full">signal full</string>
+
<!-- Accessibility label for managed profile icon (not shown on screen) [CHAR LIMIT=NONE] -->
<string name="accessibility_managed_profile">Work profile</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 9aa71374fb8e..12f6e6958b42 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -151,7 +151,7 @@
<style name="TextAppearance.QS.UserSwitcher">
<item name="android:textSize">@dimen/qs_tile_text_size</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
</style>
<!-- This is hard coded to be sans-serif-condensed to match the icons -->
@@ -183,67 +183,46 @@
<item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
- <style name="TextAppearance.AuthCredential.OldTitle">
- <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:paddingTop">12dp</item>
- <item name="android:paddingHorizontal">24dp</item>
- <item name="android:textSize">24sp</item>
- </style>
-
- <style name="TextAppearance.AuthCredential.OldSubtitle">
- <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:paddingTop">8dp</item>
- <item name="android:paddingHorizontal">24dp</item>
- <item name="android:textSize">16sp</item>
- </style>
-
- <style name="TextAppearance.AuthCredential.OldDescription">
- <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:paddingTop">8dp</item>
- <item name="android:paddingHorizontal">24dp</item>
- <item name="android:textSize">14sp</item>
- </style>
-
<style name="TextAppearance.AuthCredential.LogoDescription" parent="TextAppearance.Material3.LabelLarge" >
<item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item>
- <item name="android:gravity">@integer/biometric_dialog_text_gravity</item>
+ <item name="android:gravity">center_horizontal</item>
<item name="android:maxLines">1</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
<item name="android:ellipsize">end</item>
</style>
<style name="TextAppearance.AuthCredential.Title" parent="TextAppearance.Material3.HeadlineSmall" >
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthCredential.Subtitle" parent="TextAppearance.Material3.BodyMedium" >
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthCredential.Description" parent="TextAppearance.Material3.BodyMedium" >
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthCredential.VerticalListContentViewDescription" parent="TextAppearance.Material3.TitleSmall">
<item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthCredential.ContentViewWithButtonDescription" parent="TextAppearance.AuthCredential.Description" />
<style name="TextAppearance.AuthCredential.ContentViewListItem" parent="TextAppearance.Material3.BodySmall">
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
<item name="android:paddingTop">@dimen/biometric_prompt_content_list_item_padding_top</item>
<item name="android:breakStrategy">high_quality</item>
</style>
<style name="TextAppearance.AuthCredential.Indicator" parent="TextAppearance.Material3.BodyMedium">
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:marqueeRepeatLimit">marquee_forever</item>
<item name="android:singleLine">true</item>
<item name="android:ellipsize">marquee</item>
@@ -269,21 +248,21 @@
<item name="android:layout_marginTop">24dp</item>
<item name="android:textSize">36dp</item>
<item name="android:focusable">true</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Subtitle">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:layout_marginTop">20dp</item>
<item name="android:textSize">18sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Description">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:layout_marginTop">20dp</item>
<item name="android:textSize">18sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.AuthNonBioCredential.Error">
@@ -352,7 +331,7 @@
</style>
<style name="AuthNonCredentialPanelStyle">
- <item name="android:background">?androidprv:attr/materialColorSurfaceBright</item>
+ <item name="android:background">@androidprv:color/materialColorSurfaceBright</item>
</style>
<style name="AuthCredentialPanelStyle" parent="AuthNonCredentialPanelStyle">
@@ -383,13 +362,13 @@
<item name="android:minWidth">48dp</item>
<item name="android:paddingLeft">0dp</item>
<item name="android:paddingRight">12dp</item>
- <item name="android:textColor">?androidprv:attr/materialColorPrimary</item>
+ <item name="android:textColor">@androidprv:color/materialColorPrimary</item>
</style>
<style name="AuthCredentialNegativeButtonStyle" parent="TextAppearance.Material3.LabelLarge">
<item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item>
<item name="android:background">@color/transparent</item>
- <item name="android:textColor">?androidprv:attr/materialColorPrimary</item>
+ <item name="android:textColor">@androidprv:color/materialColorPrimary</item>
</style>
<style name="DeviceManagementDialogTitle">
@@ -411,7 +390,7 @@
</style>
<style name="KeyboardShortcutHelper.BottomSheet.DragHandle" parent="Widget.Material3.BottomSheet.DragHandle">
- <item name="tint">?androidprv:attr/materialColorOutlineVariant</item>
+ <item name="tint">@androidprv:color/materialColorOutlineVariant</item>
</style>
<style name="KeyboardShortcutHelper.BottomSheetDialogAnimation">
@@ -510,23 +489,23 @@
<item name="android:windowIsFloating">true</item>
<item name="android:homeAsUpIndicator">@drawable/ic_arrow_back</item>
- <item name="surfaceBright">?androidprv:attr/materialColorSurfaceBright</item>
+ <item name="surfaceBright">@androidprv:color/materialColorSurfaceBright</item>
<item name="android:colorBackground">?attr/surfaceBright</item>
- <item name="scHigh">?androidprv:attr/materialColorSurfaceContainerHigh</item>
- <item name="primary">?androidprv:attr/materialColorPrimary</item>
- <item name="tertiary">?androidprv:attr/materialColorTertiary</item>
- <item name="onSurface">?androidprv:attr/materialColorOnSurface</item>
- <item name="onSurfaceVariant">?androidprv:attr/materialColorOnSurfaceVariant</item>
- <item name="outline">?androidprv:attr/materialColorOutline</item>
-
- <item name="shadeActive">?androidprv:attr/customColorShadeActive</item>
- <item name="onShadeActive">?androidprv:attr/customColorOnShadeActive</item>
- <item name="onShadeActiveVariant">?androidprv:attr/customColorOnShadeActiveVariant</item>
- <item name="shadeInactive">?androidprv:attr/customColorShadeInactive</item>
- <item name="onShadeInactive">?androidprv:attr/customColorOnShadeInactive</item>
- <item name="onShadeInactiveVariant">?androidprv:attr/customColorOnShadeInactiveVariant</item>
- <item name="shadeDisabled">?androidprv:attr/customColorShadeDisabled</item>
- <item name="underSurface">?androidprv:attr/customColorUnderSurface</item>
+ <item name="scHigh">@androidprv:color/materialColorSurfaceContainerHigh</item>
+ <item name="primary">@androidprv:color/materialColorPrimary</item>
+ <item name="tertiary">@androidprv:color/materialColorTertiary</item>
+ <item name="onSurface">@androidprv:color/materialColorOnSurface</item>
+ <item name="onSurfaceVariant">@androidprv:color/materialColorOnSurfaceVariant</item>
+ <item name="outline">@androidprv:color/materialColorOutline</item>
+
+ <item name="shadeActive">@androidprv:color/customColorShadeActive</item>
+ <item name="onShadeActive">@androidprv:color/customColorOnShadeActive</item>
+ <item name="onShadeActiveVariant">@androidprv:color/customColorOnShadeActiveVariant</item>
+ <item name="shadeInactive">@androidprv:color/customColorShadeInactive</item>
+ <item name="onShadeInactive">@androidprv:color/customColorOnShadeInactive</item>
+ <item name="onShadeInactiveVariant">@androidprv:color/customColorOnShadeInactiveVariant</item>
+ <item name="shadeDisabled">@androidprv:color/customColorShadeDisabled</item>
+ <item name="underSurface">@androidprv:color/customColorUnderSurface</item>
<item name="android:itemTextAppearance">@style/Control.MenuItem</item>
</style>
@@ -588,7 +567,7 @@
<item name="android:buttonBarPositiveButtonStyle">@style/Widget.Dialog.Button</item>
<item name="android:buttonBarNegativeButtonStyle">@style/Widget.Dialog.Button.BorderButton</item>
<item name="android:buttonBarNeutralButtonStyle">@style/Widget.Dialog.Button.BorderButton</item>
- <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceBright</item>
+ <item name="android:colorBackground">@androidprv:color/materialColorSurfaceBright</item>
<item name="android:alertDialogStyle">@style/ScrollableAlertDialogStyle</item>
<item name="android:buttonBarStyle">@style/ButtonBarStyle</item>
<item name="android:buttonBarButtonStyle">@style/Widget.Dialog.Button.Large</item>
@@ -744,34 +723,34 @@
<style name="TextAppearance.NotificationImportanceChannel">
<item name="android:textSize">@dimen/notification_importance_channel_text</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:textSize">@dimen/notification_importance_channel_text</item>
</style>
<style name="TextAppearance.NotificationImportanceChannelGroup">
<item name="android:textSize">@dimen/notification_importance_channel_group_text</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:textSize">@dimen/notification_importance_channel_group_text</item>
</style>
<style name="TextAppearance.NotificationImportanceApp">
<item name="android:textSize">@dimen/notification_importance_channel_group_text</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
<item name="android:textSize">@dimen/notification_importance_channel_group_text</item>
</style>
<style name="TextAppearance.NotificationImportanceHeader">
<item name="android:textSize">@dimen/notification_importance_header_text</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.NotificationImportanceDetail">
<item name="android:textSize">@dimen/notification_importance_description_text</item>
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
<item name="android:gravity">center</item>
</style>
@@ -785,7 +764,7 @@
<style
name="TextAppearance.NotificationSectionHeaderLabel"
parent="@android:style/Widget.DeviceDefault.Button.Borderless">
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:textAllCaps">false</item>
<item name="android:textSize">14sp</item>
<item name="android:minWidth">0dp</item>
@@ -794,7 +773,7 @@
<style
name="TextAppearance.NotificationSectionHeaderButton"
parent="@android:style/Widget.DeviceDefault.Button.Borderless">
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:textAllCaps">false</item>
<item name="android:textSize">14sp</item>
<item name="android:minWidth">0dp</item>
@@ -803,7 +782,7 @@
<style
name="TextAppearance.NotificationFooterButton"
parent="@android:style/Widget.DeviceDefault.Button.Borderless">
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:textAllCaps">false</item>
<item name="android:textSize">14sp</item>
<item name="android:minWidth">0dp</item>
@@ -812,8 +791,8 @@
<style
name="TextAppearance.NotificationFooterButtonRedesign"
parent="@android:style/Widget.DeviceDefault.Button.Borderless">
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
- <item name="android:drawableTint">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
+ <item name="android:drawableTint">@androidprv:color/materialColorOnSurface</item>
<item name="android:textAllCaps">false</item>
<item name="android:textSize">16sp</item>
<item name="android:minWidth">0dp</item>
@@ -1009,12 +988,12 @@
</style>
<style name="LongScreenshotActivity" parent="@android:style/Theme.DeviceDefault.DayNight">
- <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceContainer</item>
+ <item name="android:colorBackground">@androidprv:color/materialColorSurfaceContainer</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowLightNavigationBar">true</item>
- <item name="android:statusBarColor">?androidprv:attr/materialColorSurfaceContainer</item>
- <item name="android:navigationBarColor">?androidprv:attr/materialColorSurfaceContainerHighest</item>
+ <item name="android:statusBarColor">@androidprv:color/materialColorSurfaceContainer</item>
+ <item name="android:navigationBarColor">@androidprv:color/materialColorSurfaceContainerHighest</item>
<item name="android:windowActivityTransitions">true</item>
</style>
@@ -1092,7 +1071,7 @@
<style name="Theme.VolumePanel.Popup" parent="@style/Theme.SystemUI.Dialog">
<item name="android:dialogCornerRadius">44dp</item>
- <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceContainerHigh
+ <item name="android:colorBackground">@androidprv:color/materialColorSurfaceContainerHigh
</item>
</style>
@@ -1303,7 +1282,7 @@
</style>
<style name="TextAppearance.Dialog.Title" parent="@android:style/TextAppearance.DeviceDefault.Large">
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:textSize">@dimen/dialog_title_text_size</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:lineHeight">32sp</item>
@@ -1313,7 +1292,7 @@
</style>
<style name="TextAppearance.Dialog.Body" parent="@android:style/TextAppearance.DeviceDefault.Medium">
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
<item name="android:textSize">14sp</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:lineHeight">20sp</item>
@@ -1408,7 +1387,7 @@
<style name="InternetDialog.NetworkTitle.Active">
<item name="android:textAppearance">@style/TextAppearance.InternetDialog.Active</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item>
</style>
<style name="InternetDialog.NetworkSummary">
@@ -1421,27 +1400,27 @@
<style name="InternetDialog.NetworkSummary.Active">
<item name="android:textAppearance">@style/TextAppearance.InternetDialog.Secondary.Active
</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item>
</style>
<style name="TextAppearance.InternetDialog">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:textSize">16sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:textDirection">locale</item>
</style>
<style name="TextAppearance.InternetDialog.Secondary">
<item name="android:textSize">14sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
</style>
<style name="TextAppearance.InternetDialog.Active">
- <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item>
</style>
<style name="TextAppearance.InternetDialog.Secondary.Active">
- <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item>
</style>
<style name="FgsManagerDialogTitle">
@@ -1478,18 +1457,18 @@
<item name="android:orientation">horizontal</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.BluetoothTileDialog">
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:textDirection">locale</item>
<item name="android:textAlignment">gravity</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.BluetoothTileDialog.Active">
- <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryContainer</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnPrimaryContainer</item>
</style>
<style name="BluetoothTileDialog.AudioSharingButton" parent="Widget.Dialog.Button">
@@ -1686,7 +1665,7 @@
<style name="ShortCutButton" parent="@android:style/Widget.Material.Button">
<item name="android:background">@drawable/shortcut_button_colored</item>
<item name="android:textSize">16sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
<item name="android:layout_marginEnd">12dp</item>
<item name="android:paddingLeft">24dp</item>
<item name="android:paddingRight">24dp</item>
@@ -1712,18 +1691,18 @@
parent="@android:style/TextAppearance.DeviceDefault.Medium">
<item name="android:textSize">14sp</item>
<item name="android:lineHeight">20sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="TextAppearance.PrivacyDialog.Item.Summary"
parent="@android:style/TextAppearance.DeviceDefault.Small">
<item name="android:textSize">14sp</item>
<item name="android:lineHeight">20sp</item>
- <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurfaceVariant</item>
</style>
<style name="Theme.PrivacyDialog" parent="@style/Theme.SystemUI.Dialog">
- <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceContainer</item>
+ <item name="android:colorBackground">@androidprv:color/materialColorSurfaceContainer</item>
</style>
<style name="Theme.SystemUI.Dialog.StickyKeys" parent="@style/Theme.SystemUI.Dialog">
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
index 9e8cabf141ed..8576a6ebac42 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
@@ -330,6 +330,11 @@ public class Task {
}
@Override
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ @Override
public String toString() {
return "[" + key.toString() + "] " + title;
}
diff --git a/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt b/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt
index 495367b69123..842efa3d68d0 100644
--- a/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt
+++ b/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt
@@ -25,7 +25,6 @@ import android.content.res.ColorStateList
import android.util.AttributeSet
import android.view.View
import com.android.app.animation.Interpolators
-import com.android.settingslib.Utils
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.TITLE
/** Displays security messages for the keyguard bouncer. */
@@ -71,12 +70,12 @@ open class BouncerKeyguardMessageArea(context: Context?, attrs: AttributeSet?) :
}
override fun onThemeChanged() {
- mDefaultColorState = getColorInStyle() ?: Utils.getColorAttr(context, TITLE)
+ mDefaultColorState = getColorInStyle() ?: ColorStateList.valueOf(context.getColor(TITLE))
super.onThemeChanged()
}
override fun reloadColor() {
- mDefaultColorState = getColorInStyle() ?: Utils.getColorAttr(context, TITLE)
+ mDefaultColorState = getColorInStyle() ?: ColorStateList.valueOf(context.getColor(TITLE))
super.reloadColor()
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index fcaccd27a567..36afe1e0fe18 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -346,8 +346,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
setPadding(getPaddingLeft(), getPaddingTop() + getResources().getDimensionPixelSize(
R.dimen.keyguard_security_container_padding_top), getPaddingRight(),
getPaddingBottom());
- setBackgroundColor(Utils.getColorAttrDefaultColor(getContext(),
- com.android.internal.R.attr.materialColorSurfaceDim));
+ setBackgroundColor(
+ getContext().getColor(com.android.internal.R.color.materialColorSurfaceDim));
}
void onResume(SecurityMode securityMode, boolean faceAuthEnabled) {
@@ -814,8 +814,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
void reloadColors() {
mViewMode.reloadColors();
- setBackgroundColor(Utils.getColorAttrDefaultColor(getContext(),
- com.android.internal.R.attr.materialColorSurfaceDim));
+ setBackgroundColor(getContext().getColor(
+ com.android.internal.R.color.materialColorSurfaceDim));
}
/** Handles density or font scale changes. */
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt
index 392abf2aa82c..0942353a7110 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimInputView.kt
@@ -20,7 +20,6 @@ import android.content.Context
import android.util.AttributeSet
import android.widget.ImageView
import androidx.core.graphics.drawable.DrawableCompat
-import com.android.settingslib.Utils
import com.android.systemui.res.R
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.EMERGENCY_BUTTON
@@ -45,7 +44,7 @@ abstract class KeyguardSimInputView(context: Context, attrs: AttributeSet) :
override fun reloadColors() {
super.reloadColors()
- val imageColor = Utils.getColorAttrDefaultColor(context, EMERGENCY_BUTTON)
+ val imageColor = context.getColor(EMERGENCY_BUTTON)
simImageView?.let {
val wrappedDrawable = DrawableCompat.wrap(it.drawable)
DrawableCompat.setTint(wrappedDrawable, imageColor)
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
index e77341651a8e..aed1c10ead24 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
@@ -15,21 +15,17 @@
*/
package com.android.keyguard;
-import static com.android.settingslib.Utils.getColorAttrDefaultColor;
import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_BACKGROUND;
import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_BACKGROUND_PRESSED;
import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_BUTTON;
import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_KEY;
import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.ColorId.NUM_PAD_PRESSED;
-import static com.android.systemui.util.ColorUtilKt.getPrivateAttrColorIfUnset;
import android.animation.AnimatorSet;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.annotation.Nullable;
-import android.annotation.SuppressLint;
import android.content.Context;
-import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.view.ContextThemeWrapper;
@@ -126,18 +122,15 @@ class NumPadAnimator {
int[] customAttrs = {android.R.attr.colorControlNormal};
ContextThemeWrapper ctw = new ContextThemeWrapper(context, mStyle);
- @SuppressLint("ResourceType") TypedArray a = ctw.obtainStyledAttributes(customAttrs);
- mNormalBackgroundColor = getPrivateAttrColorIfUnset(ctw, a, 0, 0,
- NUM_PAD_BACKGROUND);
- a.recycle();
+ mNormalBackgroundColor = ctw.getColor(NUM_PAD_BACKGROUND);
- mPressedBackgroundColor = getColorAttrDefaultColor(context, NUM_PAD_BACKGROUND_PRESSED);
- mTextColorPressed = getColorAttrDefaultColor(context, NUM_PAD_PRESSED);
+ mPressedBackgroundColor = context.getColor(NUM_PAD_BACKGROUND_PRESSED);
+ mTextColorPressed = context.getColor(NUM_PAD_PRESSED);
mBackground.setColor(mNormalBackgroundColor);
mTextColorPrimary = isNumPadKey
- ? getColorAttrDefaultColor(context, NUM_PAD_KEY)
- : getColorAttrDefaultColor(context, NUM_PAD_BUTTON);
+ ? context.getColor(NUM_PAD_KEY)
+ : context.getColor(NUM_PAD_BUTTON);
createAnimators();
}
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
index a81c1b0bf9c3..d7799bf505bd 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
@@ -30,7 +30,6 @@ import android.view.accessibility.AccessibilityNodeInfo;
import androidx.annotation.Nullable;
-import com.android.settingslib.Utils;
import com.android.systemui.res.R;
/**
@@ -101,7 +100,7 @@ public class NumPadButton extends AlphaOptimizedImageButton implements NumPadAni
if (mAnimator != null) mAnimator.reloadColors(getContext());
int textColorResId = mIsTransparentMode ? NUM_PAD_KEY : NUM_PAD_BUTTON;
- int imageColor = Utils.getColorAttrDefaultColor(getContext(), textColorResId);
+ int imageColor = getContext().getColor(textColorResId);
((VectorDrawable) getDrawable()).setTintList(ColorStateList.valueOf(imageColor));
}
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
index ebde8a3057ce..e8a702f5fca3 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
@@ -155,8 +155,7 @@ public class NumPadKey extends ViewGroup implements NumPadAnimationListener {
* Reload colors from resources.
**/
public void reloadColors() {
- int textColor = Utils.getColorAttr(getContext(), NUM_PAD_KEY)
- .getDefaultColor();
+ int textColor = getContext().getColor(NUM_PAD_KEY);
int klondikeColor = Utils.getColorAttr(getContext(), android.R.attr.textColorSecondary)
.getDefaultColor();
mDigitText.setTextColor(textColor);
diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java b/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java
index 5e9eed98f97b..bac9dacef9e1 100644
--- a/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java
+++ b/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java
@@ -28,7 +28,6 @@ import android.widget.LinearLayout;
import androidx.core.graphics.drawable.DrawableCompat;
-import com.android.settingslib.Utils;
import com.android.systemui.res.R;
/**
@@ -39,8 +38,7 @@ public class PinShapeHintingView extends LinearLayout implements PinShapeInput {
private int mPinLength;
private int mDotDiameter;
- private int mColor = Utils.getColorAttr(getContext(), PIN_SHAPES)
- .getDefaultColor();
+ private int mColor = getContext().getColor(PIN_SHAPES);
private int mPosition = 0;
private static final int DEFAULT_PIN_LENGTH = 6;
private PinShapeAdapter mPinShapeAdapter;
diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java
index ee70de3e86a0..26a774e991a0 100644
--- a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java
+++ b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java
@@ -39,7 +39,6 @@ import android.widget.LinearLayout;
import androidx.core.graphics.drawable.DrawableCompat;
import com.android.app.animation.Interpolators;
-import com.android.settingslib.Utils;
import com.android.systemui.res.R;
/**
@@ -49,7 +48,7 @@ import com.android.systemui.res.R;
public class PinShapeNonHintingView extends LinearLayout implements PinShapeInput {
private static final int RESET_STAGGER_DELAY = 40;
private static final int RESET_MAX_DELAY = 200;
- private int mColor = Utils.getColorAttr(getContext(), PIN_SHAPES).getDefaultColor();
+ private int mColor = getContext().getColor(PIN_SHAPES);
private int mPosition = 0;
private boolean mIsAnimatingReset = false;
private final PinShapeAdapter mPinShapeAdapter;
diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
index 3abcb139ab5c..11ce168b9bcb 100644
--- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
@@ -32,7 +32,6 @@ import android.view.View
import androidx.core.graphics.ColorUtils
import com.android.app.animation.Interpolators
import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.settingslib.Utils
import com.android.systemui.biometrics.AuthController
import com.android.systemui.log.ScreenDecorationsLogger
import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -60,8 +59,8 @@ class FaceScanningOverlay(
private val rimRect = RectF()
private var cameraProtectionColor = Color.BLACK
- var faceScanningAnimColor = Utils.getColorAttrDefaultColor(context,
- com.android.internal.R.attr.materialColorPrimaryFixed)
+ var faceScanningAnimColor =
+ context.getColor(com.android.internal.R.color.materialColorPrimaryFixed)
private var cameraProtectionAnimator: ValueAnimator? = null
var hideOverlayRunnable: Runnable? = null
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
index 559e6f767f7b..ffb5f3d47bcc 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
@@ -20,6 +20,7 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_FADE_
import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_MIGRATION_TOOLTIP_PROMPT;
import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_OPACITY;
import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE;
+import static android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES;
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
@@ -42,6 +43,7 @@ import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
+import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull;
@@ -75,6 +77,9 @@ class MenuInfoRepository {
private final Context mContext;
private final Configuration mConfiguration;
+ private final AccessibilityManager mAccessibilityManager;
+ private final AccessibilityManager.AccessibilityServicesStateChangeListener
+ mA11yServicesStateChangeListener = manager -> onTargetFeaturesChanged();
private final Handler mHandler = new Handler(Looper.getMainLooper());
private final OnSettingsContentsChanged mSettingsContentsCallback;
private final SecureSettings mSecureSettings;
@@ -142,9 +147,10 @@ class MenuInfoRepository {
}
};
- MenuInfoRepository(Context context,
+ MenuInfoRepository(Context context, AccessibilityManager accessibilityManager,
OnSettingsContentsChanged settingsContentsChanged, SecureSettings secureSettings) {
mContext = context;
+ mAccessibilityManager = accessibilityManager;
mConfiguration = new Configuration(context.getResources().getConfiguration());
mSettingsContentsCallback = settingsContentsChanged;
mSecureSettings = secureSettings;
@@ -238,6 +244,13 @@ class MenuInfoRepository {
mSecureSettings.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS),
/* notifyForDescendants */ false, mMenuTargetFeaturesContentObserver,
UserHandle.USER_CURRENT);
+ if (!com.android.systemui.Flags.floatingMenuNarrowTargetContentObserver()) {
+ mSecureSettings.registerContentObserverForUserSync(
+ mSecureSettings.getUriFor(ENABLED_ACCESSIBILITY_SERVICES),
+ /* notifyForDescendants */ false,
+ mMenuTargetFeaturesContentObserver,
+ UserHandle.USER_CURRENT);
+ }
mSecureSettings.registerContentObserverForUserSync(
mSecureSettings.getUriFor(Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE),
/* notifyForDescendants */ false, mMenuSizeContentObserver,
@@ -251,6 +264,11 @@ class MenuInfoRepository {
/* notifyForDescendants */ false, mMenuFadeOutContentObserver,
UserHandle.USER_CURRENT);
mContext.registerComponentCallbacks(mComponentCallbacks);
+
+ if (!com.android.systemui.Flags.floatingMenuNarrowTargetContentObserver()) {
+ mAccessibilityManager.addAccessibilityServicesStateChangeListener(
+ mA11yServicesStateChangeListener);
+ }
}
void unregisterObserversAndCallbacks() {
@@ -258,6 +276,11 @@ class MenuInfoRepository {
mContext.getContentResolver().unregisterContentObserver(mMenuSizeContentObserver);
mContext.getContentResolver().unregisterContentObserver(mMenuFadeOutContentObserver);
mContext.unregisterComponentCallbacks(mComponentCallbacks);
+
+ if (!com.android.systemui.Flags.floatingMenuNarrowTargetContentObserver()) {
+ mAccessibilityManager.removeAccessibilityServicesStateChangeListener(
+ mA11yServicesStateChangeListener);
+ }
}
interface OnSettingsContentsChanged {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java
index cfcaa4fea99b..cb96e7859fba 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java
@@ -42,7 +42,8 @@ class MenuViewLayerController implements IAccessibilityFloatingMenu {
NavigationModeController navigationModeController) {
mWindowManager = viewCaptureAwareWindowManager;
- MenuViewModel menuViewModel = new MenuViewModel(context, secureSettings);
+ MenuViewModel menuViewModel = new MenuViewModel(
+ context, accessibilityManager, secureSettings);
MenuViewAppearance menuViewAppearance = new MenuViewAppearance(context, windowManager);
mMenuViewLayer = new MenuViewLayer(context, windowManager, accessibilityManager,
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java
index 46c407e24fe2..f924784a5535 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java
@@ -17,6 +17,7 @@
package com.android.systemui.accessibility.floatingmenu;
import android.content.Context;
+import android.view.accessibility.AccessibilityManager;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
@@ -42,9 +43,10 @@ class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged {
private final MutableLiveData<Position> mPercentagePositionData = new MutableLiveData<>();
private final MenuInfoRepository mInfoRepository;
- MenuViewModel(Context context, SecureSettings secureSettings) {
- mInfoRepository = new MenuInfoRepository(context, /* settingsContentsChanged= */ this,
- secureSettings);
+ MenuViewModel(Context context, AccessibilityManager accessibilityManager,
+ SecureSettings secureSettings) {
+ mInfoRepository = new MenuInfoRepository(context,
+ accessibilityManager, /* settingsContentsChanged= */ this, secureSettings);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
index ad12229fe4e7..56435df1ad2c 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
@@ -52,7 +52,6 @@ import androidx.annotation.VisibleForTesting;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
-import com.android.settingslib.Utils;
import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -472,8 +471,8 @@ public class HearingDevicesDialogDelegate implements SystemUIDialog.Delegate,
view.setContentDescription(item.getToolName());
icon.setImageDrawable(item.getToolIcon());
if (item.isCustomIcon()) {
- icon.getDrawable().mutate().setTint(Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorOnPrimaryContainer).getDefaultColor());
+ icon.getDrawable().mutate().setTint(context.getColor(
+ com.android.internal.R.color.materialColorOnPrimaryContainer));
}
text.setText(item.getToolName());
Intent intent = item.getToolIntent();
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
index e47e4b27d58a..7e1d538a80ee 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
@@ -27,7 +27,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
-import com.android.settingslib.Utils;
import com.android.systemui.bluetooth.qsdialog.DeviceItem;
import com.android.systemui.res.R;
@@ -131,10 +130,9 @@ public class HearingDevicesListAdapter extends RecyclerView.Adapter<RecyclerView
}
// tint different color in different state for bad color contrast problem
- int tintColor = item.isActive() ? Utils.getColorAttr(mContext,
- com.android.internal.R.attr.materialColorOnPrimaryContainer).getDefaultColor()
- : Utils.getColorAttr(mContext,
- com.android.internal.R.attr.materialColorOnSurface).getDefaultColor();
+ int tintColor = item.isActive() ? mContext.getColor(
+ com.android.internal.R.color.materialColorOnPrimaryContainer)
+ : mContext.getColor(com.android.internal.R.color.materialColorOnSurface);
Pair<Drawable, String> iconPair = item.getIconWithDescription();
if (iconPair != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java
index 28d742cfa49b..fda4f0385f55 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesSpinnerAdapter.java
@@ -64,9 +64,9 @@ public class HearingDevicesSpinnerAdapter extends ArrayAdapter<String> {
TextView text = view.findViewById(R.id.hearing_devices_spinner_text);
if (text != null) {
- int tintColor = Utils.getColorAttr(mContext,
- isSelected ? com.android.internal.R.attr.materialColorOnPrimaryContainer
- : com.android.internal.R.attr.materialColorOnSurface).getDefaultColor();
+ int tintColor = mContext.getColor(
+ isSelected ? com.android.internal.R.color.materialColorOnPrimaryContainer
+ : com.android.internal.R.color.materialColorOnSurface);
text.setTextColor(tintColor);
}
return view;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index 316849d90cf3..d0cb507789a1 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -714,12 +714,12 @@ public class AuthController implements
onDialogDismissed(reason);
}
@Inject
- public AuthController(Context context,
+ public AuthController(@Main Context context,
@Application CoroutineScope applicationCoroutineScope,
Execution execution,
CommandQueue commandQueue,
ActivityTaskManager activityTaskManager,
- @NonNull WindowManager windowManager,
+ @NonNull @Main WindowManager windowManager,
@Nullable FingerprintManager fingerprintManager,
@Nullable FaceManager faceManager,
Optional<AuthContextPlugins> contextPlugins,
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
index f6cc72431db0..22d2aaf2a8e7 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
@@ -36,6 +36,7 @@ import com.android.systemui.Flags.lightRevealMigration
import com.android.systemui.biometrics.data.repository.FacePropertyRepository
import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.deviceentry.domain.interactor.AuthRippleInteractor
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.keyguard.shared.model.BiometricUnlockSource
@@ -69,9 +70,9 @@ import javax.inject.Provider
class AuthRippleController
@Inject
constructor(
- private val sysuiContext: Context,
+ @Main private val sysuiContext: Context,
private val authController: AuthController,
- private val configurationController: ConfigurationController,
+ @Main private val configurationController: ConfigurationController,
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
private val keyguardStateController: KeyguardStateController,
private val wakefulnessLifecycle: WakefulnessLifecycle,
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
index 027f6744d4d7..8376850c1a28 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.hardware.biometrics.BiometricSourceType;
import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
import javax.inject.Inject;
@@ -43,7 +44,7 @@ public class BiometricNotificationBroadcastReceiver extends BroadcastReceiver {
private final BiometricNotificationDialogFactory mNotificationDialogFactory;
@Inject
BiometricNotificationBroadcastReceiver(
- Context context,
+ @Main Context context,
BiometricNotificationDialogFactory notificationDialogFactory) {
mContext = context;
mNotificationDialogFactory = notificationDialogFactory;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java
index 3b49ce2f10f7..e5c22677dbcc 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java
@@ -45,6 +45,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -145,7 +146,7 @@ public class BiometricNotificationService implements CoreStartable {
};
@Inject
- public BiometricNotificationService(@NonNull Context context,
+ public BiometricNotificationService(@NonNull @Main Context context,
@NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
@NonNull KeyguardStateController keyguardStateController,
@NonNull Handler handler, @NonNull NotificationManager notificationManager,
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt
index 178e1112fa6f..d9ed9ca1f07b 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt
@@ -24,7 +24,7 @@ import com.android.systemui.biometrics.shared.model.SensorLocation
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.shade.ShadeDisplayAware
+import com.android.systemui.dagger.qualifiers.Main
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
@@ -43,7 +43,7 @@ constructor(
@Application private val applicationScope: CoroutineScope,
@Application private val context: Context,
repository: FingerprintPropertyRepository,
- @ShadeDisplayAware configurationInteractor: ConfigurationInteractor,
+ @Main configurationInteractor: ConfigurationInteractor,
displayStateInteractor: DisplayStateInteractor,
udfpsOverlayInteractor: UdfpsOverlayInteractor,
) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt
index c3dc2d406cbc..52e85576e756 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt
@@ -26,6 +26,7 @@ import com.android.systemui.biometrics.shared.model.DisplayRotation
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.isDefaultOrientation
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -48,9 +49,9 @@ import kotlinx.coroutines.flow.onEach
class SideFpsSensorInteractor
@Inject
constructor(
- private val context: Context,
+ @Main private val context: Context,
fingerprintPropertyRepository: FingerprintPropertyRepository,
- windowManager: WindowManager,
+ @Main windowManager: WindowManager,
displayStateInteractor: DisplayStateInteractor,
fingerprintInteractiveToAuthProvider: Optional<FingerprintInteractiveToAuthProvider>,
biometricSettingsRepository: BiometricSettingsRepository,
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt
index 0ad83ec0c3f5..38b1d7d81332 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt
@@ -37,7 +37,6 @@ import android.widget.Button
import android.widget.LinearLayout
import android.widget.Space
import android.widget.TextView
-import com.android.settingslib.Utils
import com.android.systemui.biometrics.Utils.ellipsize
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.res.R
@@ -294,7 +293,7 @@ private fun getListItemBulletGapWidth(resources: Resources): Int =
resources.getDimensionPixelSize(R.dimen.biometric_prompt_content_list_item_bullet_gap_width)
private fun getListItemBulletColor(context: Context): Int =
- Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.materialColorOnSurface)
+ context.getColor(com.android.internal.R.color.materialColorOnSurface)
private fun <T : View> T.width(function: (Int) -> Unit) {
if (width == 0)
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
index df34952f4f8d..4dcf26808a9e 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
@@ -982,8 +982,9 @@ private fun Context.getUserBadgedLogoInfo(
activityTaskManager: ActivityTaskManager,
): Pair<Drawable?, String> {
// If the app sets customized icon/description, use the passed-in value directly
- var icon: Drawable? =
- if (prompt.logoBitmap != null) BitmapDrawable(resources, prompt.logoBitmap) else null
+ val customizedIcon: Drawable? =
+ prompt.logoBitmap?.let { BitmapDrawable(resources, prompt.logoBitmap) }
+ var icon = customizedIcon
var label = prompt.logoDescription ?: ""
if (icon != null && label.isNotEmpty()) {
return Pair(icon, label)
@@ -1009,12 +1010,11 @@ private fun Context.getUserBadgedLogoInfo(
}
}
- // Add user badge
+ // Add user badge for non-customized logo icon
val userHandle = UserHandle.of(prompt.userInfo.userId)
- if (label.isNotEmpty()) {
- label = packageManager.getUserBadgedLabel(label, userHandle).toString()
+ if (icon != null && icon != customizedIcon) {
+ icon = packageManager.getUserBadgedIcon(icon, userHandle)
}
- icon = icon?.let { packageManager.getUserBadgedIcon(it, userHandle) }
return Pair(icon, label)
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt
index c2a4ee36dec6..555716191c96 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt
@@ -164,21 +164,12 @@ constructor(
showIndicatorForDeviceEntry: Boolean ->
val callbacks = mutableListOf<LottieCallback>()
if (showIndicatorForDeviceEntry) {
- val indicatorColor =
- com.android.settingslib.Utils.getColorAttrDefaultColor(
- applicationContext,
- com.android.internal.R.attr.materialColorPrimaryFixed
- )
- val outerRimColor =
- com.android.settingslib.Utils.getColorAttrDefaultColor(
- applicationContext,
- com.android.internal.R.attr.materialColorPrimaryFixedDim
- )
- val chevronFill =
- com.android.settingslib.Utils.getColorAttrDefaultColor(
- applicationContext,
- com.android.internal.R.attr.materialColorOnPrimaryFixed
- )
+ val indicatorColor = applicationContext.getColor(
+ com.android.internal.R.color.materialColorPrimaryFixed)
+ val outerRimColor = applicationContext.getColor(
+ com.android.internal.R.color.materialColorPrimaryFixedDim)
+ val chevronFill = applicationContext.getColor(
+ com.android.internal.R.color.materialColorOnPrimaryFixed)
callbacks.add(LottieCallback(KeyPath(".blue600", "**"), indicatorColor))
callbacks.add(LottieCallback(KeyPath(".blue400", "**"), outerRimColor))
callbacks.add(LottieCallback(KeyPath(".black", "**"), chevronFill))
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt
index d7a0fc9770ee..9cfb5be478ed 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt
@@ -405,13 +405,10 @@ internal constructor(
}
// updating icon colors
- val tintColor =
- com.android.settingslib.Utils.getColorAttr(
- context,
- if (item.isActive) InternalR.attr.materialColorOnPrimaryContainer
- else InternalR.attr.materialColorOnSurface,
- )
- .defaultColor
+ val tintColor = context.getColor(
+ if (item.isActive) InternalR.color.materialColorOnPrimaryContainer
+ else InternalR.color.materialColorOnSurface
+ )
// update icons
iconView.apply {
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt b/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt
index a42ae03b2c4e..cdd1b3c3cf54 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/EmergencyServicesRepository.kt
@@ -18,7 +18,6 @@ package com.android.systemui.bouncer.data.repository
import android.content.res.Resources
import com.android.internal.R
-import com.android.systemui.common.ui.GlobalConfig
import com.android.systemui.common.ui.data.repository.ConfigurationRepository
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
@@ -37,7 +36,7 @@ class EmergencyServicesRepository
constructor(
@Application private val applicationScope: CoroutineScope,
@Main private val resources: Resources,
- @GlobalConfig configurationRepository: ConfigurationRepository,
+ @Main configurationRepository: ConfigurationRepository,
) {
/**
* Whether to enable emergency services calls while the SIM card is locked. This is disabled in
@@ -49,7 +48,7 @@ constructor(
.stateIn(
scope = applicationScope,
started = SharingStarted.Eagerly,
- initialValue = getEnableEmergencyCallWhileSimLocked()
+ initialValue = getEnableEmergencyCallWhileSimLocked(),
)
private fun getEnableEmergencyCallWhileSimLocked(): Boolean {
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt b/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt
index 9f1781177f7a..a286d16826cd 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt
@@ -33,13 +33,15 @@ object KeyguardBouncerConstants {
const val DEFAULT_PIN_LENGTH = 6
object ColorId {
- const val TITLE = com.android.internal.R.attr.materialColorOnSurface
- const val PIN_SHAPES = com.android.internal.R.attr.materialColorOnSurfaceVariant
- const val NUM_PAD_BACKGROUND = com.android.internal.R.attr.materialColorSurfaceContainerHigh
- const val NUM_PAD_BACKGROUND_PRESSED = com.android.internal.R.attr.materialColorPrimaryFixed
- const val NUM_PAD_PRESSED = com.android.internal.R.attr.materialColorOnPrimaryFixed
- const val NUM_PAD_KEY = com.android.internal.R.attr.materialColorOnSurface
- const val NUM_PAD_BUTTON = com.android.internal.R.attr.materialColorOnSecondaryFixed
- const val EMERGENCY_BUTTON = com.android.internal.R.attr.materialColorTertiaryFixed
+ const val TITLE = com.android.internal.R.color.materialColorOnSurface
+ const val PIN_SHAPES = com.android.internal.R.color.materialColorOnSurfaceVariant
+ const val NUM_PAD_BACKGROUND =
+ com.android.internal.R.color.materialColorSurfaceContainerHigh
+ const val NUM_PAD_BACKGROUND_PRESSED =
+ com.android.internal.R.color.materialColorPrimaryFixed
+ const val NUM_PAD_PRESSED = com.android.internal.R.color.materialColorOnPrimaryFixed
+ const val NUM_PAD_KEY = com.android.internal.R.color.materialColorOnSurface
+ const val NUM_PAD_BUTTON = com.android.internal.R.color.materialColorOnSecondaryFixed
+ const val EMERGENCY_BUTTON = com.android.internal.R.color.materialColorTertiaryFixed
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt b/packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt
index d235c95eb906..d53a737480a3 100644
--- a/packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt
+++ b/packages/SystemUI/src/com/android/systemui/common/shared/model/Color.kt
@@ -18,6 +18,7 @@ package com.android.systemui.common.shared.model
import android.annotation.AttrRes
import android.annotation.ColorInt
+import android.annotation.ColorRes
/**
* Models a color that can be either a specific [Color.Loaded] value or a resolvable theme
@@ -28,4 +29,6 @@ sealed interface Color {
data class Loaded(@ColorInt val color: Int) : Color
data class Attribute(@AttrRes val attribute: Int) : Color
+
+ data class Resource(@ColorRes val colorRes: Int) : Color
}
diff --git a/packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt b/packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt
index 0869351e727b..6a6c3eb05399 100644
--- a/packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt
+++ b/packages/SystemUI/src/com/android/systemui/common/shared/model/TintedIcon.kt
@@ -16,10 +16,10 @@
package com.android.systemui.common.shared.model
-import androidx.annotation.AttrRes
+import androidx.annotation.ColorRes
/** Models an icon with a specific tint. */
data class TintedIcon(
val icon: Icon,
- @AttrRes val tint: Int?,
+ @ColorRes val tint: Int?,
)
diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt b/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt
index 7f50e4a06022..ad504d502847 100644
--- a/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationModule.kt
@@ -21,21 +21,11 @@ import com.android.systemui.common.ui.data.repository.ConfigurationRepository
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractorImpl
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.policy.ConfigurationController
import dagger.Binds
import dagger.Module
import dagger.Provides
-import javax.inject.Qualifier
-
-/**
- * Annotates elements that provide information from the global configuration.
- *
- * The global configuration is the one associated with the main display. Secondary displays will
- * apply override to the global configuration. Elements annotated with this shouldn't be used for
- * secondary displays.
- */
-@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class GlobalConfig
@Module
interface ConfigurationModule {
@@ -45,32 +35,32 @@ interface ConfigurationModule {
* now, without annotation the global config associated state is provided.
*/
@Binds
- @Deprecated("Use the @GlobalConfig annotated one instead of this.")
+ @Deprecated("Use the @Main annotated one instead of this.")
fun provideGlobalConfigurationState(
- @GlobalConfig configurationState: ConfigurationState
+ @Main configurationState: ConfigurationState
): ConfigurationState
@Binds
- @Deprecated("Use the @GlobalConfig annotated one instead of this.")
+ @Deprecated("Use the @Main annotated one instead of this.")
fun provideDefaultConfigurationState(
- @GlobalConfig configurationState: ConfigurationInteractor
+ @Main configurationState: ConfigurationInteractor
): ConfigurationInteractor
companion object {
@SysUISingleton
@Provides
- @GlobalConfig
+ @Main
fun provideGlobalConfigurationState(
configStateFactory: ConfigurationStateImpl.Factory,
configurationController: ConfigurationController,
- @Application context: Context,
+ @Main context: Context,
): ConfigurationState {
return configStateFactory.create(context, configurationController)
}
@SysUISingleton
@Provides
- @GlobalConfig
+ @Main
fun provideGlobalConfigurationInteractor(
configurationRepository: ConfigurationRepository
): ConfigurationInteractor {
diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt
index df891523798f..4d804d06fe87 100644
--- a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt
@@ -23,9 +23,9 @@ import android.view.DisplayInfo
import androidx.annotation.DimenRes
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
-import com.android.systemui.common.ui.GlobalConfig
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.wrapper.DisplayUtilsWrapper
import dagger.Binds
@@ -162,19 +162,19 @@ abstract class ConfigurationRepositoryModule {
* injected.
*/
@Binds
- @Deprecated("Use the ConfigurationRepository annotated with @GlobalConfig instead.")
+ @Deprecated("Use the ConfigurationRepository annotated with @Main instead.")
@SysUISingleton
abstract fun provideDefaultConfigRepository(
- @GlobalConfig configurationRepository: ConfigurationRepository
+ @Main configurationRepository: ConfigurationRepository
): ConfigurationRepository
companion object {
@Provides
- @GlobalConfig
+ @Main
@SysUISingleton
fun provideGlobalConfigRepository(
context: Context,
- @GlobalConfig configurationController: ConfigurationController,
+ @Main configurationController: ConfigurationController,
factory: ConfigurationRepositoryImpl.Factory,
): ConfigurationRepository {
return factory.create(context, configurationController)
diff --git a/packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt b/packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt
index 421774462974..481acc935f41 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/util/CommunalColors.kt
@@ -18,7 +18,6 @@ package com.android.systemui.communal.util
import android.content.Context
import android.graphics.Color
-import com.android.settingslib.Utils
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
@@ -54,9 +53,6 @@ constructor(
private fun loadBackgroundColor(): Color =
Color.valueOf(
- Utils.getColorAttrDefaultColor(
- context,
- com.android.internal.R.attr.materialColorPrimary
- )
+ context.getColor(com.android.internal.R.color.materialColorPrimary)
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
index 78a8a42e2743..9ae106c3ab39 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
@@ -708,6 +708,14 @@ public class FrameworkServicesModule {
return context.getSystemService(WindowManager.class);
}
+ /** A window manager working for the default display only. */
+ @Provides
+ @Singleton
+ @Main
+ static WindowManager provideMainWindowManager(WindowManager windowManager) {
+ return windowManager;
+ }
+
@Provides
@Singleton
static ViewCaptureAwareWindowManager provideViewCaptureAwareWindowManager(
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java b/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java
index 3072f74dff2b..ddc88a839a63 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java
@@ -21,6 +21,7 @@ import android.util.DisplayMetrics;
import android.view.Display;
import com.android.systemui.dagger.qualifiers.Application;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.PluginsModule;
import com.android.systemui.unfold.UnfoldTransitionModule;
import com.android.systemui.util.concurrency.GlobalConcurrencyModule;
@@ -62,6 +63,13 @@ public class GlobalModule {
return context.getApplicationContext();
}
+ /** Provides the default content with the main annotation. */
+ @Provides
+ @Main
+ public Context provideMainContext(Context context) {
+ return context;
+ }
+
/**
* @deprecated Deprecdated because {@link Display#getMetrics} is deprecated.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index 580896cb534e..00eead6eb7fc 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -21,7 +21,7 @@ import com.android.systemui.CoreStartable;
import com.android.systemui.Dependency;
import com.android.systemui.InitController;
import com.android.systemui.SystemUIAppComponentFactoryBase;
-import com.android.systemui.common.ui.GlobalConfig;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.PerUser;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardSliceProvider;
@@ -128,14 +128,14 @@ public interface SysUIComponent {
* Creates a ConfigurationController.
*/
@SysUISingleton
- @GlobalConfig
+ @Main
ConfigurationController getConfigurationController();
/**
* Creates a ConfigurationForwarder.
*/
@SysUISingleton
- @GlobalConfig
+ @Main
ConfigurationForwarder getConfigurationForwarder();
/**
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt
index 1e9be09bc3f3..246f6571f2da 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt
@@ -17,7 +17,6 @@
package com.android.systemui.keyboard.backlight.ui.view
-import android.annotation.AttrRes
import android.annotation.ColorInt
import android.app.Dialog
import android.content.Context
@@ -38,7 +37,6 @@ import android.widget.LinearLayout.LayoutParams
import android.widget.LinearLayout.LayoutParams.WRAP_CONTENT
import androidx.annotation.IdRes
import androidx.core.view.setPadding
-import com.android.settingslib.Utils
import com.android.systemui.res.R
class KeyboardBacklightDialog(
@@ -80,25 +78,25 @@ class KeyboardBacklightDialog(
@ColorInt
private val filledRectangleColor =
- getColorFromStyle(com.android.internal.R.attr.materialColorPrimary)
+ context.getColor(com.android.internal.R.color.materialColorPrimary)
@ColorInt
private val emptyRectangleColor =
- getColorFromStyle(com.android.internal.R.attr.materialColorOutlineVariant)
+ context.getColor(com.android.internal.R.color.materialColorOutlineVariant)
@ColorInt
private val backgroundColor =
- getColorFromStyle(com.android.internal.R.attr.materialColorSurfaceBright)
+ context.getColor(com.android.internal.R.color.materialColorSurfaceBright)
@ColorInt
private val defaultIconColor =
- getColorFromStyle(com.android.internal.R.attr.materialColorOnPrimary)
+ context.getColor(com.android.internal.R.color.materialColorOnPrimary)
@ColorInt
private val defaultIconBackgroundColor =
- getColorFromStyle(com.android.internal.R.attr.materialColorPrimary)
+ context.getColor(com.android.internal.R.color.materialColorPrimary)
@ColorInt
private val dimmedIconColor =
- getColorFromStyle(com.android.internal.R.attr.materialColorOnSurface)
+ context.getColor(com.android.internal.R.color.materialColorOnSurface)
@ColorInt
private val dimmedIconBackgroundColor =
- getColorFromStyle(com.android.internal.R.attr.materialColorSurfaceDim)
+ context.getColor(com.android.internal.R.color.materialColorSurfaceDim)
private val levelContentDescription = context.getString(R.string.keyboard_backlight_value)
@@ -153,11 +151,6 @@ class KeyboardBacklightDialog(
}
}
- @ColorInt
- fun getColorFromStyle(@AttrRes colorId: Int): Int {
- return Utils.getColorAttrDefaultColor(context, colorId)
- }
-
fun updateState(current: Int, max: Int, forceRefresh: Boolean = false) {
if (maxLevel != max || forceRefresh) {
maxLevel = max
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt
index 84a423e226b4..c3e6f0c6b280 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt
@@ -21,11 +21,10 @@ import android.view.Surface
import android.view.WindowManager
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.settingslib.Utils
-import com.android.systemui.common.ui.GlobalConfig
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyboard.docking.domain.interactor.KeyboardDockingIndicationInteractor
import com.android.systemui.surfaceeffects.glowboxeffect.GlowBoxConfig
import javax.inject.Inject
@@ -37,10 +36,10 @@ import kotlinx.coroutines.flow.asStateFlow
class KeyboardDockingIndicationViewModel
@Inject
constructor(
- private val windowManager: WindowManager,
- @Application private val context: Context,
+ @Main private val windowManager: WindowManager,
+ @Main private val context: Context,
keyboardDockingIndicationInteractor: KeyboardDockingIndicationInteractor,
- @GlobalConfig configurationInteractor: ConfigurationInteractor,
+ @Main configurationInteractor: ConfigurationInteractor,
@Background private val backgroundScope: CoroutineScope,
) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/OWNERS b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/OWNERS
new file mode 100644
index 000000000000..2355c48158f7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 1562219
+chrisgollner@google.com
+jmokut@google.com \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt
index 30a2f330edf6..d7be5e622276 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt
@@ -136,10 +136,6 @@ class InputGestureMaps @Inject constructor(private val context: Context) {
KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT to R.string.system_multitasking_lhs,
KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT to R.string.system_multitasking_rhs,
KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION to R.string.system_multitasking_full_screen,
- KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT to
- R.string.system_multitasking_splitscreen_focus_lhs,
- KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT to
- R.string.system_multitasking_splitscreen_focus_rhs,
)
val shortcutLabelToKeyGestureTypeMap: Map<String, Int>
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt
index df6b04e2afd3..d785b5b5a7e7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/MultitaskingShortcutsSource.kt
@@ -26,7 +26,6 @@ import android.view.KeyEvent.KEYCODE_EQUALS
import android.view.KeyEvent.KEYCODE_LEFT_BRACKET
import android.view.KeyEvent.KEYCODE_MINUS
import android.view.KeyEvent.KEYCODE_RIGHT_BRACKET
-import android.view.KeyEvent.META_ALT_ON
import android.view.KeyEvent.META_CTRL_ON
import android.view.KeyEvent.META_META_ON
import android.view.KeyboardShortcutGroup
@@ -74,20 +73,6 @@ constructor(@Main private val resources: Resources, @Application private val con
command(META_META_ON or META_CTRL_ON, KEYCODE_DPAD_UP)
}
)
- // Change split screen focus to RHS:
- // - Meta + Alt + Right arrow
- add(
- shortcutInfo(resources.getString(R.string.system_multitasking_splitscreen_focus_rhs)) {
- command(META_META_ON or META_ALT_ON, KEYCODE_DPAD_RIGHT)
- }
- )
- // Change split screen focus to LHS:
- // - Meta + Alt + Left arrow
- add(
- shortcutInfo(resources.getString(R.string.system_multitasking_splitscreen_focus_lhs)) {
- command(META_META_ON or META_ALT_ON, KEYCODE_DPAD_LEFT)
- }
- )
if (enableMoveToNextDisplayShortcut()) {
// Move a window to the next display:
// - Meta + Ctrl + D
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt
index 272491850c9c..af6f0cb2ec83 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt
@@ -615,7 +615,7 @@ private fun Shortcut(
}
.focusable(interactionSource = interactionSource)
.padding(8.dp)
- .semantics { contentDescription = shortcut.contentDescription }
+ .semantics(mergeDescendants = true) { contentDescription = shortcut.contentDescription }
) {
Row(
modifier =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
index 0cb8dd4798fa..5c03d65e570f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
@@ -36,7 +36,6 @@ import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapNotNull
/**
@@ -51,17 +50,11 @@ constructor(
private val logger: KeyguardTransitionAnimationLogger,
) {
/** Invoke once per transition between FROM->TO states to get access to a shared flow. */
- fun setup(
- duration: Duration,
- edge: Edge,
- ): FlowBuilder {
+ fun setup(duration: Duration, edge: Edge): FlowBuilder {
return FlowBuilder(duration, edge)
}
- inner class FlowBuilder(
- private val transitionDuration: Duration,
- private val edge: Edge,
- ) {
+ inner class FlowBuilder(private val transitionDuration: Duration, private val edge: Edge) {
fun setupWithoutSceneContainer(edge: Edge.StateToState): FlowBuilder {
if (SceneContainerFlag.isEnabled) return this
return setup(this.transitionDuration, edge)
@@ -72,6 +65,8 @@ constructor(
* in the range of [0, 1]. View animations should begin and end within a subset of this
* range. This function maps the [startTime] and [duration] into [0, 1], when this subset is
* valid.
+ *
+ * Note that [onCancel] isn't used when the scene framework is enabled.
*/
fun sharedFlow(
duration: Duration,
@@ -81,7 +76,7 @@ constructor(
onCancel: (() -> Float)? = null,
onFinish: (() -> Float)? = null,
interpolator: Interpolator = LINEAR,
- name: String? = null
+ name: String? = null,
): Flow<Float> {
return sharedFlowWithState(
duration = duration,
@@ -113,7 +108,7 @@ constructor(
onCancel: (() -> Float)? = null,
onFinish: (() -> Float)? = null,
interpolator: Interpolator = LINEAR,
- name: String? = null
+ name: String? = null,
): Flow<StateToValue> {
if (!duration.isPositive()) {
throw IllegalArgumentException("duration must be a positive number: $duration")
@@ -155,20 +150,40 @@ constructor(
return transitionInteractor
.transition(edge)
- .map { step ->
- StateToValue(
- from = step.from,
- to = step.to,
- transitionState = step.transitionState,
- value =
- when (step.transitionState) {
- STARTED -> stepToValue(step)
- RUNNING -> stepToValue(step)
- CANCELED -> onCancel?.invoke()
- FINISHED -> onFinish?.invoke()
- }
- )
- .also { logger.logTransitionStep(name, step, it.value) }
+ .mapNotNull { step ->
+ if (SceneContainerFlag.isEnabled && step.transitionState == CANCELED) {
+ // When the scene framework is enabled, there's no need to emit an alpha
+ // value when the keyguard transition animation is canceled because there's
+ // always going to be a new, reversed keyguard transition animation back to
+ // the original KeyguardState that starts right when this one was canceled.
+ //
+ // For example, if swiping up slightly on the Lockscreen scene and then
+ // releasing before the transition to the Bouncer scene is committed, the
+ // KTF transition of LOCKSCREEN -> PRIMARY_BOUNCER received a CANCELED and
+ // the scene framework immediately starts a reversed transition of
+ // PRIMARY_BOUNCER -> LOCKSCREEN, which picks up where the previous one left
+ // off.
+ //
+ // If it were allowed for the CANCELED from the original KTF transition to
+ // emit a value, a race condition could form where the value from CANCELED
+ // arrives downstream _after_ the reversed transition is finished, causing
+ // the transition to end up in an incorrect state at rest.
+ null
+ } else {
+ StateToValue(
+ from = step.from,
+ to = step.to,
+ transitionState = step.transitionState,
+ value =
+ when (step.transitionState) {
+ STARTED -> stepToValue(step)
+ RUNNING -> stepToValue(step)
+ CANCELED -> onCancel?.invoke()
+ FINISHED -> onFinish?.invoke()
+ },
+ )
+ .also { logger.logTransitionStep(name, step, it.value) }
+ }
}
.distinctUntilChanged()
}
@@ -181,7 +196,7 @@ constructor(
duration = 1.milliseconds,
onStep = { value },
onCancel = { value },
- onFinish = { value }
+ onFinish = { value },
)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
index 3bdf7dac75b3..c59fe5357ccb 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
@@ -17,6 +17,7 @@
package com.android.systemui.keyguard.ui.binder
import android.annotation.SuppressLint
+import android.content.res.ColorStateList
import android.graphics.Rect
import android.graphics.drawable.Animatable2
import android.util.Size
@@ -37,7 +38,6 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.app.animation.Interpolators
import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.settingslib.Utils
import com.android.systemui.animation.ActivityTransitionAnimator
import com.android.systemui.animation.Expandable
import com.android.systemui.animation.view.LaunchableLinearLayout
@@ -382,25 +382,25 @@ object KeyguardBottomAreaViewBinder {
view.isActivated = viewModel.isActivated
view.drawable.setTint(
- Utils.getColorAttrDefaultColor(
- view.context,
+ view.context.getColor(
if (viewModel.isActivated) {
- com.android.internal.R.attr.materialColorOnPrimaryFixed
+ com.android.internal.R.color.materialColorOnPrimaryFixed
} else {
- com.android.internal.R.attr.materialColorOnSurface
- },
+ com.android.internal.R.color.materialColorOnSurface
+ }
)
)
view.backgroundTintList =
if (!viewModel.isSelected) {
- Utils.getColorAttr(
- view.context,
- if (viewModel.isActivated) {
- com.android.internal.R.attr.materialColorPrimaryFixed
- } else {
- com.android.internal.R.attr.materialColorSurfaceContainerHigh
- }
+ ColorStateList.valueOf(
+ view.context.getColor(
+ if (viewModel.isActivated) {
+ com.android.internal.R.color.materialColorPrimaryFixed
+ } else {
+ com.android.internal.R.color.materialColorSurfaceContainerHigh
+ }
+ )
)
} else {
null
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
index 191e08b0de77..5c8a234ec6c4 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
@@ -18,6 +18,7 @@
package com.android.systemui.keyguard.ui.binder
import android.annotation.SuppressLint
+import android.content.res.ColorStateList
import android.graphics.drawable.Animatable2
import android.util.Size
import android.view.View
@@ -32,7 +33,6 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
-import com.android.settingslib.Utils
import com.android.systemui.animation.Expandable
import com.android.systemui.animation.view.LaunchableImageView
import com.android.systemui.common.shared.model.Icon
@@ -176,25 +176,25 @@ constructor(
view.isActivated = viewModel.isActivated
view.drawable.setTint(
- Utils.getColorAttrDefaultColor(
- view.context,
+ view.context.getColor(
if (viewModel.isActivated) {
- com.android.internal.R.attr.materialColorOnPrimaryFixed
+ com.android.internal.R.color.materialColorOnPrimaryFixed
} else {
- com.android.internal.R.attr.materialColorOnSurface
+ com.android.internal.R.color.materialColorOnSurface
},
)
)
view.backgroundTintList =
if (!viewModel.isSelected) {
- Utils.getColorAttr(
- view.context,
- if (viewModel.isActivated) {
- com.android.internal.R.attr.materialColorPrimaryFixed
- } else {
- com.android.internal.R.attr.materialColorSurfaceContainerHigh
- }
+ ColorStateList.valueOf(
+ view.context.getColor(
+ if (viewModel.isActivated) {
+ com.android.internal.R.color.materialColorPrimaryFixed
+ } else {
+ com.android.internal.R.color.materialColorSurfaceContainerHigh
+ }
+ )
)
} else {
null
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt
index 2a9fe8314349..1e99697e6a33 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt
@@ -93,7 +93,7 @@ constructor(
scrubbing = false,
elapsedTime = null,
duration = 0,
- listening = false
+ listening = false,
)
set(value) {
val enabledChanged = value.enabled != field.enabled
@@ -135,7 +135,6 @@ constructor(
override fun onMetadataChanged(metadata: MediaMetadata?) {
if (!Flags.mediaControlsPostsOptimization()) return
-
val (enabled, duration) = getEnabledStateAndDuration(metadata)
if (_data.duration != duration) {
_data = _data.copy(enabled = enabled, duration = duration)
@@ -323,7 +322,7 @@ constructor(
bgExecutor.executeRepeatedly(
this::checkPlaybackPosition,
0L,
- POSITION_UPDATE_INTERVAL_MILLIS
+ POSITION_UPDATE_INTERVAL_MILLIS,
)
cancel = Runnable {
cancelPolling.run()
@@ -331,6 +330,7 @@ constructor(
}
}
} else {
+ checkPlaybackPosition()
cancel?.run()
cancel = null
}
@@ -542,7 +542,7 @@ constructor(
eventStart: MotionEvent?,
event: MotionEvent,
distanceX: Float,
- distanceY: Float
+ distanceY: Float,
): Boolean {
return shouldGoToSeekBar
}
@@ -556,7 +556,7 @@ constructor(
eventStart: MotionEvent?,
event: MotionEvent,
velocityX: Float,
- velocityY: Float
+ velocityY: Float,
): Boolean {
if (Math.abs(velocityX) > flingVelocity || Math.abs(velocityY) > flingVelocity) {
viewModel.onSeekFalse()
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt
index 2f0e1298499c..f8d317a7799f 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt
@@ -19,12 +19,12 @@ package com.android.systemui.media.taptotransfer.common
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
-import androidx.annotation.AttrRes
+import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
-import com.android.systemui.res.R
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.TintedIcon
+import com.android.systemui.res.R
import com.android.systemui.temporarydisplay.chipbar.ChipbarInfo.Companion.DEFAULT_ICON_TINT
/** Utility methods for media tap-to-transfer. */
@@ -108,7 +108,7 @@ class MediaTttUtils {
data class IconInfo(
val contentDescription: ContentDescription,
val icon: MediaTttIcon,
- @AttrRes val tint: Int?,
+ @ColorRes val tint: Int?,
/**
* True if [drawable] is the app's icon, and false if [drawable] is some generic default icon.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt
index 2d001508a720..138ac8668a14 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt
@@ -12,7 +12,6 @@ import androidx.dynamicanimation.animation.FloatPropertyCompat
import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
import com.android.internal.util.LatencyTracker
-import com.android.settingslib.Utils
import com.android.systemui.navigationbar.gestural.BackPanelController.DelayedOnAnimationEndListener
private const val TAG = "BackPanel"
@@ -156,23 +155,21 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :
Configuration.UI_MODE_NIGHT_YES
arrowPaint.color =
- Utils.getColorAttrDefaultColor(
- context,
+ context.getColor(
if (isDeviceInNightTheme) {
- com.android.internal.R.attr.materialColorOnSecondaryContainer
+ com.android.internal.R.color.materialColorOnSecondaryContainer
} else {
- com.android.internal.R.attr.materialColorOnSecondaryFixed
- },
+ com.android.internal.R.color.materialColorOnSecondaryFixed
+ }
)
arrowBackgroundPaint.color =
- Utils.getColorAttrDefaultColor(
- context,
+ context.getColor(
if (isDeviceInNightTheme) {
- com.android.internal.R.attr.materialColorSecondaryContainer
+ com.android.internal.R.color.materialColorSecondaryContainer
} else {
- com.android.internal.R.attr.materialColorSecondaryFixedDim
- },
+ com.android.internal.R.color.materialColorSecondaryFixedDim
+ }
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt
index b26ae6cdf0bd..f53b6cd29806 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt
@@ -40,8 +40,8 @@ import androidx.annotation.WorkerThread
import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import com.android.settingslib.Utils
-import com.android.systemui.res.R
import com.android.systemui.animation.ViewHierarchyAnimator
+import com.android.systemui.res.R
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.util.maybeForceFullscreen
import java.lang.ref.WeakReference
@@ -347,16 +347,16 @@ class PrivacyDialogV2(
private fun getForegroundColor(active: Boolean) =
Utils.getColorAttrDefaultColor(
context,
- if (active) com.android.internal.R.attr.materialColorOnPrimaryFixed
- else com.android.internal.R.attr.materialColorOnSurface
+ if (active) com.android.internal.R.color.materialColorOnPrimaryFixed
+ else com.android.internal.R.color.materialColorOnSurface,
)
@ColorInt
private fun getBackgroundColor(active: Boolean) =
Utils.getColorAttrDefaultColor(
context,
- if (active) com.android.internal.R.attr.materialColorPrimaryFixed
- else com.android.internal.R.attr.materialColorSurfaceContainerHigh
+ if (active) com.android.internal.R.color.materialColorPrimaryFixed
+ else com.android.internal.R.color.materialColorSurfaceContainerHigh,
)
private fun getMutableDrawable(@DrawableRes resId: Int) = context.getDrawable(resId)!!.mutate()
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index 8d9f49e55cea..5b8ac6408077 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -33,7 +33,6 @@ import androidx.activity.OnBackPressedDispatcherOwner
import androidx.activity.setViewTreeOnBackPressedDispatcherOwner
import androidx.annotation.VisibleForTesting
import androidx.compose.animation.AnimatedContent
-import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
@@ -246,51 +245,57 @@ constructor(
private fun Content() {
PlatformTheme(isDarkTheme = true) {
ProvideShortcutHelperIndication(interactionsConfig = interactionsConfig()) {
- AnimatedVisibility(
- visible = viewModel.isQsVisibleAndAnyShadeExpanded,
- modifier =
- Modifier.graphicsLayer { alpha = viewModel.viewAlpha }
- // Clipping before translation to match QSContainerImpl.onDraw
- .offset {
- IntOffset(x = 0, y = viewModel.viewTranslationY.fastRoundToInt())
- }
- .thenIf(notificationScrimClippingParams.isEnabled) {
- Modifier.notificationScrimClip {
- notificationScrimClippingParams.params
+ if (viewModel.isQsVisibleAndAnyShadeExpanded) {
+ Box(
+ modifier =
+ Modifier.graphicsLayer { alpha = viewModel.viewAlpha }
+ // Clipping before translation to match QSContainerImpl.onDraw
+ .offset {
+ IntOffset(
+ x = 0,
+ y = viewModel.viewTranslationY.fastRoundToInt(),
+ )
+ }
+ .thenIf(notificationScrimClippingParams.isEnabled) {
+ Modifier.notificationScrimClip {
+ notificationScrimClippingParams.params
+ }
}
+ // Disable touches in the whole composable while the mirror is
+ // showing. While the mirror is showing, an ancestor of the
+ // ComposeView is made alpha 0, but touches are still being captured
+ // by the composables.
+ .gesturesDisabled(viewModel.showingMirror)
+ ) {
+ val isEditing by
+ viewModel.containerViewModel.editModeViewModel.isEditing
+ .collectAsStateWithLifecycle()
+ val animationSpecEditMode = tween<Float>(EDIT_MODE_TIME_MILLIS)
+ AnimatedContent(
+ targetState = isEditing,
+ transitionSpec = {
+ fadeIn(animationSpecEditMode) togetherWith
+ fadeOut(animationSpecEditMode)
+ },
+ label = "EditModeAnimatedContent",
+ ) { editing ->
+ if (editing) {
+ val qqsPadding = viewModel.qqsHeaderHeight
+ EditMode(
+ viewModel = viewModel.containerViewModel.editModeViewModel,
+ modifier =
+ Modifier.fillMaxWidth()
+ .padding(top = { qqsPadding })
+ .padding(
+ horizontal = {
+ QuickSettingsShade.Dimensions.Padding
+ .roundToPx()
+ }
+ ),
+ )
+ } else {
+ CollapsableQuickSettingsSTL()
}
- // Disable touches in the whole composable while the mirror is showing.
- // While the mirror is showing, an ancestor of the ComposeView is made
- // alpha 0, but touches are still being captured by the composables.
- .gesturesDisabled(viewModel.showingMirror),
- ) {
- val isEditing by
- viewModel.containerViewModel.editModeViewModel.isEditing
- .collectAsStateWithLifecycle()
- val animationSpecEditMode = tween<Float>(EDIT_MODE_TIME_MILLIS)
- AnimatedContent(
- targetState = isEditing,
- transitionSpec = {
- fadeIn(animationSpecEditMode) togetherWith
- fadeOut(animationSpecEditMode)
- },
- label = "EditModeAnimatedContent",
- ) { editing ->
- if (editing) {
- val qqsPadding = viewModel.qqsHeaderHeight
- EditMode(
- viewModel = viewModel.containerViewModel.editModeViewModel,
- modifier =
- Modifier.fillMaxWidth()
- .padding(top = { qqsPadding })
- .padding(
- horizontal = {
- QuickSettingsShade.Dimensions.Padding.roundToPx()
- }
- ),
- )
- } else {
- CollapsableQuickSettingsSTL()
}
}
}
@@ -325,9 +330,15 @@ constructor(
}
SceneTransitionLayout(state = sceneState, modifier = Modifier.fillMaxSize()) {
- scene(QuickSettings) { QuickSettingsElement() }
+ scene(QuickSettings) {
+ LaunchedEffect(Unit) { viewModel.onQSOpen() }
+ QuickSettingsElement()
+ }
- scene(QuickQuickSettings) { QuickQuickSettingsElement() }
+ scene(QuickQuickSettings) {
+ LaunchedEffect(Unit) { viewModel.onQQSOpen() }
+ QuickQuickSettingsElement()
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
index 3c725203a15f..07ceb6425574 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
@@ -28,6 +28,7 @@ import androidx.compose.runtime.snapshotFlow
import androidx.lifecycle.LifecycleCoroutineScope
import com.android.app.animation.Interpolators
import com.android.app.tracing.coroutines.launchTraced as launch
+import com.android.internal.logging.UiEventLogger
import com.android.keyguard.BouncerPanelExpansionCalculator
import com.android.systemui.Dumpable
import com.android.systemui.animation.ShadeInterpolation
@@ -51,6 +52,7 @@ import com.android.systemui.media.dagger.MediaModule.QS_PANEL
import com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.qs.FooterActionsController
+import com.android.systemui.qs.QSEvent
import com.android.systemui.qs.composefragment.dagger.QSFragmentComposeLog
import com.android.systemui.qs.composefragment.dagger.QSFragmentComposeModule
import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
@@ -113,6 +115,7 @@ constructor(
@Named(QUICK_QS_PANEL) val qqsMediaHost: MediaHost,
@Named(QS_PANEL) val qsMediaHost: MediaHost,
@Named(QSFragmentComposeModule.QS_USING_MEDIA_PLAYER) private val usingMedia: Boolean,
+ private val uiEventLogger: UiEventLogger,
@Assisted private val lifecycleScope: LifecycleCoroutineScope,
) : Dumpable, ExclusiveActivatable() {
@@ -455,6 +458,14 @@ constructor(
falsingInteractor.isFalseTouch(Classifier.QS_SWIPE_NESTED)
}
+ fun onQQSOpen() {
+ uiEventLogger.log(QSEvent.QQS_PANEL_EXPANDED)
+ }
+
+ fun onQSOpen() {
+ uiEventLogger.log(QSEvent.QS_PANEL_EXPANDED)
+ }
+
override suspend fun onActivated(): Nothing {
initMediaHosts() // init regardless of using media (same as current QS).
coroutineScope {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt
index 35faa97db2fe..405ce8a8e5e0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/DragAndDropState.kt
@@ -44,19 +44,28 @@ import com.android.systemui.qs.pipeline.shared.TileSpec
/** Holds the [TileSpec] of the tile being moved and receives drag and drop events. */
interface DragAndDropState {
val draggedCell: SizedTile<EditTileViewModel>?
+ val draggedPosition: Offset
val dragInProgress: Boolean
+ val dragType: DragType?
fun isMoving(tileSpec: TileSpec): Boolean
- fun onStarted(cell: SizedTile<EditTileViewModel>)
+ fun onStarted(cell: SizedTile<EditTileViewModel>, dragType: DragType)
- fun onMoved(target: Int, insertAfter: Boolean)
+ fun onTargeting(target: Int, insertAfter: Boolean)
+
+ fun onMoved(offset: Offset)
fun movedOutOfBounds()
fun onDrop()
}
+enum class DragType {
+ Add,
+ Move,
+}
+
/**
* Registers a composable as a [DragAndDropTarget] to receive drop events. Use this outside the tile
* grid to catch out of bounds drops.
@@ -72,6 +81,10 @@ fun Modifier.dragAndDropRemoveZone(
val target =
remember(dragAndDropState) {
object : DragAndDropTarget {
+ override fun onMoved(event: DragAndDropEvent) {
+ dragAndDropState.onMoved(event.toOffset())
+ }
+
override fun onDrop(event: DragAndDropEvent): Boolean {
return dragAndDropState.draggedCell?.let {
onDrop(it.tile.tileSpec)
@@ -117,8 +130,11 @@ fun Modifier.dragAndDropTileList(
}
override fun onMoved(event: DragAndDropEvent) {
+ val offset = event.toOffset()
+ dragAndDropState.onMoved(offset)
+
// Drag offset relative to the list's top left corner
- val relativeDragOffset = event.dragOffsetRelativeTo(contentOffset())
+ val relativeDragOffset = offset - contentOffset()
val targetItem =
gridState.layoutInfo.visibleItemsInfo.firstOrNull { item ->
// Check if the drag is on this item
@@ -126,7 +142,7 @@ fun Modifier.dragAndDropTileList(
}
targetItem?.let {
- dragAndDropState.onMoved(it.index, insertAfter(it, relativeDragOffset))
+ dragAndDropState.onTargeting(it.index, insertAfter(it, relativeDragOffset))
}
}
@@ -147,8 +163,8 @@ fun Modifier.dragAndDropTileList(
)
}
-private fun DragAndDropEvent.dragOffsetRelativeTo(offset: Offset): Offset {
- return toAndroidDragEvent().run { Offset(x, y) } - offset
+private fun DragAndDropEvent.toOffset(): Offset {
+ return toAndroidDragEvent().run { Offset(x, y) }
}
private fun insertAfter(item: LazyGridItemInfo, offset: Offset): Boolean {
@@ -163,6 +179,7 @@ private fun insertAfter(item: LazyGridItemInfo, offset: Offset): Boolean {
fun Modifier.dragAndDropTileSource(
sizedTile: SizedTile<EditTileViewModel>,
dragAndDropState: DragAndDropState,
+ dragType: DragType,
onDragStart: () -> Unit,
): Modifier {
val dragState by rememberUpdatedState(dragAndDropState)
@@ -172,7 +189,7 @@ fun Modifier.dragAndDropTileSource(
detectDragGesturesAfterLongPress(
onDrag = { _, _ -> },
onDragStart = {
- dragState.onStarted(sizedTile)
+ dragState.onStarted(sizedTile, dragType)
onDragStart()
// The tilespec from the ClipData transferred isn't actually needed as we're
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt
index 14abfa2313d8..868855840922 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt
@@ -17,10 +17,13 @@
package com.android.systemui.qs.panels.ui.compose
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.runtime.toMutableStateList
+import androidx.compose.ui.geometry.Offset
import com.android.systemui.qs.panels.shared.model.SizedTile
import com.android.systemui.qs.panels.ui.model.GridCell
import com.android.systemui.qs.panels.ui.model.TileGridCell
@@ -48,12 +51,17 @@ class EditTileListState(
private val columns: Int,
private val largeTilesSpan: Int,
) : DragAndDropState {
- private val _draggedCell = mutableStateOf<SizedTile<EditTileViewModel>?>(null)
- override val draggedCell
- get() = _draggedCell.value
+ override var draggedCell by mutableStateOf<SizedTile<EditTileViewModel>?>(null)
+ private set
+
+ override var draggedPosition by mutableStateOf(Offset.Unspecified)
+ private set
+
+ override var dragType by mutableStateOf<DragType?>(null)
+ private set
override val dragInProgress: Boolean
- get() = _draggedCell.value != null
+ get() = draggedCell != null
private val _tiles: SnapshotStateList<GridCell> =
tiles.toGridCells(columns).toMutableStateList()
@@ -83,18 +91,19 @@ class EditTileListState(
}
override fun isMoving(tileSpec: TileSpec): Boolean {
- return _draggedCell.value?.let { it.tile.tileSpec == tileSpec } ?: false
+ return draggedCell?.let { it.tile.tileSpec == tileSpec } ?: false
}
- override fun onStarted(cell: SizedTile<EditTileViewModel>) {
- _draggedCell.value = cell
+ override fun onStarted(cell: SizedTile<EditTileViewModel>, dragType: DragType) {
+ draggedCell = cell
+ this.dragType = dragType
// Add spacers to the grid to indicate where the user can move a tile
regenerateGrid()
}
- override fun onMoved(target: Int, insertAfter: Boolean) {
- val draggedTile = _draggedCell.value ?: return
+ override fun onTargeting(target: Int, insertAfter: Boolean) {
+ val draggedTile = draggedCell ?: return
val fromIndex = indexOf(draggedTile.tile.tileSpec)
if (fromIndex == target) {
@@ -115,16 +124,26 @@ class EditTileListState(
regenerateGrid()
}
+ override fun onMoved(offset: Offset) {
+ draggedPosition = offset
+ }
+
override fun movedOutOfBounds() {
- val draggedTile = _draggedCell.value ?: return
+ val draggedTile = draggedCell ?: return
_tiles.removeIf { cell ->
cell is TileGridCell && cell.tile.tileSpec == draggedTile.tile.tileSpec
}
+ draggedPosition = Offset.Unspecified
+
+ // Regenerate spacers without the dragged tile
+ regenerateGrid()
}
override fun onDrop() {
- _draggedCell.value = null
+ draggedCell = null
+ draggedPosition = Offset.Unspecified
+ dragType = null
// Remove the spacers
regenerateGrid()
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
index a05747dd3ba2..d975f104d538 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
@@ -20,12 +20,16 @@ package com.android.systemui.qs.panels.ui.compose.infinitegrid
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.animateContentSize
+import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.LocalOverscrollFactory
+import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clipScrollableContainer
@@ -43,6 +47,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.requiredHeightIn
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.layout.wrapContentSize
@@ -69,6 +74,7 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -80,6 +86,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.isSpecified
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.MeasureScope
@@ -111,6 +118,7 @@ import com.android.systemui.qs.panels.shared.model.SizedTile
import com.android.systemui.qs.panels.shared.model.SizedTileImpl
import com.android.systemui.qs.panels.ui.compose.BounceableInfo
import com.android.systemui.qs.panels.ui.compose.DragAndDropState
+import com.android.systemui.qs.panels.ui.compose.DragType
import com.android.systemui.qs.panels.ui.compose.EditTileListState
import com.android.systemui.qs.panels.ui.compose.bounceableInfo
import com.android.systemui.qs.panels.ui.compose.dragAndDropRemoveZone
@@ -120,6 +128,9 @@ import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults
import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults.TileArrangementPadding
import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults.TileHeight
import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults.ToggleTargetSize
+import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AUTO_SCROLL_DISTANCE
+import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AUTO_SCROLL_SPEED
+import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AvailableTilesGridMinHeight
import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.CurrentTilesGridPadding
import com.android.systemui.qs.panels.ui.compose.selection.MutableSelectionState
import com.android.systemui.qs.panels.ui.compose.selection.ResizableTileContainer
@@ -139,8 +150,10 @@ import com.android.systemui.qs.panels.ui.viewmodel.EditTileViewModel
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.qs.shared.model.groupAndSort
import com.android.systemui.res.R
+import kotlin.math.abs
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
object TileType
@@ -201,8 +214,12 @@ fun DefaultEditTileGrid(
) { innerPadding ->
CompositionLocalProvider(LocalOverscrollFactory provides null) {
val scrollState = rememberScrollState()
- LaunchedEffect(listState.dragInProgress) {
- if (listState.dragInProgress) {
+
+ AutoScrollGrid(listState, scrollState, innerPadding)
+
+ LaunchedEffect(listState.dragType) {
+ // Only scroll to the top when adding a new tile, not when reordering existing ones
+ if (listState.dragInProgress && listState.dragType == DragType.Add) {
scrollState.animateScrollTo(0)
}
}
@@ -223,7 +240,7 @@ fun DefaultEditTileGrid(
AnimatedContent(
targetState = listState.dragInProgress,
modifier = Modifier.wrapContentSize(),
- label = "",
+ label = "QSEditHeader",
) { dragIsInProgress ->
EditGridHeader(Modifier.dragAndDropRemoveZone(listState, onRemoveTile)) {
if (dragIsInProgress) {
@@ -243,34 +260,84 @@ fun DefaultEditTileGrid(
onSetTiles,
)
- // Hide available tiles when dragging
- AnimatedVisibility(
- visible = !listState.dragInProgress,
- enter = fadeIn(),
- exit = fadeOut(),
+ // Sets a minimum height to be used when available tiles are hidden
+ Box(
+ Modifier.fillMaxWidth()
+ .requiredHeightIn(AvailableTilesGridMinHeight)
+ .animateContentSize()
+ .dragAndDropRemoveZone(listState, onRemoveTile)
) {
- Column(
- verticalArrangement =
- spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)),
- modifier = modifier.fillMaxSize(),
+ // Using the fully qualified name here as a workaround for AnimatedVisibility
+ // not being available from a Box
+ androidx.compose.animation.AnimatedVisibility(
+ visible = !listState.dragInProgress,
+ enter = fadeIn(),
+ exit = fadeOut(),
) {
- EditGridHeader {
- Text(text = stringResource(id = R.string.drag_to_add_tiles))
- }
+ // Hide available tiles when dragging
+ Column(
+ verticalArrangement =
+ spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)),
+ modifier = modifier.fillMaxSize(),
+ ) {
+ EditGridHeader {
+ Text(text = stringResource(id = R.string.drag_to_add_tiles))
+ }
- AvailableTileGrid(otherTiles, selectionState, columns, listState)
+ AvailableTileGrid(otherTiles, selectionState, columns, listState)
+ }
}
}
+ }
+ }
+ }
+}
- // Drop zone to remove tiles dragged out of the tile grid
- Spacer(
- modifier =
- Modifier.fillMaxWidth()
- .weight(1f)
- .dragAndDropRemoveZone(listState, onRemoveTile)
- )
+@OptIn(ExperimentalCoroutinesApi::class)
+@Composable
+private fun AutoScrollGrid(
+ listState: EditTileListState,
+ scrollState: ScrollState,
+ padding: PaddingValues,
+) {
+ val density = LocalDensity.current
+ val (top, bottom) =
+ remember(density) {
+ with(density) {
+ padding.calculateTopPadding().roundToPx() to
+ padding.calculateBottomPadding().roundToPx()
+ }
+ }
+ val scrollTarget by
+ remember(listState, scrollState, top, bottom) {
+ derivedStateOf {
+ val position = listState.draggedPosition
+ if (position.isSpecified) {
+ // Return the scroll target needed based on the position of the drag movement,
+ // or null if we don't need to scroll
+ val y = position.y.roundToInt()
+ when {
+ y < AUTO_SCROLL_DISTANCE + top -> 0
+ y > scrollState.viewportSize - bottom - AUTO_SCROLL_DISTANCE ->
+ scrollState.maxValue
+ else -> null
+ }
+ } else {
+ null
+ }
}
}
+ LaunchedEffect(scrollTarget) {
+ scrollTarget?.let {
+ // Change the duration of the animation based on the distance to maintain the
+ // same scrolling speed
+ val distance = abs(it - scrollState.value)
+ scrollState.animateScrollTo(
+ it,
+ animationSpec =
+ tween(durationMillis = distance * AUTO_SCROLL_SPEED, easing = LinearEasing),
+ )
+ }
}
}
@@ -423,7 +490,7 @@ private fun AvailableTileGrid(
}
fun gridHeight(rows: Int, tileHeight: Dp, tilePadding: Dp, gridPadding: Dp): Dp {
- return ((tileHeight + tilePadding) * rows) - tilePadding + gridPadding * 2
+ return ((tileHeight + tilePadding) * rows) + gridPadding * 2
}
private fun GridCell.key(index: Int, dragAndDropState: DragAndDropState): Any {
@@ -596,6 +663,7 @@ private fun TileGridCell(
.dragAndDropTileSource(
SizedTileImpl(cell.tile, cell.width),
dragAndDropState,
+ DragType.Move,
selectionState::unSelect,
)
.tileBackground(colors.background)
@@ -631,7 +699,11 @@ private fun AvailableTileGridCell(
onClick(onClickActionName) { false }
this.stateDescription = stateDescription
}
- .dragAndDropTileSource(SizedTileImpl(cell.tile, cell.width), dragAndDropState) {
+ .dragAndDropTileSource(
+ SizedTileImpl(cell.tile, cell.width),
+ dragAndDropState,
+ DragType.Add,
+ ) {
selectionState.unSelect()
}
.tileBackground(colors.background)
@@ -739,7 +811,10 @@ private fun Modifier.tileBackground(color: Color): Modifier {
private object EditModeTileDefaults {
const val PLACEHOLDER_ALPHA = .3f
+ const val AUTO_SCROLL_DISTANCE = 100
+ const val AUTO_SCROLL_SPEED = 2 // 2ms per pixel
val CurrentTilesGridPadding = 8.dp
+ val AvailableTilesGridMinHeight = 200.dp
@Composable
fun editTileColors(): TileColors =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt
index faab6960a99c..f7ed1adecb34 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt
@@ -18,9 +18,14 @@ package com.android.systemui.qs.panels.ui.viewmodel
import android.content.Context
import androidx.compose.ui.util.fastMap
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListUpdateCallback
+import com.android.internal.logging.UiEventLogger
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.qs.QSEditEvent
import com.android.systemui.qs.panels.domain.interactor.EditTilesListInteractor
import com.android.systemui.qs.panels.domain.interactor.GridLayoutTypeInteractor
import com.android.systemui.qs.panels.domain.interactor.TilesAvailabilityInteractor
@@ -30,10 +35,12 @@ import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor
import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor.Companion.POSITION_AT_END
import com.android.systemui.qs.pipeline.domain.interactor.MinimumTilesInteractor
import com.android.systemui.qs.pipeline.shared.TileSpec
+import com.android.systemui.qs.pipeline.shared.metricSpec
import com.android.systemui.shade.ShadeDisplayAware
import com.android.systemui.util.kotlin.emitOnStart
import javax.inject.Inject
import javax.inject.Named
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
@@ -45,6 +52,7 @@ import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.launch
@SysUISingleton
@OptIn(ExperimentalCoroutinesApi::class)
@@ -55,10 +63,12 @@ constructor(
private val currentTilesInteractor: CurrentTilesInteractor,
private val tilesAvailabilityInteractor: TilesAvailabilityInteractor,
private val minTilesInteractor: MinimumTilesInteractor,
+ private val uiEventLogger: UiEventLogger,
@ShadeDisplayAware private val configurationInteractor: ConfigurationInteractor,
- @ShadeDisplayAware private val context: Context,
+ @ShadeDisplayAware private val context: Context,
@Named("Default") private val defaultGridLayout: GridLayout,
@Application private val applicationScope: CoroutineScope,
+ @Background private val bgDispatcher: CoroutineDispatcher,
gridLayoutTypeInteractor: GridLayoutTypeInteractor,
gridLayoutMap: Map<GridLayoutType, @JvmSuppressWildcards GridLayout>,
) {
@@ -149,11 +159,17 @@ constructor(
/** @see isEditing */
fun startEditing() {
+ if (!isEditing.value) {
+ uiEventLogger.log(QSEditEvent.QS_EDIT_OPEN)
+ }
_isEditing.value = true
}
/** @see isEditing */
fun stopEditing() {
+ if (isEditing.value) {
+ uiEventLogger.log(QSEditEvent.QS_EDIT_CLOSED)
+ }
_isEditing.value = false
}
@@ -164,6 +180,7 @@ constructor(
fun addTile(tileSpec: TileSpec, position: Int = POSITION_AT_END) {
val specs = currentTilesInteractor.currentTilesSpecs.toMutableList()
val currentPosition = specs.indexOf(tileSpec)
+ val moved = currentPosition != -1
if (currentPosition != -1) {
// No operation needed if the element is already in the list at the right position
@@ -179,6 +196,12 @@ constructor(
} else {
specs.add(tileSpec)
}
+ uiEventLogger.logWithPosition(
+ if (moved) QSEditEvent.QS_EDIT_MOVE else QSEditEvent.QS_EDIT_ADD,
+ /* uid= */ 0,
+ /* packageName= */ tileSpec.metricSpec,
+ if (moved && position == POSITION_AT_END) specs.size - 1 else position,
+ )
// Setting the new tiles as one operation to avoid UI jank with tiles disappearing and
// reappearing
@@ -187,10 +210,80 @@ constructor(
/** Immediately removes [tileSpec] from the current tiles. */
fun removeTile(tileSpec: TileSpec) {
+ uiEventLogger.log(
+ QSEditEvent.QS_EDIT_REMOVE,
+ /* uid= */ 0,
+ /* packageName= */ tileSpec.metricSpec,
+ )
currentTilesInteractor.removeTiles(listOf(tileSpec))
}
fun setTiles(tileSpecs: List<TileSpec>) {
+ val currentTiles = currentTilesInteractor.currentTilesSpecs
currentTilesInteractor.setTiles(tileSpecs)
+ applicationScope.launch(bgDispatcher) {
+ calculateDiffsAndEmitUiEvents(currentTiles, tileSpecs)
+ }
+ }
+
+ private fun calculateDiffsAndEmitUiEvents(
+ currentTiles: List<TileSpec>,
+ newTiles: List<TileSpec>,
+ ) {
+ val listDiff = DiffUtil.calculateDiff(DiffCallback(currentTiles, newTiles))
+ listDiff.dispatchUpdatesTo(
+ object : ListUpdateCallback {
+ override fun onInserted(position: Int, count: Int) {
+ newTiles.getOrNull(position)?.let {
+ uiEventLogger.logWithPosition(
+ QSEditEvent.QS_EDIT_ADD,
+ /* uid= */ 0,
+ /* packageName= */ it.metricSpec,
+ position,
+ )
+ }
+ }
+
+ override fun onRemoved(position: Int, count: Int) {
+ currentTiles.getOrNull(position)?.let {
+ uiEventLogger.log(QSEditEvent.QS_EDIT_REMOVE, 0, it.metricSpec)
+ }
+ }
+
+ override fun onMoved(fromPosition: Int, toPosition: Int) {
+ currentTiles.getOrNull(fromPosition)?.let {
+ uiEventLogger.logWithPosition(
+ QSEditEvent.QS_EDIT_MOVE,
+ /* uid= */ 0,
+ /* packageName= */ it.metricSpec,
+ toPosition,
+ )
+ }
+ }
+
+ override fun onChanged(position: Int, count: Int, payload: Any?) {}
+ }
+ )
+ }
+}
+
+private class DiffCallback(
+ private val currentList: List<TileSpec>,
+ private val newList: List<TileSpec>,
+) : DiffUtil.Callback() {
+ override fun getOldListSize(): Int {
+ return currentList.size
+ }
+
+ override fun getNewListSize(): Int {
+ return newList.size
+ }
+
+ override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
+ return currentList[oldItemPosition] == newList[newItemPosition]
+ }
+
+ override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
+ return areItemsTheSame(oldItemPosition, newItemPosition)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt
index 2e52845ceb80..16c27223a471 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt
@@ -34,10 +34,7 @@ sealed class TileSpec private constructor(open val spec: String) {
data object Invalid : TileSpec("")
/** Container for the spec of a tile provided by SystemUI. */
- data class PlatformTileSpec
- internal constructor(
- override val spec: String,
- ) : TileSpec(spec) {
+ data class PlatformTileSpec internal constructor(override val spec: String) : TileSpec(spec) {
override fun toString(): String {
return "P($spec)"
}
@@ -49,10 +46,8 @@ sealed class TileSpec private constructor(open val spec: String) {
* [componentName] indicates the associated `TileService`.
*/
data class CustomTileSpec
- internal constructor(
- override val spec: String,
- val componentName: ComponentName,
- ) : TileSpec(spec) {
+ internal constructor(override val spec: String, val componentName: ComponentName) :
+ TileSpec(spec) {
override fun toString(): String {
return "C(${componentName.flattenToShortString()})"
}
@@ -92,3 +87,11 @@ sealed class TileSpec private constructor(open val spec: String) {
}
}
}
+
+val TileSpec.metricSpec
+ get() =
+ when (this) {
+ is TileSpec.Invalid -> ""
+ is TileSpec.PlatformTileSpec -> spec
+ is TileSpec.CustomTileSpec -> componentName.packageName
+ }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
index 4fb96e72d8df..ec8d30b01eab 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
@@ -24,6 +24,7 @@ import android.os.Looper;
import android.service.quicksettings.Tile;
import android.text.TextUtils;
import android.util.Log;
+import android.widget.Button;
import android.widget.Switch;
import androidx.annotation.Nullable;
@@ -144,8 +145,10 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState>
// Show expand icon when clicking will open a dialog
state.forceExpandIcon = state.state == Tile.STATE_INACTIVE;
+ state.expandedAccessibilityClassName = Button.class.getName();
if (isRecording) {
state.secondaryLabel = mContext.getString(R.string.quick_settings_screen_record_stop);
+ state.expandedAccessibilityClassName = Switch.class.getName();
} else if (isStarting) {
int countdown =
(int) ScreenRecordModel.Starting.Companion.toCountdownSeconds(
@@ -157,7 +160,6 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState>
state.contentDescription = TextUtils.isEmpty(state.secondaryLabel)
? state.label
: TextUtils.concat(state.label, ", ", state.secondaryLabel);
- state.expandedAccessibilityClassName = Switch.class.getName();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt
index fc4db0877dbe..b7a3aedc565e 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt
@@ -31,6 +31,8 @@ import android.os.UserManager
import android.util.Log
import androidx.annotation.GuardedBy
import androidx.annotation.WorkerThread
+import com.android.app.tracing.coroutines.launchTraced as launch
+import com.android.app.tracing.traceSection
import com.android.systemui.Dumpable
import com.android.systemui.dump.DumpManager
import com.android.systemui.flags.FeatureFlagsClassic
@@ -49,7 +51,6 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
-import com.android.app.tracing.coroutines.launchTraced as launch
import kotlinx.coroutines.sync.Mutex
/**
@@ -314,7 +315,9 @@ internal constructor(
list.forEach {
val callback = it.callback.get()
if (callback != null) {
- it.executor.execute { action(callback) { latch.countDown() } }
+ it.executor.execute {
+ traceSection({ "$callback" }) { action(callback) { latch.countDown() } }
+ }
} else {
latch.countDown()
}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java
index 30b6892731f1..c241f2165c8f 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java
@@ -62,7 +62,7 @@ public class ToggleSeekBar extends SeekBar {
} else if (event.getAction() == MotionEvent.ACTION_HOVER_EXIT) {
setHovered(false);
}
- return true;
+ return super.onHoverEvent(event);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
index f5fc1f414f82..bf672be3c8d0 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
@@ -166,6 +166,15 @@ public class NotificationShadeWindowView extends WindowRootView {
}
@Override
+ public void onMovedToDisplay(int displayId, Configuration config) {
+ super.onMovedToDisplay(displayId, config);
+ ShadeWindowGoesAround.isUnexpectedlyInLegacyMode();
+ // When the window is moved we're only receiving a call to this method instead of the
+ // onConfigurationChange itself. Let's just trigegr a normal config change.
+ onConfigurationChanged(config);
+ }
+
+ @Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (mConfigurationForwarder != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
index ff39a3ddc17c..d31868ca0217 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
@@ -22,15 +22,16 @@ import android.view.LayoutInflater
import android.view.WindowManager
import android.view.WindowManager.LayoutParams
import android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE
+import android.window.WindowContext
import com.android.systemui.CoreStartable
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.common.ui.ConfigurationStateImpl
-import com.android.systemui.common.ui.GlobalConfig
import com.android.systemui.common.ui.data.repository.ConfigurationRepository
import com.android.systemui.common.ui.data.repository.ConfigurationRepositoryImpl
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractorImpl
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.res.R
import com.android.systemui.scene.ui.view.WindowRootView
import com.android.systemui.shade.data.repository.MutableShadeDisplaysRepository
@@ -48,6 +49,7 @@ import dagger.Provides
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import javax.inject.Provider
+import javax.inject.Qualifier
/**
* Module responsible for managing display-specific components and resources for the notification
@@ -81,6 +83,19 @@ object ShadeDisplayAwareModule {
@Provides
@ShadeDisplayAware
@SysUISingleton
+ fun provideShadeDisplayAwareWindowContext(@ShadeDisplayAware context: Context): WindowContext {
+ ShadeWindowGoesAround.isUnexpectedlyInLegacyMode()
+ // We rely on the fact context is a WindowContext as the API to reparent windows is only
+ // available there.
+ return (context as? WindowContext)
+ ?: error(
+ "ShadeDisplayAware context must be a window context to allow window reparenting."
+ )
+ }
+
+ @Provides
+ @ShadeDisplayAware
+ @SysUISingleton
fun provideShadeWindowLayoutParams(@ShadeDisplayAware context: Context): LayoutParams {
return ShadeWindowLayoutParams.create(context)
}
@@ -119,7 +134,7 @@ object ShadeDisplayAwareModule {
fun provideShadeWindowConfigurationController(
@ShadeDisplayAware shadeContext: Context,
factory: ConfigurationControllerImpl.Factory,
- @GlobalConfig globalConfigController: ConfigurationController,
+ @Main globalConfigController: ConfigurationController,
): ConfigurationController {
return if (ShadeWindowGoesAround.isEnabled) {
factory.create(shadeContext)
@@ -145,7 +160,7 @@ object ShadeDisplayAwareModule {
factory: ConfigurationStateImpl.Factory,
@ShadeDisplayAware configurationController: ConfigurationController,
@ShadeDisplayAware context: Context,
- @GlobalConfig configurationState: ConfigurationState,
+ @Main configurationState: ConfigurationState,
): ConfigurationState {
return if (ShadeWindowGoesAround.isEnabled) {
factory.create(context, configurationController)
@@ -161,7 +176,7 @@ object ShadeDisplayAwareModule {
factory: ConfigurationRepositoryImpl.Factory,
@ShadeDisplayAware configurationController: ConfigurationController,
@ShadeDisplayAware context: Context,
- @GlobalConfig globalConfigurationRepository: ConfigurationRepository,
+ @Main globalConfigurationRepository: ConfigurationRepository,
): ConfigurationRepository {
return if (ShadeWindowGoesAround.isEnabled) {
factory.create(context, configurationController)
@@ -175,7 +190,7 @@ object ShadeDisplayAwareModule {
@ShadeDisplayAware
fun provideShadeAwareConfigurationInteractor(
@ShadeDisplayAware configurationRepository: ConfigurationRepository,
- @GlobalConfig configurationInteractor: ConfigurationInteractor,
+ @Main configurationInteractor: ConfigurationInteractor,
): ConfigurationInteractor {
return if (ShadeWindowGoesAround.isEnabled) {
ConfigurationInteractorImpl(configurationRepository)
@@ -203,7 +218,9 @@ object ShadeDisplayAwareModule {
@Provides
@IntoMap
@ClassKey(ShadePrimaryDisplayCommand::class)
- fun provideShadePrimaryDisplayCommand(impl: Provider<ShadePrimaryDisplayCommand>): CoreStartable {
+ fun provideShadePrimaryDisplayCommand(
+ impl: Provider<ShadePrimaryDisplayCommand>
+ ): CoreStartable {
return if (ShadeWindowGoesAround.isEnabled) {
impl.get()
} else {
@@ -221,9 +238,23 @@ object ShadeDisplayAwareModule {
CoreStartable.NOP
}
}
+
+ @Provides
+ @ShadeOnDefaultDisplayWhenLocked
+ fun provideShadeOnDefaultDisplayWhenLocked(): Boolean = true
}
@Module
internal interface OptionalShadeDisplayAwareBindings {
@BindsOptionalOf fun bindOptionalOfWindowRootView(): WindowRootView
}
+
+/**
+ * Annotates the boolean value that defines whether the shade window should go back to the default
+ * display when the keyguard is visible.
+ *
+ * As of today (Dec 2024), This is a configuration parameter provided in the dagger graph as the
+ * final policy around keyguard display is still under discussion, and will be evaluated based on
+ * how well this solution behaves from the performance point of view.
+ */
+@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ShadeOnDefaultDisplayWhenLocked
diff --git a/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt b/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt
index ae36e81c7b1f..29c7aa0680d3 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/StatusBarLongPressGestureDetector.kt
@@ -21,13 +21,18 @@ import android.view.GestureDetector
import android.view.GestureDetector.SimpleOnGestureListener
import android.view.MotionEvent
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
import javax.inject.Inject
/** Accepts touch events, detects long press, and calls ShadeViewController#onStatusBarLongPress. */
@SysUISingleton
class StatusBarLongPressGestureDetector
@Inject
-constructor(context: Context, val shadeViewController: ShadeViewController) {
+constructor(
+ // TODO b/383125226 - Make this class per-display
+ @Main context: Context,
+ val shadeViewController: ShadeViewController,
+) {
val gestureDetector =
GestureDetector(
context,
diff --git a/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt b/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt
index 22e9487af84c..30b086f03d66 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt
@@ -22,34 +22,55 @@ import com.android.app.tracing.coroutines.launchTraced
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.display.data.repository.DisplayRepository
+import com.android.systemui.keyguard.data.repository.KeyguardRepository
+import com.android.systemui.shade.ShadeOnDefaultDisplayWhenLocked
import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.stateIn
/**
* Moves the shade on the last display that received a status bar touch.
*
- * If the display is removed, falls back to the default one.
+ * If the display is removed, falls back to the default one. When [shadeOnDefaultDisplayWhenLocked]
+ * is true, the shade falls back to the default display when the keyguard is visible.
*/
@SysUISingleton
class StatusBarTouchShadeDisplayPolicy
@Inject
-constructor(displayRepository: DisplayRepository, @Background val backgroundScope: CoroutineScope) :
- ShadeDisplayPolicy {
- override val name: String
- get() = "status_bar_latest_touch"
+constructor(
+ displayRepository: DisplayRepository,
+ keyguardRepository: KeyguardRepository,
+ @Background val backgroundScope: CoroutineScope,
+ @ShadeOnDefaultDisplayWhenLocked val shadeOnDefaultDisplayWhenLocked: Boolean,
+) : ShadeDisplayPolicy {
+ override val name: String = "status_bar_latest_touch"
private val currentDisplayId = MutableStateFlow(Display.DEFAULT_DISPLAY)
private val availableDisplayIds: StateFlow<Set<Int>> = displayRepository.displayIds
- override val displayId: StateFlow<Int>
- get() = currentDisplayId
+ override val displayId: StateFlow<Int> =
+ if (shadeOnDefaultDisplayWhenLocked) {
+ keyguardRepository.isKeyguardShowing
+ .combine(currentDisplayId) { isKeyguardShowing, currentDisplayId ->
+ if (isKeyguardShowing) {
+ Display.DEFAULT_DISPLAY
+ } else {
+ currentDisplayId
+ }
+ }
+ .stateIn(backgroundScope, SharingStarted.WhileSubscribed(), currentDisplayId.value)
+ } else {
+ currentDisplayId
+ }
private var removalListener: Job? = null
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt
index 34148671cf2a..08c03e28d596 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt
@@ -16,10 +16,8 @@
package com.android.systemui.shade.domain.interactor
-import android.content.Context
import android.util.Log
-import android.view.WindowManager
-import android.view.WindowManager.LayoutParams
+import android.window.WindowContext
import androidx.annotation.UiThread
import com.android.app.tracing.coroutines.launchTraced
import com.android.app.tracing.traceSection
@@ -45,9 +43,7 @@ class ShadeDisplaysInteractor
constructor(
optionalShadeRootView: Optional<WindowRootView>,
private val shadePositionRepository: ShadeDisplaysRepository,
- @ShadeDisplayAware private val shadeContext: Context,
- @ShadeDisplayAware private val shadeLayoutParams: LayoutParams,
- @ShadeDisplayAware private val wm: WindowManager,
+ @ShadeDisplayAware private val shadeContext: WindowContext,
@Background private val bgScope: CoroutineScope,
@Main private val mainThreadContext: CoroutineContext,
) : CoreStartable {
@@ -72,7 +68,11 @@ constructor(
/** Tries to move the shade. If anything wrong happens, fails gracefully without crashing. */
private suspend fun moveShadeWindowTo(destinationId: Int) {
Log.d(TAG, "Trying to move shade window to display with id $destinationId")
- val currentDisplay = shadeRootView.display
+ // Why using the shade context here instead of the view's Display?
+ // The context's display is updated before the view one, so it is a better indicator of
+ // which display the shade is supposed to be at. The View display is updated after the first
+ // rendering with the new config.
+ val currentDisplay = shadeContext.display
if (currentDisplay == null) {
Log.w(TAG, "Current shade display is null")
return
@@ -83,7 +83,7 @@ constructor(
return
}
try {
- withContext(mainThreadContext) { moveShadeWindow(toId = destinationId) }
+ withContext(mainThreadContext) { reparentToDisplayId(id = destinationId) }
} catch (e: IllegalStateException) {
Log.e(
TAG,
@@ -94,25 +94,8 @@ constructor(
}
@UiThread
- private fun moveShadeWindow(toId: Int) {
- traceSection({ "moveShadeWindow to $toId" }) {
- removeShadeWindow()
- updateContextDisplay(toId)
- addShadeWindow()
- }
- }
-
- @UiThread
- private fun removeShadeWindow(): Unit =
- traceSection("removeShadeWindow") { wm.removeView(shadeRootView) }
-
- @UiThread
- private fun addShadeWindow(): Unit =
- traceSection("addShadeWindow") { wm.addView(shadeRootView, shadeLayoutParams) }
-
- @UiThread
- private fun updateContextDisplay(newDisplayId: Int) {
- traceSection("updateContextDisplay") { shadeContext.updateDisplay(newDisplayId) }
+ private fun reparentToDisplayId(id: Int) {
+ traceSection({ "reparentToDisplayId(id=$id)" }) { shadeContext.reparentToDisplay(id) }
}
private companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
index 6fd2d3fafb88..2544323d83d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
@@ -20,7 +20,6 @@ import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
import static com.android.systemui.Flags.fetchBookmarksXmlKeyboardShortcuts;
-import static com.android.systemui.Flags.validateKeyboardShortcutHelperIconUri;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -78,7 +77,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.AssistUtils;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
-import com.android.settingslib.Utils;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.phone.CentralSurfaces;
@@ -428,9 +426,7 @@ public final class KeyboardShortcutListSearch {
mKeySearchResultMap.put(SHORTCUT_SPECIFICAPP_INDEX, false);
} else {
mCurrentAppPackageName = result.get(0).getPackageName();
- if (validateKeyboardShortcutHelperIconUri()) {
- KeyboardShortcuts.sanitiseShortcuts(result);
- }
+ KeyboardShortcuts.sanitiseShortcuts(result);
mSpecificAppGroup.addAll(
reMapToKeyboardShortcutMultiMappingGroup(result));
mKeySearchResultMap.put(SHORTCUT_SPECIFICAPP_INDEX, true);
@@ -446,9 +442,7 @@ public final class KeyboardShortcutListSearch {
// Add specific Ime shortcuts
if (result != null) {
if (!result.isEmpty()) {
- if (validateKeyboardShortcutHelperIconUri()) {
- KeyboardShortcuts.sanitiseShortcuts(result);
- }
+ KeyboardShortcuts.sanitiseShortcuts(result);
mInputGroup.addAll(
reMapToKeyboardShortcutMultiMappingGroup(result));
}
@@ -1416,13 +1410,11 @@ public final class KeyboardShortcutListSearch {
}
private int getColorOfTextColorOnAccent() {
- return Utils.getColorAttrDefaultColor(
- mContext, com.android.internal.R.attr.materialColorOnPrimary);
+ return mContext.getColor(com.android.internal.R.color.materialColorOnPrimary);
}
private int getColorOfTextColorSecondary() {
- return Utils.getColorAttrDefaultColor(
- mContext, com.android.internal.R.attr.materialColorOnSurface);
+ return mContext.getColor(com.android.internal.R.color.materialColorOnSurface);
}
// Create the new data structure for handling the N-to-1 key mapping and other complex case.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
index 766c391b14d8..2ed168aa82e8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
@@ -21,7 +21,6 @@ import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
import static com.android.systemui.Flags.fetchBookmarksXmlKeyboardShortcuts;
-import static com.android.systemui.Flags.validateKeyboardShortcutHelperIconUri;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -412,10 +411,7 @@ public final class KeyboardShortcuts {
mReceivedAppShortcutGroups =
result == null ? Collections.emptyList() : result;
- if (validateKeyboardShortcutHelperIconUri()) {
- sanitiseShortcuts(mReceivedAppShortcutGroups);
- }
-
+ sanitiseShortcuts(mReceivedAppShortcutGroups);
maybeMergeAndShowKeyboardShortcuts();
}
@@ -423,10 +419,7 @@ public final class KeyboardShortcuts {
mReceivedImeShortcutGroups =
result == null ? Collections.emptyList() : result;
- if (validateKeyboardShortcutHelperIconUri()) {
- sanitiseShortcuts(mReceivedImeShortcutGroups);
- }
-
+ sanitiseShortcuts(mReceivedImeShortcutGroups);
maybeMergeAndShowKeyboardShortcuts();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt
index 571a3e44d233..bbecde830a9f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt
@@ -57,6 +57,14 @@ constructor(
// top-level tag. It should instead be provided as the first string in each log message.
private val extraLogTag = "SingleChipInteractor[key=$key]"
+ init {
+ if (startingModel.promotedContent == null) {
+ logger.e({ "$str1: Starting model has promotedContent=null, which shouldn't happen" }) {
+ str1 = extraLogTag
+ }
+ }
+ }
+
private val _notificationModel = MutableStateFlow(startingModel)
/**
@@ -71,6 +79,14 @@ constructor(
}
return
}
+ if (model.promotedContent == null) {
+ logger.e({
+ "$str1: received model with promotedContent=null, which shouldn't happen"
+ }) {
+ str1 = extraLogTag
+ }
+ return
+ }
_notificationModel.value = model
}
@@ -99,6 +115,15 @@ constructor(
}
private fun ActiveNotificationModel.toNotificationChipModel(): NotificationChipModel? {
+ val promotedContent = this.promotedContent
+ if (promotedContent == null) {
+ logger.w({
+ "$str1: Can't show chip because promotedContent=null, which shouldn't happen"
+ }) {
+ str1 = extraLogTag
+ }
+ return null
+ }
val statusBarChipIconView = this.statusBarChipIconView
if (statusBarChipIconView == null) {
if (!StatusBarConnectedDisplays.isEnabled) {
@@ -111,7 +136,8 @@ constructor(
return null
}
}
- return NotificationChipModel(key, statusBarChipIconView, whenTime)
+
+ return NotificationChipModel(key, statusBarChipIconView, whenTime, promotedContent)
}
@AssistedFactory
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt
index 4588b19bd720..9f0638baec83 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt
@@ -17,10 +17,13 @@
package com.android.systemui.statusbar.chips.notification.domain.model
import com.android.systemui.statusbar.StatusBarIconView
+import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
/** Modeling all the data needed to render a status bar notification chip. */
data class NotificationChipModel(
val key: String,
val statusBarChipIconView: StatusBarIconView?,
+ // TODO(b/364653005): Use [PromotedNotificationContentModel.time] instead of a custom field.
val whenTime: Long,
+ val promotedContent: PromotedNotificationContentModel,
)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
index 2cd5bb339072..e2c886a0f680 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
@@ -59,8 +59,11 @@ constructor(
StatusBarConnectedDisplays.assertInNewMode()
OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon(this.key)
}
- // TODO(b/364653005): Use the notification color if applicable.
- val colors = ColorsModel.Themed
+ val colors =
+ ColorsModel.Custom(
+ backgroundColorInt = this.promotedContent.colors.backgroundColor,
+ primaryTextColorInt = this.promotedContent.colors.primaryTextColor,
+ )
val onClickListener =
View.OnClickListener {
// The notification pipeline needs everything to run on the main thread, so keep
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
index 4b0fc5ab6059..efedf41e4684 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
@@ -40,21 +40,25 @@ sealed interface ColorsModel {
}
/**
- * The chip should have the given background color, and text color that matches dark/light
- * theme.
+ * The chip should have the given background color and primary text color.
+ *
+ * If [primaryTextColorInt] is null, the text color will match the current UI mode (light/dark).
*/
- data class Custom(val backgroundColorInt: Int) : ColorsModel {
+ data class Custom(val backgroundColorInt: Int, val primaryTextColorInt: Int? = null) :
+ ColorsModel {
override fun background(context: Context): ColorStateList =
ColorStateList.valueOf(backgroundColorInt)
- // TODO(b/361346412): When dark theme changes, the chip should automatically re-render with
+ // TODO(b/361346412): When UI mode changes, the chip should automatically re-render with
// the right text color. Right now, it has the right text color when the chip is first
- // created but the color doesn't update if dark theme changes.
- override fun text(context: Context) =
- Utils.getColorAttrDefaultColor(
- context,
- com.android.internal.R.attr.materialColorOnSurface,
- )
+ // created but the color doesn't update if UI mode changes.
+ override fun text(context: Context): Int {
+ return primaryTextColorInt
+ ?: Utils.getColorAttrDefaultColor(
+ context,
+ com.android.internal.R.color.materialColorOnSurface,
+ )
+ }
}
/** The chip should have a red background with white text. */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt
index 280d66bcb827..6cf2c73a7138 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt
@@ -18,9 +18,9 @@ package com.android.systemui.statusbar.data.repository
import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR
import com.android.systemui.CoreStartable
-import com.android.systemui.common.ui.GlobalConfig
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.display.data.repository.DisplayRepository
import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository
import com.android.systemui.display.data.repository.PerDisplayStore
@@ -74,7 +74,7 @@ constructor(
@SysUISingleton
class SingleDisplayStatusBarConfigurationControllerStore
@Inject
-constructor(@GlobalConfig globalConfigurationController: ConfigurationController) :
+constructor(@Main globalConfigurationController: ConfigurationController) :
StatusBarConfigurationControllerStore,
PerDisplayStore<StatusBarConfigurationController> by SingleDisplayStore(
globalConfigurationController as StatusBarConfigurationController
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt
index cc91e2dc3a25..22c37df7db7e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt
@@ -37,6 +37,7 @@ import com.android.systemui.statusbar.phone.BoundsPair
import com.android.systemui.statusbar.phone.LetterboxAppearanceCalculator
import com.android.systemui.statusbar.phone.StatusBarBoundsProvider
import com.android.systemui.statusbar.phone.fragment.dagger.HomeStatusBarComponent
+import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
import dagger.assisted.Assisted
@@ -89,6 +90,9 @@ interface StatusBarModePerDisplayRepository : OnStatusBarViewInitializedListener
/** The current mode of the status bar. */
val statusBarMode: StateFlow<StatusBarMode>
+ /** Whether the status bar is forced to be visible because of an ongoing call */
+ val ongoingProcessRequiresStatusBarVisible: StateFlow<Boolean>
+
/**
* Requests for the status bar to be shown transiently.
*
@@ -110,6 +114,12 @@ interface StatusBarModePerDisplayRepository : OnStatusBarViewInitializedListener
* if needed.
*/
fun stop()
+
+ /**
+ * Called when an ongoing process needs to prevent the status bar from being hidden in any
+ * state.
+ */
+ fun setOngoingProcessRequiresStatusBarVisible(requiredVisible: Boolean)
}
class StatusBarModePerDisplayRepositoryImpl
@@ -195,6 +205,16 @@ constructor(
statusBarBoundsProvider.addChangeListener(listener)
}
+ private val _ongoingProcessRequiresStatusBarVisible = MutableStateFlow(false)
+ override val ongoingProcessRequiresStatusBarVisible =
+ _ongoingProcessRequiresStatusBarVisible.asStateFlow()
+
+ override fun setOngoingProcessRequiresStatusBarVisible(
+ requiredVisible: Boolean
+ ) {
+ _ongoingProcessRequiresStatusBarVisible.value = requiredVisible
+ }
+
override val isInFullscreenMode: StateFlow<Boolean> =
_originalStatusBarAttributes
.map { params ->
@@ -235,16 +255,28 @@ constructor(
isTransientShown,
isInFullscreenMode,
ongoingCallRepository.ongoingCallState,
- ) { modifiedAttributes, isTransientShown, isInFullscreenMode, ongoingCallState ->
+ _ongoingProcessRequiresStatusBarVisible,
+ ) {
+ modifiedAttributes,
+ isTransientShown,
+ isInFullscreenMode,
+ ongoingCallStateLegacy,
+ ongoingProcessRequiresStatusBarVisible ->
if (modifiedAttributes == null) {
null
} else {
+ val hasOngoingCall =
+ if (StatusBarChipsModernization.isEnabled) {
+ ongoingProcessRequiresStatusBarVisible
+ } else {
+ ongoingCallStateLegacy is OngoingCallModel.InCall
+ }
val statusBarMode =
toBarMode(
modifiedAttributes.appearance,
isTransientShown,
isInFullscreenMode,
- hasOngoingCall = ongoingCallState is OngoingCallModel.InCall,
+ hasOngoingCall,
)
StatusBarAppearance(
statusBarMode,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
index a0515ca92cdd..d25889820629 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
@@ -39,7 +39,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
-import com.android.settingslib.Utils;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.notification.ColorUpdateLogger;
import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
@@ -457,8 +456,8 @@ public class FooterView extends StackScrollerDecorView {
*/
public void updateColors() {
Resources.Theme theme = mContext.getTheme();
- final @ColorInt int onSurface = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorOnSurface);
+ final @ColorInt int onSurface = mContext.getColor(
+ com.android.internal.R.color.materialColorOnSurface);
// Same resource, separate drawables to prevent touch effects from showing on the wrong
// button.
final Drawable clearAllBg = theme.getDrawable(R.drawable.notif_footer_btn_background);
@@ -467,8 +466,8 @@ public class FooterView extends StackScrollerDecorView {
? theme.getDrawable(R.drawable.notif_footer_btn_background) : null;
final @ColorInt int scHigh;
if (!notificationFooterBackgroundTintOptimization()) {
- scHigh = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorSurfaceContainerHigh);
+ scHigh = mContext.getColor(
+ com.android.internal.R.color.materialColorSurfaceContainerHigh);
if (scHigh != 0) {
final ColorFilter bgColorFilter = new PorterDuffColorFilter(scHigh, SRC_ATOP);
clearAllBg.setColorFilter(bgColorFilter);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java
index 0b188afa1c35..d0c02f77f382 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java
@@ -183,7 +183,7 @@ public class HeadsUpManagerImpl
@Inject
public HeadsUpManagerImpl(
- @NonNull final Context context,
+ @NonNull @ShadeDisplayAware final Context context,
HeadsUpManagerLogger logger,
StatusBarStateController statusBarStateController,
KeyguardBypassController bypassController,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt
index 0f19d7288f6f..9dc3ed29570b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconBuilder.kt
@@ -18,13 +18,14 @@ package com.android.systemui.statusbar.notification.icon
import android.app.Notification
import android.content.Context
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.contentDescForNotification
import javax.inject.Inject
/** Testable wrapper around Context. */
-class IconBuilder @Inject constructor(private val context: Context) {
+class IconBuilder @Inject constructor(@Main private val context: Context) {
@JvmOverloads
fun createIconView(
entry: NotificationEntry,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt
index 6dbb71463602..643ee249e75e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.notification.icon.ui.viewbinder
import android.graphics.Color
-import android.graphics.Rect
import android.util.Log
import android.view.View
import android.view.ViewGroup
@@ -53,7 +52,6 @@ import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.stateIn
/** Binds a view-model to a [NotificationIconContainer]. */
@@ -71,10 +69,7 @@ object NotificationIconContainerViewBinder {
launch {
val contrastColorUtil = ContrastColorUtil.getInstance(view.context)
val iconColors: StateFlow<NotificationIconColors> =
- viewModel
- .iconColors(displayId)
- .mapNotNull { it.iconColors(view.viewBounds) }
- .stateIn(this)
+ viewModel.iconColors(displayId).stateIn(this)
viewModel.icons.bindIcons(
logTag = "statusbar",
view = view,
@@ -374,18 +369,6 @@ fun NotifCollection.iconViewStoreBy(block: (IconPack) -> StatusBarIconView?) =
getEntry(key)?.icons?.let(block)
}
-private val View.viewBounds: Rect
- get() {
- val tmpArray = intArrayOf(0, 0)
- getLocationOnScreen(tmpArray)
- return Rect(
- /* left = */ tmpArray[0],
- /* top = */ tmpArray[1],
- /* right = */ left + width,
- /* bottom = */ top + height,
- )
- }
-
private suspend inline fun <T> Flow<T>.collectTracingEach(
tag: String,
crossinline collector: (T) -> Unit,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt
index 83f56a092bc6..124bd2eece36 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt
@@ -16,8 +16,6 @@
package com.android.systemui.statusbar.notification.icon.ui.viewbinder
-import android.graphics.Rect
-import android.view.View
import com.android.app.tracing.traceSection
import com.android.internal.util.ContrastColorUtil
import com.android.systemui.res.R
@@ -25,6 +23,7 @@ import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.StatusBarIconView.NO_COLOR
import com.android.systemui.statusbar.notification.NotificationUtils
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconColors
+import com.android.systemui.util.view.viewBoundsOnScreen
import kotlinx.coroutines.flow.Flow
object StatusBarIconViewBinder {
@@ -60,25 +59,13 @@ object StatusBarIconViewBinder {
val isPreL = java.lang.Boolean.TRUE == view.getTag(R.id.icon_is_pre_L)
val isColorized = !isPreL || NotificationUtils.isGrayscale(view, contrastColorUtil)
view.staticDrawableColor =
- if (isColorized) colors.staticDrawableColor(view.viewBounds) else NO_COLOR
+ if (isColorized) colors.staticDrawableColor(view.viewBoundsOnScreen()) else NO_COLOR
// Set the color for the overflow dot
view.setDecorColor(colors.tint)
}
}
}
-private val View.viewBounds: Rect
- get() {
- val tmpArray = intArrayOf(0, 0)
- getLocationOnScreen(tmpArray)
- return Rect(
- /* left = */ tmpArray[0],
- /* top = */ tmpArray[1],
- /* right = */ left + width,
- /* bottom = */ top + height,
- )
- }
-
private suspend inline fun <T> Flow<T>.collectTracingEach(
tag: String,
crossinline collector: (T) -> Unit,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt
index 2365db451836..a9635dcd2bc9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt
@@ -17,14 +17,6 @@ package com.android.systemui.statusbar.notification.icon.ui.viewmodel
import android.graphics.Rect
-/**
- * Lookup the colors to use for the notification icons based on the bounds of the icon container. A
- * result of `null` indicates that no color changes should be applied.
- */
-fun interface NotificationIconColorLookup {
- fun iconColors(viewBounds: Rect): NotificationIconColors?
-}
-
/** Colors to apply to notification icons. */
interface NotificationIconColors {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt
index f0b03065e637..2ba28a660116 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt
@@ -68,18 +68,10 @@ constructor(
.distinctUntilChanged()
/** The colors with which to display the notification icons. */
- fun iconColors(displayId: Int): Flow<NotificationIconColorLookup> =
+ fun iconColors(displayId: Int): Flow<NotificationIconColors> =
darkIconInteractor
.darkState(displayId)
- .map { (areas: Collection<Rect>, tint: Int) ->
- NotificationIconColorLookup { viewBounds: Rect ->
- if (DarkIconDispatcher.isInAreas(areas, viewBounds)) {
- IconColorsImpl(tint, areas)
- } else {
- null
- }
- }
- }
+ .map { (areas: Collection<Rect>, tint: Int) -> IconColorsImpl(tint, areas) }
.flowOn(bgContext)
.conflate()
.distinctUntilChanged()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
index 38eaf27ad358..e122ca888f45 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
@@ -77,6 +77,13 @@ constructor(
contentBuilder.text = notification.text()
contentBuilder.skeletonLargeIcon = null // TODO
+ val colorsFromNotif = recoveredBuilder.getColors(/* header= */ false)
+ contentBuilder.colors =
+ PromotedNotificationContentModel.Colors(
+ backgroundColor = colorsFromNotif.backgroundColor,
+ primaryTextColor = colorsFromNotif.primaryTextColor,
+ )
+
recoveredBuilder.style?.extractContent(contentBuilder)
?: run { contentBuilder.style = Style.Ineligible }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
index 41ee3b992c5a..0af40437828e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.promoted.shared.model
import android.annotation.DrawableRes
import android.graphics.drawable.Icon
+import androidx.annotation.ColorInt
import com.android.internal.widget.NotificationProgressModel
import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi
@@ -39,6 +40,7 @@ data class PromotedNotificationContentModel(
val title: CharSequence?,
val text: CharSequence?,
val skeletonLargeIcon: Icon?, // TODO(b/377568176): Make into an IconModel.
+ val colors: Colors,
val style: Style,
// for CallStyle:
@@ -61,6 +63,7 @@ data class PromotedNotificationContentModel(
var text: CharSequence? = null
var skeletonLargeIcon: Icon? = null
var style: Style = Style.Ineligible
+ var colors: Colors = Colors(backgroundColor = 0, primaryTextColor = 0)
// for CallStyle:
var personIcon: Icon? = null
@@ -83,6 +86,7 @@ data class PromotedNotificationContentModel(
title = title,
text = text,
skeletonLargeIcon = skeletonLargeIcon,
+ colors = colors,
style = style,
personIcon = personIcon,
personName = personName,
@@ -102,6 +106,9 @@ data class PromotedNotificationContentModel(
}
}
+ /** The colors used to display the notification. */
+ data class Colors(@ColorInt val backgroundColor: Int, @ColorInt val primaryTextColor: Int)
+
/** The promotion-eligible style of a notification, or [Style.Ineligible] if not. */
enum class Style {
BigPicture,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index 5c51adadfd82..b4092cd785bf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -37,7 +37,6 @@ import android.view.animation.Interpolator;
import com.android.app.animation.Interpolators;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.jank.InteractionJankMonitor.Configuration;
-import com.android.settingslib.Utils;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.res.R;
import com.android.systemui.shade.TouchLogger;
@@ -123,8 +122,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
}
private void updateColors() {
- mNormalColor = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorSurfaceContainerHigh);
+ mNormalColor = mContext.getColor(
+ com.android.internal.R.color.materialColorSurfaceContainerHigh);
mTintedRippleColor = mContext.getColor(
R.color.notification_ripple_tinted_color);
mNormalRippleColor = mContext.getColor(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt
index a8d59d83d1e9..6bfc9f07ffc4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt
@@ -40,6 +40,7 @@ import android.widget.TextView
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.res.R
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.shade.ShadeDisplayAware
import javax.inject.Inject
private const val TAG = "ChannelDialogController"
@@ -58,11 +59,10 @@ private const val TAG = "ChannelDialogController"
*/
@SysUISingleton
class ChannelEditorDialogController @Inject constructor(
- c: Context,
+ @ShadeDisplayAware private val context: Context,
private val noMan: INotificationManager,
private val dialogBuilder: ChannelEditorDialog.Builder
) {
- val context: Context = c.applicationContext
private var prepared = false
private lateinit var dialog: ChannelEditorDialog
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java
index 61f4e96bf99a..5c4c253d1f98 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java
@@ -21,7 +21,6 @@ import static android.app.Notification.COLOR_INVALID;
import android.annotation.Nullable;
import android.app.Flags;
import android.content.Context;
-import android.content.res.TypedArray;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
@@ -115,16 +114,9 @@ public class HybridNotificationView extends AlphaOptimizedLinearLayout
}
private void resolveThemeTextColors() {
- try (TypedArray ta = mContext.getTheme().obtainStyledAttributes(
- android.R.style.Theme_DeviceDefault_DayNight, new int[]{
- com.android.internal.R.attr.materialColorOnSurface,
- com.android.internal.R.attr.materialColorOnSurfaceVariant
- })) {
- if (ta != null) {
- mPrimaryTextColor = ta.getColor(0, mPrimaryTextColor);
- mSecondaryTextColor = ta.getColor(1, mSecondaryTextColor);
- }
- }
+ mPrimaryTextColor = mContext.getColor(com.android.internal.R.color.materialColorOnSurface);
+ mSecondaryTextColor = mContext.getColor(
+ com.android.internal.R.color.materialColorOnSurfaceVariant);
}
public void bind(@Nullable CharSequence title, @Nullable CharSequence text,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
index 34ef63944f14..e440d2728263 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
@@ -35,7 +35,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.internal.util.ContrastColorUtil;
-import com.android.settingslib.Utils;
import com.android.systemui.Dumpable;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.notification.shared.NotificationAddXOnHoverToDismiss;
@@ -83,8 +82,8 @@ public class NotificationBackgroundView extends View implements Dumpable,
R.color.notification_state_color_light);
mDarkColoredStatefulColors = getResources().getColorStateList(
R.color.notification_state_color_dark);
- mNormalColor = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorSurfaceContainerHigh);
+ mNormalColor = mContext.getColor(
+ com.android.internal.R.color.materialColorSurfaceContainerHigh);
mFocusOverlayStroke = getResources().getDimension(R.dimen.notification_focus_stroke_width);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
index e141b7cf23ec..be9f60d4d5a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
@@ -43,7 +43,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
-import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
@@ -337,10 +336,7 @@ public class NotificationConversationInfo extends LinearLayout implements
Drawable person = mIconFactory.getBaseIconDrawable(mShortcutInfo);
if (person == null) {
person = mContext.getDrawable(R.drawable.ic_person).mutate();
- TypedArray ta = mContext.obtainStyledAttributes(
- new int[]{com.android.internal.R.attr.materialColorPrimary});
- int colorPrimary = ta.getColor(0, 0);
- ta.recycle();
+ int colorPrimary = mContext.getColor(com.android.internal.R.color.materialColorPrimary);
person.setTint(colorPrimary);
}
ImageView image = findViewById(R.id.conversation_icon);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
index f8aff69f0531..9d13ab53ec71 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
@@ -21,7 +21,6 @@ import android.content.Context
import android.graphics.drawable.AnimatedImageDrawable
import android.view.View
import android.view.ViewGroup
-import android.view.ViewGroup.MarginLayoutParams
import com.android.internal.widget.CachingIconView
import com.android.internal.widget.ConversationLayout
import com.android.internal.widget.MessagingGroup
@@ -94,13 +93,6 @@ class NotificationConversationTemplateViewWrapper(
// Reinspect the notification. Before the super call, because the super call also updates
// the transformation types and we need to have our values set by then.
resolveViews()
- if (Flags.notificationsRedesignAppIcons() && row.isShowingAppIcon) {
- // Override the margins to be 2dp instead of 4dp according to the new design if we're
- // showing the app icon.
- val lp = badgeIconView.layoutParams as MarginLayoutParams
- lp.setMargins(2, 2, 2, 2)
- badgeIconView.layoutParams = lp
- }
super.onContentUpdated(row)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
index 182fba34cafb..752a8abf055d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
@@ -38,7 +38,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.CachingIconView;
-import com.android.settingslib.Utils;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.notification.FeedbackIcon;
@@ -344,9 +343,8 @@ public abstract class NotificationViewWrapper implements TransformableView {
if (customBackgroundColor != 0) {
return customBackgroundColor;
}
- return Utils.getColorAttr(mView.getContext(),
- com.android.internal.R.attr.materialColorSurfaceContainerHigh)
- .getDefaultColor();
+ return mView.getContext().getColor(
+ com.android.internal.R.color.materialColorSurfaceContainerHigh);
}
public void setLegacy(boolean legacy) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
index 99edf652f289..00cd8ce87738 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
@@ -22,7 +22,6 @@ import android.app.Notification;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.Path.Direction;
@@ -1519,10 +1518,9 @@ public class NotificationChildrenContainer extends ViewGroup
int color = mContainingNotification.getNotificationColor();
Resources.Theme theme = new ContextThemeWrapper(mContext,
com.android.internal.R.style.Theme_DeviceDefault_DayNight).getTheme();
- try (TypedArray ta = theme.obtainStyledAttributes(
- new int[]{com.android.internal.R.attr.materialColorPrimary})) {
- color = ta.getColor(0, color);
- }
+
+ color = mContext.getColor(com.android.internal.R.color.materialColorPrimary);
+
mHybridGroupManager.setOverflowNumberColor(mOverflowNumber, color);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index f37f7f990cf9..072089981cc7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -83,7 +83,6 @@ import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.policy.SystemBarUtils;
import com.android.keyguard.BouncerPanelExpansionCalculator;
import com.android.keyguard.KeyguardSliceView;
-import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.ExpandHelper;
@@ -4730,10 +4729,10 @@ public class NotificationStackScrollLayout
* Update colors of section headers, shade footer, and empty shade views.
*/
void updateDecorViews() {
- final @ColorInt int onSurface = Utils.getColorAttrDefaultColor(
- mContext, com.android.internal.R.attr.materialColorOnSurface);
- final @ColorInt int onSurfaceVariant = Utils.getColorAttrDefaultColor(
- mContext, com.android.internal.R.attr.materialColorOnSurfaceVariant);
+ final @ColorInt int onSurface = mContext.getColor(
+ com.android.internal.R.color.materialColorOnSurface);
+ final @ColorInt int onSurfaceVariant = mContext.getColor(
+ com.android.internal.R.color.materialColorOnSurfaceVariant);
ColorUpdateLogger colorUpdateLogger = ColorUpdateLogger.getInstance();
if (colorUpdateLogger != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt
index bffcae99e7f6..b4561686b7b2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt
@@ -147,8 +147,7 @@ constructor(
// The footer needs to be re-inflated every time the theme or the font size changes.
configuration
.inflateLayout<FooterView>(
- if (NotifRedesignFooter.isEnabled)
- R.layout.status_bar_notification_footer_redesign
+ if (NotifRedesignFooter.isEnabled) R.layout.notification_2025_footer
else R.layout.status_bar_notification_footer,
parentView,
attachToRoot = false,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt
index 8f4279e80376..a324e6df8a33 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerStartable.kt
@@ -17,8 +17,8 @@
package com.android.systemui.statusbar.phone
import com.android.systemui.CoreStartable
-import com.android.systemui.common.ui.GlobalConfig
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
import javax.inject.Inject
@@ -27,8 +27,8 @@ import javax.inject.Inject
class ConfigurationControllerStartable
@Inject
constructor(
- @GlobalConfig private val configurationController: ConfigurationController,
- private val listeners: Set<@JvmSuppressWildcards ConfigurationListener>
+ @Main private val configurationController: ConfigurationController,
+ private val listeners: Set<@JvmSuppressWildcards ConfigurationListener>,
) : CoreStartable {
override fun start() {
listeners.forEach { configurationController.addCallback(it) }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index e7c6fb46f984..324db79a4078 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -51,7 +51,6 @@ import com.android.internal.util.function.TriConsumer;
import com.android.keyguard.BouncerPanelExpansionCalculator;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
-import com.android.settingslib.Utils;
import com.android.systemui.Dumpable;
import com.android.systemui.animation.ShadeInterpolation;
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants;
@@ -82,9 +81,6 @@ import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.wakelock.DelayedWakeLock;
import com.android.systemui.util.wakelock.WakeLock;
-import kotlinx.coroutines.CoroutineDispatcher;
-import kotlinx.coroutines.ExperimentalCoroutinesApi;
-
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -93,6 +89,9 @@ import java.util.function.Consumer;
import javax.inject.Inject;
+import kotlinx.coroutines.CoroutineDispatcher;
+import kotlinx.coroutines.ExperimentalCoroutinesApi;
+
/**
* Controls both the scrim behind the notifications and in front of the notifications (when a
* security method gets shown).
@@ -1532,17 +1531,17 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
private void updateThemeColors() {
if (mScrimBehind == null) return;
- int background = Utils.getColorAttr(mScrimBehind.getContext(),
- com.android.internal.R.attr.materialColorSurfaceDim).getDefaultColor();
- int accent = Utils.getColorAttr(mScrimBehind.getContext(),
- com.android.internal.R.attr.materialColorPrimary).getDefaultColor();
+ int background = mScrimBehind.getContext().getColor(
+ com.android.internal.R.color.materialColorSurfaceDim);
+ int accent = mScrimBehind.getContext().getColor(
+ com.android.internal.R.color.materialColorPrimary);
mColors.setMainColor(background);
mColors.setSecondaryColor(accent);
final boolean isBackgroundLight = !ContrastColorUtil.isColorDark(background);
mColors.setSupportsDarkText(isBackgroundLight);
- int surface = Utils.getColorAttr(mScrimBehind.getContext(),
- com.android.internal.R.attr.materialColorSurface).getDefaultColor();
+ int surface = mScrimBehind.getContext().getColor(
+ com.android.internal.R.color.materialColorSurface);
for (ScrimState state : ScrimState.values()) {
state.setSurfaceColor(surface);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java
index b9cba9903466..d0d0b5c402e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java
@@ -29,7 +29,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import com.android.settingslib.Utils;
import com.android.systemui.res.R;
import com.android.wm.shell.shared.animation.Interpolators;
@@ -51,8 +50,8 @@ public class TapAgainView extends TextView {
}
void updateColor() {
- final @ColorInt int onSurface = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorOnSurface);
+ final @ColorInt int onSurface = mContext.getColor(
+ com.android.internal.R.color.materialColorOnSurface);
setTextColor(onSurface);
setBackground(getResources().getDrawable(R.drawable.rounded_bg_full, mContext.getTheme()));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt
index 4b71c0268f11..b7ccfa01c92c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractor.kt
@@ -21,17 +21,22 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.Logger
+import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore
import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor
+import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLog
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
+import com.android.systemui.statusbar.window.StatusBarWindowControllerStore
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
/**
@@ -47,7 +52,9 @@ import kotlinx.coroutines.flow.stateIn
@SysUISingleton
class OngoingCallInteractor @Inject constructor(
@Application private val scope: CoroutineScope,
- activityManagerRepository: ActivityManagerRepository,
+ private val activityManagerRepository: ActivityManagerRepository,
+ private val statusBarModeRepositoryStore: StatusBarModeRepositoryStore,
+ private val statusBarWindowControllerStore: StatusBarWindowControllerStore,
activeNotificationsInteractor: ActiveNotificationsInteractor,
@OngoingCallLog private val logBuffer: LogBuffer,
) {
@@ -58,46 +65,78 @@ class OngoingCallInteractor @Inject constructor(
*/
val ongoingCallState: StateFlow<OngoingCallModel> =
activeNotificationsInteractor.ongoingCallNotification
- .flatMapLatest { notificationModel ->
- when (notificationModel) {
- null -> {
- logger.d("No active call notification - hiding chip")
- flowOf(OngoingCallModel.NoCall)
- }
+ .flatMapLatest { notification ->
+ createOngoingCallStateFlow(
+ notification = notification
+ )
+ }
+ .onEach { state ->
+ setStatusBarRequiredForOngoingCall(state)
+ }
+ .stateIn(
+ scope = scope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = OngoingCallModel.NoCall
+ )
+
+ private fun createOngoingCallStateFlow(
+ notification: ActiveNotificationModel?
+ ): Flow<OngoingCallModel> {
+ if (notification == null) {
+ logger.d("No active call notification - hiding chip")
+ return flowOf(OngoingCallModel.NoCall)
+ }
+
+ return combine(
+ flowOf(notification),
+ activityManagerRepository.createIsAppVisibleFlow(
+ creationUid = notification.uid,
+ logger = logger,
+ identifyingLogTag = TAG,
+ )
+ ) { model, isVisible ->
+ deriveOngoingCallState(model, isVisible)
+ }
+ }
- else -> combine(
- flowOf(notificationModel),
- activityManagerRepository.createIsAppVisibleFlow(
- creationUid = notificationModel.uid,
- logger = logger,
- identifyingLogTag = TAG,
- ),
- ) { model, isVisible ->
- when {
- isVisible -> {
- logger.d({ "Call app is visible: uid=$int1" }) {
- int1 = model.uid
- }
- OngoingCallModel.InCallWithVisibleApp
- }
+ private fun deriveOngoingCallState(
+ model: ActiveNotificationModel,
+ isVisible: Boolean
+ ): OngoingCallModel {
+ return when {
+ isVisible -> {
+ logger.d({ "Call app is visible: uid=$int1" }) {
+ int1 = model.uid
+ }
+ OngoingCallModel.InCallWithVisibleApp
+ }
- else -> {
- logger.d({ "Active call detected: startTime=$long1 hasIcon=$bool1" }) {
- long1 = model.whenTime
- bool1 = model.statusBarChipIconView != null
- }
- OngoingCallModel.InCall(
- startTimeMs = model.whenTime,
- notificationIconView = model.statusBarChipIconView,
- intent = model.contentIntent,
- notificationKey = model.key,
- )
- }
- }
- }
+ else -> {
+ logger.d({ "Active call detected: startTime=$long1 hasIcon=$bool1" }) {
+ long1 = model.whenTime
+ bool1 = model.statusBarChipIconView != null
}
+ OngoingCallModel.InCall(
+ startTimeMs = model.whenTime,
+ notificationIconView = model.statusBarChipIconView,
+ intent = model.contentIntent,
+ notificationKey = model.key
+ )
}
- .stateIn(scope, SharingStarted.WhileSubscribed(), OngoingCallModel.NoCall)
+ }
+ }
+
+ private fun setStatusBarRequiredForOngoingCall(state: OngoingCallModel) {
+ val statusBarRequired = state is OngoingCallModel.InCall
+ // TODO(b/382808183): Create a single repository that can be utilized in
+ // `statusBarModeRepositoryStore` and `statusBarWindowControllerStore` so we do not need
+ // two separate calls to force the status bar to stay visible.
+ statusBarModeRepositoryStore.defaultDisplay.setOngoingProcessRequiresStatusBarVisible(
+ statusBarRequired
+ )
+ statusBarWindowControllerStore.defaultDisplay
+ .setOngoingProcessRequiresStatusBarVisible(statusBarRequired)
+ }
companion object {
private val TAG = "OngoingCall"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileContentDescriptionViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileContentDescriptionViewBinder.kt
new file mode 100644
index 000000000000..c720b1df1e62
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileContentDescriptionViewBinder.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.pipeline.mobile.ui.binder
+
+import android.view.View
+import com.android.systemui.statusbar.pipeline.mobile.ui.model.MobileContentDescription
+
+object MobileContentDescriptionViewBinder {
+ fun bind(contentDescription: MobileContentDescription?, view: View) {
+ view.contentDescription =
+ when (contentDescription) {
+ null -> null
+ else -> contentDescription.loadContentDescription(view.context)
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt
index 31d349eb4cca..788f041b38c0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt
@@ -29,9 +29,9 @@ import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.settingslib.graph.SignalDrawable
import com.android.systemui.Flags.statusBarStaticInoutIndicators
-import com.android.systemui.common.ui.binder.ContentDescriptionViewBinder
import com.android.systemui.common.ui.binder.IconViewBinder
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.plugins.DarkIconDispatcher
@@ -48,12 +48,8 @@ import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarViewBin
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.distinctUntilChanged
-import com.android.app.tracing.coroutines.launchTraced as launch
-private data class Colors(
- @ColorInt val tint: Int,
- @ColorInt val contrast: Int,
-)
+private data class Colors(@ColorInt val tint: Int, @ColorInt val contrast: Int)
object MobileIconBinder {
/** Binds the view to the view-model, continuing to update the former based on the latter */
@@ -87,7 +83,7 @@ object MobileIconBinder {
MutableStateFlow(
Colors(
tint = DarkIconDispatcher.DEFAULT_ICON_TINT,
- contrast = DarkIconDispatcher.DEFAULT_INVERSE_ICON_TINT
+ contrast = DarkIconDispatcher.DEFAULT_INVERSE_ICON_TINT,
)
)
val decorTint: MutableStateFlow<Int> = MutableStateFlow(viewModel.defaultColor)
@@ -105,7 +101,7 @@ object MobileIconBinder {
viewModel.verboseLogger?.logBinderReceivedVisibility(
view,
viewModel.subscriptionId,
- isVisible
+ isVisible,
)
view.isVisible = isVisible
// [StatusIconContainer] can get out of sync sometimes. Make sure to
@@ -152,7 +148,7 @@ object MobileIconBinder {
launch {
viewModel.contentDescription.distinctUntilChanged().collect {
- ContentDescriptionViewBinder.bind(it, view)
+ MobileContentDescriptionViewBinder.bind(it, view)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/model/MobileContentDescription.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/model/MobileContentDescription.kt
new file mode 100644
index 000000000000..84fa07379a49
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/model/MobileContentDescription.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.pipeline.mobile.ui.model
+
+import android.annotation.StringRes
+import android.content.Context
+import com.android.systemui.res.R
+
+sealed interface MobileContentDescription {
+ fun loadContentDescription(context: Context): String
+
+ /**
+ * Content description for cellular parameterizes the [networkName] which comes from the system
+ */
+ data class Cellular(val networkName: String, @StringRes val levelDescriptionRes: Int) :
+ MobileContentDescription {
+ override fun loadContentDescription(context: Context): String =
+ context.getString(
+ R.string.accessibility_phone_string_format,
+ networkName,
+ context.getString(levelDescriptionRes),
+ )
+ }
+
+ data class SatelliteContentDescription(@StringRes val resId: Int) : MobileContentDescription {
+ override fun loadContentDescription(context: Context): String =
+ context.getString(this.resId)
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt
index 103b0e3a6f27..0bd3426712bd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel
-import com.android.settingslib.AccessibilityContentDescriptions
import com.android.systemui.Flags.statusBarStaticInoutIndicators
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
@@ -28,6 +27,7 @@ import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.Airpla
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconInteractor
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.domain.model.SignalIconModel
+import com.android.systemui.statusbar.pipeline.mobile.ui.model.MobileContentDescription
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import kotlinx.coroutines.CoroutineScope
@@ -50,7 +50,7 @@ interface MobileIconViewModelCommon {
/** True if this view should be visible at all. */
val isVisible: StateFlow<Boolean>
val icon: Flow<SignalIconModel>
- val contentDescription: Flow<ContentDescription?>
+ val contentDescription: Flow<MobileContentDescription?>
val roaming: Flow<Boolean>
/** The RAT icon (LTE, 3G, 5G, etc) to be displayed. Null if we shouldn't show anything */
val networkTypeIcon: Flow<Icon.Resource?>
@@ -95,10 +95,7 @@ class MobileIconViewModel(
}
private val satelliteProvider by lazy {
- CarrierBasedSatelliteViewModelImpl(
- subscriptionId,
- iconInteractor,
- )
+ CarrierBasedSatelliteViewModelImpl(subscriptionId, iconInteractor)
}
/**
@@ -123,7 +120,7 @@ class MobileIconViewModel(
override val icon: Flow<SignalIconModel> = vmProvider.flatMapLatest { it.icon }
- override val contentDescription: Flow<ContentDescription?> =
+ override val contentDescription: Flow<MobileContentDescription?> =
vmProvider.flatMapLatest { it.contentDescription }
override val roaming: Flow<Boolean> = vmProvider.flatMapLatest { it.roaming }
@@ -154,8 +151,7 @@ private class CarrierBasedSatelliteViewModelImpl(
override val isVisible: StateFlow<Boolean> = MutableStateFlow(true)
override val icon: Flow<SignalIconModel> = interactor.signalLevelIcon
- override val contentDescription: Flow<ContentDescription> =
- MutableStateFlow(ContentDescription.Loaded(""))
+ override val contentDescription: Flow<MobileContentDescription?> = MutableStateFlow(null)
/** These fields are not used for satellite icons currently */
override val roaming: Flow<Boolean> = flowOf(false)
@@ -206,27 +202,42 @@ private class CellularIconViewModel(
override val icon: Flow<SignalIconModel> = iconInteractor.signalLevelIcon
- override val contentDescription: Flow<ContentDescription?> =
- iconInteractor.signalLevelIcon
- .map {
- // We expect the signal icon to be cellular here since this is the cellular vm
- if (it !is SignalIconModel.Cellular) {
- null
- } else {
- val resId =
- AccessibilityContentDescriptions.getDescriptionForLevel(
- it.level,
- it.numberOfLevels
+ override val contentDescription: Flow<MobileContentDescription?> =
+ combine(iconInteractor.signalLevelIcon, iconInteractor.networkName) { icon, nameModel ->
+ when (icon) {
+ is SignalIconModel.Cellular ->
+ MobileContentDescription.Cellular(
+ nameModel.name,
+ icon.levelDescriptionRes(),
)
- if (resId != 0) {
- ContentDescription.Resource(resId)
- } else {
- null
- }
+ else -> null
}
}
.stateIn(scope, SharingStarted.WhileSubscribed(), null)
+ private fun SignalIconModel.Cellular.levelDescriptionRes() =
+ when (level) {
+ 0 -> R.string.accessibility_no_signal
+ 1 -> R.string.accessibility_one_bar
+ 2 -> R.string.accessibility_two_bars
+ 3 -> R.string.accessibility_three_bars
+ 4 -> {
+ if (numberOfLevels == 6) {
+ R.string.accessibility_four_bars
+ } else {
+ R.string.accessibility_signal_full
+ }
+ }
+ 5 -> {
+ if (numberOfLevels == 6) {
+ R.string.accessibility_signal_full
+ } else {
+ R.string.accessibility_no_signal
+ }
+ }
+ else -> R.string.accessibility_no_signal
+ }
+
private val showNetworkTypeIcon: Flow<Boolean> =
combine(
iconInteractor.isDataConnected,
@@ -248,10 +259,9 @@ private class CellularIconViewModel(
.stateIn(scope, SharingStarted.WhileSubscribed(), false)
override val networkTypeIcon: Flow<Icon.Resource?> =
- combine(
- iconInteractor.networkTypeIconGroup,
- showNetworkTypeIcon,
- ) { networkTypeIconGroup, shouldShow ->
+ combine(iconInteractor.networkTypeIconGroup, showNetworkTypeIcon) {
+ networkTypeIconGroup,
+ shouldShow ->
val desc =
if (networkTypeIconGroup.contentDescription != 0)
ContentDescription.Resource(networkTypeIconGroup.contentDescription)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 16d5f8d30593..2b0bf1a3d343 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -24,7 +24,6 @@ import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
import android.graphics.BlendMode;
import android.graphics.Color;
import android.graphics.PorterDuff;
@@ -174,11 +173,8 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
mTextWatcher = new SendButtonTextWatcher();
mEditorActionHandler = new EditorActionHandler();
mUiEventLogger = Dependency.get(UiEventLogger.class);
- TypedArray ta = getContext().getTheme().obtainStyledAttributes(new int[]{
- com.android.internal.R.attr.materialColorSurfaceDim,
- });
- mLastBackgroundColor = ta.getColor(0, 0);
- ta.recycle();
+ mLastBackgroundColor = getContext().getColor(
+ com.android.internal.R.color.materialColorSurfaceDim);
}
// TODO(b/193539698): move to Controller, since we're just directly accessing a system service
@@ -229,13 +225,10 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
textColor = mContext.getColorStateList(R.color.remote_input_text);
hintColor = mContext.getColor(R.color.remote_input_hint);
deleteFgColor = textColor.getDefaultColor();
- try (TypedArray ta = getContext().getTheme().obtainStyledAttributes(new int[]{
- com.android.internal.R.attr.materialColorSurfaceDim,
- com.android.internal.R.attr.materialColorSurfaceVariant
- })) {
- editBgColor = ta.getColor(0, backgroundColor);
- deleteBgColor = ta.getColor(1, Color.GRAY);
- }
+ editBgColor = getContext().getColor(
+ com.android.internal.R.color.materialColorSurfaceDim);
+ deleteBgColor = getContext().getColor(
+ com.android.internal.R.color.materialColorSurfaceVariant);
}
mEditText.setTextColor(textColor);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
index 9187e3c43380..d1e807f18196 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
@@ -23,7 +23,6 @@ import android.os.UserManager;
import com.android.internal.R;
import com.android.settingslib.devicestate.DeviceStateRotationLockSettingsManager;
import com.android.settingslib.notification.modes.ZenIconLoader;
-import com.android.systemui.common.ui.GlobalConfig;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Application;
import com.android.systemui.dagger.qualifiers.Main;
@@ -111,7 +110,7 @@ public interface StatusBarPolicyModule {
* wrong updates in case of secondary displays.
*/
@Binds
- ConfigurationController bindConfigurationController(@GlobalConfig ConfigurationController impl);
+ ConfigurationController bindConfigurationController(@Main ConfigurationController impl);
/** */
@Binds
@@ -189,14 +188,14 @@ public interface StatusBarPolicyModule {
/** */
@Binds
@SysUISingleton
- @GlobalConfig
+ @Main
ConfigurationForwarder provideGlobalConfigurationForwarder(
- @GlobalConfig ConfigurationController configurationController);
+ @Main ConfigurationController configurationController);
/** */
@Provides
@SysUISingleton
- @GlobalConfig
+ @Main
static ConfigurationController provideGlobalConfigurationController(
@Application Context context, ConfigurationControllerImpl.Factory factory) {
return factory.create(context);
diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt
index 7475388e80c2..0a10b440644d 100644
--- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt
+++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt
@@ -18,7 +18,7 @@ package com.android.systemui.temporarydisplay.chipbar
import android.os.VibrationEffect
import android.view.View
-import androidx.annotation.AttrRes
+import androidx.annotation.ColorRes
import com.android.internal.logging.InstanceId
import com.android.systemui.common.shared.model.Text
import com.android.systemui.common.shared.model.TintedIcon
@@ -52,8 +52,8 @@ data class ChipbarInfo(
) : TemporaryViewInfo() {
companion object {
// LINT.IfChange
- @AttrRes val DEFAULT_ICON_TINT = com.android.internal.R.attr.materialColorOnSecondaryFixed
- // LINT.ThenChange(systemui/res/layout/chipbar.xml)
+ @ColorRes val DEFAULT_ICON_TINT = com.android.internal.R.color.materialColorOnSecondaryFixed
+ // LINT.ThenChange(/packages/SystemUI/res/layout/chipbar.xml)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt b/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt
index 6160b00379ef..5b48c1ff628c 100644
--- a/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt
@@ -35,27 +35,21 @@ class ViewUtil @Inject constructor() {
fun touchIsWithinView(view: View, x: Float, y: Float): Boolean {
val left = view.locationOnScreen[0]
val top = view.locationOnScreen[1]
- return left <= x &&
- x <= left + view.width &&
- top <= y &&
- y <= top + view.height
+ return left <= x && x <= left + view.width && top <= y && y <= top + view.height
}
- /**
- * Sets [outRect] to be the view's location within its window.
- */
- fun setRectToViewWindowLocation(view: View, outRect: Rect) {
- val locInWindow = IntArray(2)
- view.getLocationInWindow(locInWindow)
-
- val x = locInWindow[0]
- val y = locInWindow[1]
-
- outRect.set(
- x,
- y,
- x + view.width,
- y + view.height,
- )
- }
+ /** Sets [outRect] to be the view's location within its window. */
+ fun setRectToViewWindowLocation(view: View, outRect: Rect) = view.viewBoundsOnScreen(outRect)
+}
+
+fun View.viewBoundsOnScreen(outRect: Rect) {
+ val locInWindow = IntArray(2)
+ getLocationInWindow(locInWindow)
+
+ val x = locInWindow[0]
+ val y = locInWindow[1]
+
+ outRect.set(x, y, x + width, y + height)
}
+
+fun View.viewBoundsOnScreen(): Rect = Rect().also { viewBoundsOnScreen(it) }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
index 9eee91beda51..f04fb2c3b8d5 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
@@ -30,7 +30,6 @@ import androidx.dynamicanimation.animation.FloatValueHolder
import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
import com.android.internal.R as internalR
-import com.android.settingslib.Utils
import com.android.systemui.res.R
import com.android.systemui.util.children
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
@@ -294,15 +293,11 @@ constructor(private val viewModel: VolumeDialogRingerDrawerViewModel) {
}
if (isSelected && !isAnimated) {
setBackgroundResource(R.drawable.volume_drawer_selection_bg)
- setColorFilter(
- Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorOnPrimary)
- )
+ setColorFilter(context.getColor(internalR.color.materialColorOnPrimary))
background = background.mutate()
} else if (!isAnimated) {
setBackgroundResource(R.drawable.volume_ringer_item_bg)
- setColorFilter(
- Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorOnSurface)
- )
+ setColorFilter(context.getColor(internalR.color.materialColorOnSurface))
background = background.mutate()
}
setOnClickListener {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt
index 3c465674ebb5..832f1c3471d6 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonUiModel.kt
@@ -31,30 +31,20 @@ data class RingerButtonUiModel(
companion object {
fun getUnselectedButton(context: Context): RingerButtonUiModel {
return RingerButtonUiModel(
- tintColor =
- Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorOnSurface),
- backgroundColor =
- Utils.getColorAttrDefaultColor(
- context,
- internalR.attr.materialColorSurfaceContainerHighest,
- ),
- cornerRadius =
- context.resources.getDimensionPixelSize(
- R.dimen.volume_dialog_background_square_corner_radius
- ),
+ tintColor = context.getColor(internalR.color.materialColorOnSurface),
+ backgroundColor = context.getColor(
+ internalR.color.materialColorSurfaceContainerHighest),
+ cornerRadius = context.resources.getDimensionPixelSize(
+ R.dimen.volume_dialog_background_square_corner_radius),
)
}
fun getSelectedButton(context: Context): RingerButtonUiModel {
return RingerButtonUiModel(
- tintColor =
- Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorOnPrimary),
- backgroundColor =
- Utils.getColorAttrDefaultColor(context, internalR.attr.materialColorPrimary),
- cornerRadius =
- context.resources.getDimensionPixelSize(
- R.dimen.volume_dialog_ringer_selected_button_background_radius
- ),
+ tintColor = context.getColor(internalR.color.materialColorOnPrimary),
+ backgroundColor = context.getColor(internalR.color.materialColorPrimary),
+ cornerRadius = context.resources.getDimensionPixelSize(
+ R.dimen.volume_dialog_ringer_selected_button_background_radius),
)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
index 02747d7e6996..6c4a853b42ad 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
@@ -80,10 +80,10 @@ constructor(
label = label,
labelColor =
if (Flags.volumeRedesign()) {
- Color.Attribute(com.android.internal.R.attr.materialColorOnSurface)
+ Color.Resource(com.android.internal.R.color.materialColorOnSurface)
} else {
- Color.Attribute(
- com.android.internal.R.attr.materialColorOnSurfaceVariant
+ Color.Resource(
+ com.android.internal.R.color.materialColorOnSurfaceVariant
)
},
deviceName =
@@ -96,10 +96,10 @@ constructor(
},
deviceNameColor =
if (mediaOutputModel.canOpenAudioSwitcher) {
- Color.Attribute(com.android.internal.R.attr.materialColorOnSurface)
+ Color.Resource(com.android.internal.R.color.materialColorOnSurface)
} else {
- Color.Attribute(
- com.android.internal.R.attr.materialColorOnSurfaceVariant
+ Color.Resource(
+ com.android.internal.R.color.materialColorOnSurfaceVariant
)
},
)
@@ -126,32 +126,32 @@ constructor(
iconColor =
if (mediaOutputModel.canOpenAudioSwitcher) {
if (Flags.volumeRedesign()) {
- Color.Attribute(
- com.android.internal.R.attr.materialColorOnPrimary
+ Color.Resource(
+ com.android.internal.R.color.materialColorOnPrimary
)
} else {
- Color.Attribute(
- com.android.internal.R.attr.materialColorSurface
+ Color.Resource(
+ com.android.internal.R.color.materialColorSurface
)
}
} else {
- Color.Attribute(
- com.android.internal.R.attr.materialColorSurfaceContainerHighest
+ Color.Resource(
+ com.android.internal.R.color.materialColorSurfaceContainerHighest
)
},
backgroundColor =
if (mediaOutputModel.canOpenAudioSwitcher) {
if (Flags.volumeRedesign()) {
- Color.Attribute(
- com.android.internal.R.attr.materialColorPrimary
+ Color.Resource(
+ com.android.internal.R.color.materialColorPrimary
)
} else {
- Color.Attribute(
- com.android.internal.R.attr.materialColorSecondary
+ Color.Resource(
+ com.android.internal.R.color.materialColorSecondary
)
}
} else {
- Color.Attribute(com.android.internal.R.attr.materialColorOutline)
+ Color.Resource(com.android.internal.R.color.materialColorOutline)
},
)
} else {
@@ -160,16 +160,16 @@ constructor(
iconColor =
if (mediaOutputModel.canOpenAudioSwitcher) {
if (Flags.volumeRedesign()) {
- Color.Attribute(
- com.android.internal.R.attr.materialColorPrimary
+ Color.Resource(
+ com.android.internal.R.color.materialColorPrimary
)
} else {
- Color.Attribute(
- com.android.internal.R.attr.materialColorOnSurfaceVariant
+ Color.Resource(
+ com.android.internal.R.color.materialColorOnSurfaceVariant
)
}
} else {
- Color.Attribute(com.android.internal.R.attr.materialColorOutline)
+ Color.Resource(com.android.internal.R.color.materialColorOutline)
},
backgroundColor = Color.Loaded(GraphicsColor.TRANSPARENT),
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java
index 50d0049dbcd7..dddaabb66022 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java
@@ -26,10 +26,12 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.graphics.PointF;
+
import android.testing.TestableLooper;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
import androidx.dynamicanimation.animation.DynamicAnimation;
import androidx.dynamicanimation.animation.FlingAnimation;
@@ -49,6 +51,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@@ -69,13 +72,17 @@ public class MenuAnimationControllerTest extends SysuiTestCase {
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock
+ private AccessibilityManager mAccessibilityManager;
+
@Before
public void setUp() throws Exception {
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext,
stubWindowManager);
final SecureSettings secureSettings = TestUtils.mockSecureSettings();
- final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, secureSettings);
+ final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager,
+ secureSettings);
mMenuView = spy(new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance,
secureSettings));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
index f4580c173579..400b3b388c31 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
@@ -159,7 +159,8 @@ public class MenuViewLayerTest extends SysuiTestCase {
new WindowMetrics(mDisplayBounds, fakeDisplayInsets(), /* density = */ 0.0f));
doReturn(mWindowMetrics).when(mStubWindowManager).getCurrentWindowMetrics();
- mMenuViewModel = new MenuViewModel(mSpyContext, mSecureSettings);
+ mMenuViewModel = new MenuViewModel(
+ mSpyContext, mStubAccessibilityManager, mSecureSettings);
MenuViewAppearance menuViewAppearance = new MenuViewAppearance(
mSpyContext, mStubWindowManager);
mMenuView = spy(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt
index 4da7b2ac3700..e035a02ecf00 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt
@@ -64,9 +64,11 @@ public class SeekBarViewModelTest : SysuiTestCase() {
override fun executeOnDiskIO(runnable: Runnable) {
runnable.run()
}
+
override fun postToMainThread(runnable: Runnable) {
runnable.run()
}
+
override fun isMainThread(): Boolean {
return true
}
@@ -805,4 +807,32 @@ public class SeekBarViewModelTest : SysuiTestCase() {
fakeExecutor.runAllReady()
verify(mockController).unregisterCallback(any())
}
+
+ @Test
+ fun positionUpdatedWhileStopped() {
+ // When playback is stopped at one position
+ val firstPosition = 200L
+ val state =
+ PlaybackState.Builder().run {
+ setState(PlaybackState.STATE_STOPPED, firstPosition, 1f)
+ build()
+ }
+ whenever(mockController.playbackState).thenReturn(state)
+ val captor = ArgumentCaptor.forClass(MediaController.Callback::class.java)
+ viewModel.updateController(mockController)
+ verify(mockController).registerCallback(captor.capture())
+ assertThat(viewModel.progress.value!!.elapsedTime).isEqualTo(firstPosition.toInt())
+
+ // And the state is updated with a new position
+ val secondPosition = 42L
+ val secondState =
+ PlaybackState.Builder().run {
+ setState(PlaybackState.STATE_STOPPED, secondPosition, 1f)
+ build()
+ }
+ captor.value.onPlaybackStateChanged(secondState)
+
+ // THEN then elapsed time should be updated
+ assertThat(viewModel.progress.value!!.elapsedTime).isEqualTo(secondPosition.toInt())
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
index d2317e4f533d..fc720b836f72 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
@@ -87,7 +87,7 @@ class DragAndDropTest : SysuiTestCase() {
}
composeRule.waitForIdle()
- listState.onStarted(TestEditTiles[0])
+ listState.onStarted(TestEditTiles[0], DragType.Add)
// Tile is being dragged, it should be replaced with a placeholder
composeRule.onNodeWithContentDescription("tileA").assertDoesNotExist()
@@ -113,8 +113,8 @@ class DragAndDropTest : SysuiTestCase() {
}
composeRule.waitForIdle()
- listState.onStarted(TestEditTiles[0])
- listState.onMoved(1, false)
+ listState.onStarted(TestEditTiles[0], DragType.Add)
+ listState.onTargeting(1, false)
listState.onDrop()
// Available tiles should re-appear
@@ -140,7 +140,7 @@ class DragAndDropTest : SysuiTestCase() {
}
composeRule.waitForIdle()
- listState.onStarted(TestEditTiles[0])
+ listState.onStarted(TestEditTiles[0], DragType.Add)
listState.movedOutOfBounds()
listState.onDrop()
@@ -165,11 +165,11 @@ class DragAndDropTest : SysuiTestCase() {
}
composeRule.waitForIdle()
- listState.onStarted(createEditTile("newTile"))
+ listState.onStarted(createEditTile("newTile"), DragType.Add)
// Insert after tileD, which is at index 4
// [ a ] [ b ] [ c ] [ empty ]
// [ tile d ] [ e ]
- listState.onMoved(4, insertAfter = true)
+ listState.onTargeting(4, insertAfter = true)
listState.onDrop()
// Available tiles should re-appear
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java
index 63e56eeb730f..8045a13ff9be 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutListSearchTest.java
@@ -26,7 +26,6 @@ import static org.mockito.Mockito.when;
import android.graphics.drawable.Icon;
import android.os.Handler;
-import android.platform.test.annotations.EnableFlags;
import android.view.KeyboardShortcutGroup;
import android.view.KeyboardShortcutInfo;
import android.view.WindowManager;
@@ -34,7 +33,6 @@ import android.view.WindowManager;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
-import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
import com.google.android.material.bottomsheet.BottomSheetDialog;
@@ -95,7 +93,6 @@ public class KeyboardShortcutListSearchTest extends SysuiTestCase {
}
@Test
- @EnableFlags(Flags.FLAG_VALIDATE_KEYBOARD_SHORTCUT_HELPER_ICON_URI)
public void requestAppKeyboardShortcuts_callback_sanitisesIcons() {
KeyboardShortcutGroup group = createKeyboardShortcutGroupForIconTests();
@@ -114,7 +111,6 @@ public class KeyboardShortcutListSearchTest extends SysuiTestCase {
}
@Test
- @EnableFlags(Flags.FLAG_VALIDATE_KEYBOARD_SHORTCUT_HELPER_ICON_URI)
public void requestImeKeyboardShortcuts_callback_sanitisesIcons() {
KeyboardShortcutGroup group = createKeyboardShortcutGroupForIconTests();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java
index 105cf168995c..20ecaf75c625 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsTest.java
@@ -31,7 +31,6 @@ import android.annotation.Nullable;
import android.app.Dialog;
import android.graphics.drawable.Icon;
import android.os.Handler;
-import android.platform.test.annotations.EnableFlags;
import android.view.KeyboardShortcutGroup;
import android.view.KeyboardShortcutInfo;
import android.view.WindowManager;
@@ -39,7 +38,6 @@ import android.view.WindowManager;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
-import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
@@ -131,7 +129,6 @@ public class KeyboardShortcutsTest extends SysuiTestCase {
}
@Test
- @EnableFlags(Flags.FLAG_VALIDATE_KEYBOARD_SHORTCUT_HELPER_ICON_URI)
public void requestAppKeyboardShortcuts_callback_sanitisesIcons() {
KeyboardShortcutGroup group = createKeyboardShortcutGroupForIconTests();
KeyboardShortcuts.toggle(mContext, DEVICE_ID);
@@ -143,7 +140,6 @@ public class KeyboardShortcutsTest extends SysuiTestCase {
}
@Test
- @EnableFlags(Flags.FLAG_VALIDATE_KEYBOARD_SHORTCUT_HELPER_ICON_URI)
public void requestImeKeyboardShortcuts_callback_sanitisesIcons() {
KeyboardShortcutGroup group = createKeyboardShortcutGroupForIconTests();
KeyboardShortcuts.toggle(mContext, DEVICE_ID);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 33a4b7ef3ed6..38ddb3e426fa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -45,8 +45,6 @@ import static org.mockito.Mockito.when;
import android.animation.Animator;
import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
import android.graphics.Color;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
@@ -154,7 +152,6 @@ public class ScrimControllerTest extends SysuiTestCase {
private final FakeKeyguardTransitionRepository mKeyguardTransitionRepository =
mKosmos.getKeyguardTransitionRepository();
@Mock private KeyguardInteractor mKeyguardInteractor;
- @Mock private TypedArray mMockTypedArray;
// TODO(b/204991468): Use a real PanelExpansionStateManager object once this bug is fixed. (The
// event-dispatch-on-registration pattern caused some of these unit tests to fail.)
@@ -236,12 +233,8 @@ public class ScrimControllerTest extends SysuiTestCase {
public void setup() {
MockitoAnnotations.initMocks(this);
mContext = spy(getContext());
- when(mContext.obtainStyledAttributes(
- new int[]{com.android.internal.R.attr.materialColorSurface}))
- .thenReturn(mMockTypedArray);
-
- when(mMockTypedArray.getColorStateList(anyInt()))
- .thenAnswer((invocation) -> ColorStateList.valueOf(mSurfaceColor));
+ when(mContext.getColor(com.android.internal.R.color.materialColorSurface))
+ .thenAnswer(invocation -> mSurfaceColor);
mScrimBehind = spy(new ScrimView(mContext));
mScrimInFront = new ScrimView(mContext);
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
index d71bc310b0ed..49957f0b43cc 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
@@ -18,6 +18,7 @@ package com.android.systemui.qs.composefragment.viewmodel
import android.content.res.mainResources
import androidx.lifecycle.LifecycleCoroutineScope
+import com.android.internal.logging.uiEventLoggerFake
import com.android.systemui.classifier.domain.interactor.falsingInteractor
import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
@@ -68,6 +69,7 @@ val Kosmos.qsFragmentComposeViewModelFactory by
qqsMediaHost,
qsMediaHost,
usingMediaInComposeFragment,
+ uiEventLoggerFake,
lifecycleScope,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt
index 86c3add09577..71408f6adffd 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelKosmos.kt
@@ -17,9 +17,11 @@
package com.android.systemui.qs.panels.ui.viewmodel
import android.content.applicationContext
+import com.android.internal.logging.uiEventLoggerFake
import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.qs.panels.domain.interactor.editTilesListInteractor
import com.android.systemui.qs.panels.domain.interactor.gridLayoutMap
import com.android.systemui.qs.panels.domain.interactor.gridLayoutTypeInteractor
@@ -35,10 +37,12 @@ val Kosmos.editModeViewModel by
currentTilesInteractor,
tilesAvailabilityInteractor,
minimumTilesInteractor,
+ uiEventLoggerFake,
configurationInteractor,
applicationContext,
infiniteGridLayout,
applicationCoroutineScope,
+ testDispatcher,
gridLayoutTypeInteractor,
gridLayoutMap,
)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt
index db4df38e038a..f2af619a4ad7 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt
@@ -17,25 +17,24 @@
package com.android.systemui.shade.domain.interactor
import android.content.mockedContext
-import android.view.mockWindowManager
+import android.window.WindowContext
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testScope
import com.android.systemui.scene.ui.view.mockShadeRootView
import com.android.systemui.shade.ShadeWindowLayoutParams
import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository
import java.util.Optional
+import org.mockito.kotlin.mock
-val Kosmos.shadeLayoutParams by Kosmos.Fixture {
- ShadeWindowLayoutParams.create(mockedContext)
-}
+val Kosmos.shadeLayoutParams by Kosmos.Fixture { ShadeWindowLayoutParams.create(mockedContext) }
+
+val Kosmos.mockedWindowContext by Kosmos.Fixture { mock<WindowContext>() }
val Kosmos.shadeDisplaysInteractor by
Kosmos.Fixture {
ShadeDisplaysInteractor(
Optional.of(mockShadeRootView),
fakeShadeDisplaysRepository,
- mockedContext,
- shadeLayoutParams,
- mockWindowManager,
+ mockedWindowContext,
testScope.backgroundScope,
testScope.backgroundScope.coroutineContext,
)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt
index 22f8767e1d55..3c2d004fcad7 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt
@@ -47,6 +47,7 @@ class FakeStatusBarModePerDisplayRepository : StatusBarModePerDisplayRepository
override val isInFullscreenMode = MutableStateFlow(false)
override val statusBarAppearance = MutableStateFlow<StatusBarAppearance?>(null)
override val statusBarMode = MutableStateFlow(StatusBarMode.TRANSPARENT)
+ override val ongoingProcessRequiresStatusBarVisible = MutableStateFlow(false)
override fun showTransient() {
isTransientShown.value = true
@@ -59,6 +60,9 @@ class FakeStatusBarModePerDisplayRepository : StatusBarModePerDisplayRepository
override fun start() {}
override fun stop() {}
+ override fun setOngoingProcessRequiresStatusBarVisible(requiredVisible: Boolean) {
+ ongoingProcessRequiresStatusBarVisible.value = requiredVisible
+ }
override fun onStatusBarViewInitialized(component: HomeStatusBarComponent) {}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt
index 51fb36fb2ead..9090e02b22b6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ongoingcall/domain/interactor/OngoingCallInteractorKosmos.kt
@@ -20,7 +20,9 @@ import com.android.systemui.activity.data.repository.activityManagerRepository
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.log.logcatLogBuffer
+import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository
import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
+import com.android.systemui.statusbar.window.fakeStatusBarWindowControllerStore
val Kosmos.ongoingCallInteractor: OngoingCallInteractor by
Kosmos.Fixture {
@@ -28,6 +30,8 @@ val Kosmos.ongoingCallInteractor: OngoingCallInteractor by
scope = applicationCoroutineScope,
activeNotificationsInteractor = activeNotificationsInteractor,
activityManagerRepository = activityManagerRepository,
+ statusBarModeRepositoryStore = fakeStatusBarModeRepository,
+ statusBarWindowControllerStore = fakeStatusBarWindowControllerStore,
logBuffer = logcatLogBuffer("OngoingCallInteractorKosmos"),
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt
index a110a49ccba8..09e6a0eaa301 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowController.kt
@@ -20,6 +20,7 @@ import android.view.View
import android.view.ViewGroup
import com.android.systemui.animation.ActivityTransitionAnimator
import com.android.systemui.fragments.FragmentHostManager
+import kotlinx.coroutines.flow.MutableStateFlow
import java.util.Optional
class FakeStatusBarWindowController : StatusBarWindowController {
@@ -30,6 +31,8 @@ class FakeStatusBarWindowController : StatusBarWindowController {
var isStopped = false
private set
+ val ongoingProcessRequiresStatusBarVisible = MutableStateFlow(false)
+
override val statusBarHeight: Int = 0
override fun refreshStatusBarHeight() {}
@@ -57,5 +60,7 @@ class FakeStatusBarWindowController : StatusBarWindowController {
override fun setForceStatusBarVisible(forceStatusBarVisible: Boolean) {}
- override fun setOngoingProcessRequiresStatusBarVisible(visible: Boolean) {}
+ override fun setOngoingProcessRequiresStatusBarVisible(visible: Boolean) {
+ ongoingProcessRequiresStatusBarVisible.value = visible
+ }
}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt
index 8bf3a43765ae..ae9b8c85910f 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt
@@ -17,6 +17,7 @@
package com.android.systemui.kairos
import com.android.systemui.kairos.util.These
+import com.android.systemui.kairos.util.WithPrev
import com.android.systemui.kairos.util.just
import com.android.systemui.kairos.util.none
import kotlinx.coroutines.flow.Flow
@@ -27,15 +28,18 @@ import kotlinx.coroutines.flow.conflate
* Returns a [TFlow] that emits the value sampled from the [Transactional] produced by each emission
* of the original [TFlow], within the same transaction of the original emission.
*/
+@ExperimentalFrpApi
fun <A> TFlow<Transactional<A>>.sampleTransactionals(): TFlow<A> = map { it.sample() }
/** @see FrpTransactionScope.sample */
+@ExperimentalFrpApi
fun <A, B, C> TFlow<A>.sample(
state: TState<B>,
transform: suspend FrpTransactionScope.(A, B) -> C,
): TFlow<C> = map { transform(it, state.sample()) }
/** @see FrpTransactionScope.sample */
+@ExperimentalFrpApi
fun <A, B, C> TFlow<A>.sample(
transactional: Transactional<B>,
transform: suspend FrpTransactionScope.(A, B) -> C,
@@ -50,6 +54,7 @@ fun <A, B, C> TFlow<A>.sample(
*
* @see sample
*/
+@ExperimentalFrpApi
fun <A, B, C> TFlow<A>.samplePromptly(
state: TState<B>,
transform: suspend FrpTransactionScope.(A, B) -> C,
@@ -70,19 +75,10 @@ fun <A, B, C> TFlow<A>.samplePromptly(
}
/**
- * Returns a [TState] containing a map with a snapshot of the current state of each [TState] in the
- * original map.
- */
-fun <K, A> Map<K, TState<A>>.combineValues(): TState<Map<K, A>> =
- asIterable()
- .map { (k, state) -> state.map { v -> k to v } }
- .combine()
- .map { entries -> entries.toMap() }
-
-/**
* Returns a cold [Flow] that, when collected, emits from this [TFlow]. [network] is needed to
* transactionally connect to / disconnect from the [TFlow] when collection starts/stops.
*/
+@ExperimentalFrpApi
fun <A> TFlow<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate()
@@ -90,6 +86,7 @@ fun <A> TFlow<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
* Returns a cold [Flow] that, when collected, emits from this [TState]. [network] is needed to
* transactionally connect to / disconnect from the [TState] when collection starts/stops.
*/
+@ExperimentalFrpApi
fun <A> TState<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate()
@@ -99,6 +96,7 @@ fun <A> TState<A>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
*
* When collection is cancelled, so is the [FrpSpec]. This means all ongoing work is cleaned up.
*/
+@ExperimentalFrpApi
@JvmName("flowSpecToColdConflatedFlow")
fun <A> FrpSpec<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate()
@@ -109,6 +107,7 @@ fun <A> FrpSpec<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
*
* When collection is cancelled, so is the [FrpSpec]. This means all ongoing work is cleaned up.
*/
+@ExperimentalFrpApi
@JvmName("stateSpecToColdConflatedFlow")
fun <A> FrpSpec<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate()
@@ -117,6 +116,7 @@ fun <A> FrpSpec<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
* Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
* this [network], and then emits from the returned [TFlow].
*/
+@ExperimentalFrpApi
@JvmName("transactionalFlowToColdConflatedFlow")
fun <A> Transactional<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate()
@@ -125,6 +125,7 @@ fun <A> Transactional<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A
* Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
* this [network], and then emits from the returned [TState].
*/
+@ExperimentalFrpApi
@JvmName("transactionalStateToColdConflatedFlow")
fun <A> Transactional<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate()
@@ -135,6 +136,7 @@ fun <A> Transactional<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<
*
* When collection is cancelled, so is the [FrpStateful]. This means all ongoing work is cleaned up.
*/
+@ExperimentalFrpApi
@JvmName("statefulFlowToColdConflatedFlow")
fun <A> FrpStateful<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate()
@@ -145,11 +147,13 @@ fun <A> FrpStateful<TFlow<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A>
*
* When collection is cancelled, so is the [FrpStateful]. This means all ongoing work is cleaned up.
*/
+@ExperimentalFrpApi
@JvmName("statefulStateToColdConflatedFlow")
fun <A> FrpStateful<TState<A>>.toColdConflatedFlow(network: FrpNetwork): Flow<A> =
channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate()
/** Return a [TFlow] that emits from the original [TFlow] only when [state] is `true`. */
+@ExperimentalFrpApi
fun <A> TFlow<A>.filter(state: TState<Boolean>): TFlow<A> = filter { state.sample() }
private fun Iterable<Boolean>.allTrue() = all { it }
@@ -157,13 +161,15 @@ private fun Iterable<Boolean>.allTrue() = all { it }
private fun Iterable<Boolean>.anyTrue() = any { it }
/** Returns a [TState] that is `true` only when all of [states] are `true`. */
+@ExperimentalFrpApi
fun allOf(vararg states: TState<Boolean>): TState<Boolean> = combine(*states) { it.allTrue() }
/** Returns a [TState] that is `true` when any of [states] are `true`. */
+@ExperimentalFrpApi
fun anyOf(vararg states: TState<Boolean>): TState<Boolean> = combine(*states) { it.anyTrue() }
/** Returns a [TState] containing the inverse of the Boolean held by the original [TState]. */
-fun not(state: TState<Boolean>): TState<Boolean> = state.mapCheapUnsafe { !it }
+@ExperimentalFrpApi fun not(state: TState<Boolean>): TState<Boolean> = state.mapCheapUnsafe { !it }
/**
* Represents a modal FRP sub-network.
@@ -177,6 +183,7 @@ fun not(state: TState<Boolean>): TState<Boolean> = state.mapCheapUnsafe { !it }
*
* @see FrpStatefulMode
*/
+@ExperimentalFrpApi
fun interface FrpBuildMode<out A> {
/**
* Invoked when this mode is enabled. Returns a value and a [TFlow] that signals a switch to a
@@ -192,6 +199,7 @@ fun interface FrpBuildMode<out A> {
*
* @see FrpBuildMode
*/
+@ExperimentalFrpApi
val <A> FrpBuildMode<A>.compiledFrpSpec: FrpSpec<TState<A>>
get() = frpSpec {
var modeChangeEvents by TFlowLoop<FrpBuildMode<A>>()
@@ -215,6 +223,7 @@ val <A> FrpBuildMode<A>.compiledFrpSpec: FrpSpec<TState<A>>
*
* @see FrpBuildMode
*/
+@ExperimentalFrpApi
fun interface FrpStatefulMode<out A> {
/**
* Invoked when this mode is enabled. Returns a value and a [TFlow] that signals a switch to a
@@ -230,6 +239,7 @@ fun interface FrpStatefulMode<out A> {
*
* @see FrpBuildMode
*/
+@ExperimentalFrpApi
val <A> FrpStatefulMode<A>.compiledStateful: FrpStateful<TState<A>>
get() = statefully {
var modeChangeEvents by TFlowLoop<FrpStatefulMode<A>>()
@@ -246,5 +256,18 @@ val <A> FrpStatefulMode<A>.compiledStateful: FrpStateful<TState<A>>
* Runs [spec] in this [FrpBuildScope], and then re-runs it whenever [rebuildSignal] emits. Returns
* a [TState] that holds the result of the currently-active [FrpSpec].
*/
+@ExperimentalFrpApi
fun <A> FrpBuildScope.rebuildOn(rebuildSignal: TFlow<*>, spec: FrpSpec<A>): TState<A> =
rebuildSignal.map { spec }.holdLatestSpec(spec)
+
+/**
+ * Like [stateChanges] but also includes the old value of this [TState].
+ *
+ * Shorthand for:
+ * ``` kotlin
+ * stateChanges.map { WithPrev(previousValue = sample(), newValue = it) }
+ * ```
+ */
+@ExperimentalFrpApi
+val <A> TState<A>.transitions: TFlow<WithPrev<A, A>>
+ get() = stateChanges.map { WithPrev(previousValue = sample(), newValue = it) }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt
index 4de6deb3dc53..209a402bd629 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpBuildScope.kt
@@ -38,6 +38,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.dropWhile
+import kotlinx.coroutines.flow.scan
import kotlinx.coroutines.launch
/** A function that modifies the FrpNetwork. */
@@ -596,6 +597,26 @@ interface FrpBuildScope : FrpStateScope {
fun <A> Flow<A>.toTState(initialValue: A): TState<A> = toTFlow().hold(initialValue)
/**
+ * Shorthand for:
+ * ```kotlin
+ * flow.scan(initialValue, operation).toTFlow().hold(initialValue)
+ * ```
+ */
+ @ExperimentalFrpApi
+ fun <A, B> Flow<A>.scanToTState(initialValue: B, operation: (B, A) -> B): TState<B> =
+ scan(initialValue, operation).toTFlow().hold(initialValue)
+
+ /**
+ * Shorthand for:
+ * ```kotlin
+ * flow.scan(initialValue) { a, f -> f(a) }.toTFlow().hold(initialValue)
+ * ```
+ */
+ @ExperimentalFrpApi
+ fun <A> Flow<(A) -> A>.scanToTState(initialValue: A): TState<A> =
+ scanToTState(initialValue) { a, f -> f(a) }
+
+ /**
* Invokes [block] whenever this [TFlow] emits a value. [block] receives an [FrpBuildScope] that
* can be used to make further modifications to the FRP network, and/or perform side-effects via
* [effect].
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt
index be2eb4312476..b39dcc131b1d 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpEffectScope.kt
@@ -22,16 +22,17 @@ import kotlinx.coroutines.CoroutineScope
/**
* Scope for external side-effects triggered by the Frp network. This still occurs within the
* context of a transaction, so general suspending calls are disallowed to prevent blocking the
- * transaction. You can use [frpCoroutineScope] to [launch] new coroutines to perform long-running
- * asynchronous work. This scope is alive for the duration of the containing [FrpBuildScope] that
- * this side-effect scope is running in.
+ * transaction. You can use [frpCoroutineScope] to [launch][kotlinx.coroutines.launch] new
+ * coroutines to perform long-running asynchronous work. This scope is alive for the duration of the
+ * containing [FrpBuildScope] that this side-effect scope is running in.
*/
@RestrictsSuspension
@ExperimentalFrpApi
interface FrpEffectScope : FrpTransactionScope {
/**
* A [CoroutineScope] whose lifecycle lives for as long as this [FrpEffectScope] is alive. This
- * is generally until the [Job] returned by [FrpBuildScope.effect] is cancelled.
+ * is generally until the [Job][kotlinx.coroutines.Job] returned by [FrpBuildScope.effect] is
+ * cancelled.
*/
@ExperimentalFrpApi val frpCoroutineScope: CoroutineScope
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt
index b688eafe12e9..97252b4a199a 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/FrpNetwork.kt
@@ -137,7 +137,7 @@ internal class LocalFrpNetwork(
override suspend fun <R> transact(block: suspend FrpTransactionScope.() -> R): R {
val result = CompletableDeferred<R>(coroutineContext[Job])
@Suppress("DeferredResultUnused")
- network.transaction {
+ network.transaction("FrpNetwork.transact") {
val buildScope =
BuildScopeImpl(
stateScope = StateScopeImpl(evalScope = this, endSignal = endSignal),
@@ -151,7 +151,7 @@ internal class LocalFrpNetwork(
override suspend fun activateSpec(spec: FrpSpec<*>) {
val job =
network
- .transaction {
+ .transaction("FrpNetwork.activateSpec") {
val buildScope =
BuildScopeImpl(
stateScope = StateScopeImpl(evalScope = this, endSignal = endSignal),
@@ -166,7 +166,8 @@ internal class LocalFrpNetwork(
override fun <In, Out> coalescingMutableTFlow(
coalesce: (old: Out, new: In) -> Out,
getInitialValue: () -> Out,
- ): CoalescingMutableTFlow<In, Out> = CoalescingMutableTFlow(coalesce, network, getInitialValue)
+ ): CoalescingMutableTFlow<In, Out> =
+ CoalescingMutableTFlow(null, coalesce, network, getInitialValue)
override fun <T> mutableTFlow(): MutableTFlow<T> = MutableTFlow(network)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt
index 7ba1aca31eae..a175e2e20e46 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TFlow.kt
@@ -467,12 +467,12 @@ fun <A> TState<TFlow<A>>.switchPromptly(): TFlow<A> {
@ExperimentalFrpApi
class CoalescingMutableTFlow<In, Out>
internal constructor(
+ internal val name: String?,
internal val coalesce: (old: Out, new: In) -> Out,
internal val network: Network,
private val getInitialValue: () -> Out,
internal val impl: InputNode<Out> = InputNode(),
) : TFlow<Out>() {
- internal val name: String? = null
internal val storage = AtomicReference(false to getInitialValue())
override fun toString(): String = "${this::class.simpleName}@$hashString"
@@ -490,7 +490,7 @@ internal constructor(
val (scheduled, _) = storage.getAndUpdate { (_, old) -> true to coalesce(old, value) }
if (!scheduled) {
@Suppress("DeferredResultUnused")
- network.transaction {
+ network.transaction("CoalescingMutableTFlow${name?.let { "($name)" }.orEmpty()}.emit") {
impl.visit(this, storage.getAndSet(false to getInitialValue()).second)
}
}
@@ -520,16 +520,16 @@ internal constructor(internal val network: Network, internal val impl: InputNode
@ExperimentalFrpApi
suspend fun emit(value: T) {
coroutineScope {
+ var jobOrNull: Job? = null
val newEmit =
async(start = CoroutineStart.LAZY) {
- network.transaction { impl.visit(this, value) }.await()
+ jobOrNull?.join()
+ network
+ .transaction("MutableTFlow($name).emit") { impl.visit(this, value) }
+ .await()
}
- val jobOrNull = storage.getAndSet(newEmit)
- if (jobOrNull?.isActive != true) {
- newEmit.await()
- } else {
- jobOrNull.join()
- }
+ jobOrNull = storage.getAndSet(newEmit)
+ newEmit.await()
}
}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt
index a4c695657f8d..80e74748a375 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TState.kt
@@ -121,7 +121,7 @@ fun <A, B, C> TState<A>.combineWith(
/**
* Splits a [TState] of pairs into a pair of [TFlows][TState], where each returned [TState] holds
- * hald of the original.
+ * half of the original.
*
* Shorthand for:
* ```kotlin
@@ -312,6 +312,57 @@ fun <A, B, C, D, Z> combine(
)
}
+/**
+ * Returns a [TState] whose value is generated with [transform] by combining the current values of
+ * each given [TState].
+ *
+ * @see TState.combineWith
+ */
+@ExperimentalFrpApi
+fun <A, B, C, D, E, Z> combine(
+ stateA: TState<A>,
+ stateB: TState<B>,
+ stateC: TState<C>,
+ stateD: TState<D>,
+ stateE: TState<E>,
+ transform: suspend FrpScope.(A, B, C, D, E) -> Z,
+): TState<Z> {
+ val operatorName = "combine"
+ val name = operatorName
+ return TStateInit(
+ init(name) {
+ coroutineScope {
+ val dl1: Deferred<TStateImpl<A>> = async {
+ stateA.init.connect(evalScope = this@init)
+ }
+ val dl2: Deferred<TStateImpl<B>> = async {
+ stateB.init.connect(evalScope = this@init)
+ }
+ val dl3: Deferred<TStateImpl<C>> = async {
+ stateC.init.connect(evalScope = this@init)
+ }
+ val dl4: Deferred<TStateImpl<D>> = async {
+ stateD.init.connect(evalScope = this@init)
+ }
+ val dl5: Deferred<TStateImpl<E>> = async {
+ stateE.init.connect(evalScope = this@init)
+ }
+ zipStates(
+ name,
+ operatorName,
+ dl1.await(),
+ dl2.await(),
+ dl3.await(),
+ dl4.await(),
+ dl5.await(),
+ ) { a, b, c, d, e ->
+ NoScope.runInFrpScope { transform(a, b, c, d, e) }
+ }
+ }
+ }
+ )
+}
+
/** Returns a [TState] by applying [transform] to the value held by the original [TState]. */
@ExperimentalFrpApi
fun <A, B> TState<A>.flatMap(transform: suspend FrpScope.(A) -> TState<B>): TState<B> {
@@ -367,7 +418,7 @@ fun <A> TState<A>.selector(numDistinctValues: Int? = null): TStateSelector<A> =
* @see selector
*/
@ExperimentalFrpApi
-class TStateSelector<A>
+class TStateSelector<in A>
internal constructor(
private val upstream: TState<A>,
private val groupedChanges: GroupedTFlow<A, Boolean>,
@@ -406,6 +457,7 @@ internal constructor(internal val network: Network, initialValue: Deferred<T>) :
private val input: CoalescingMutableTFlow<Deferred<T>, Deferred<T>?> =
CoalescingMutableTFlow(
+ name = null,
coalesce = { _, new -> new },
network = network,
getInitialValue = { null },
@@ -423,7 +475,7 @@ internal constructor(internal val network: Network, initialValue: Deferred<T>) :
.cached()
state = TStateSource(name, operatorName, initialValue, calm)
@Suppress("DeferredResultUnused")
- network.transaction {
+ network.transaction("MutableTState.init") {
calm.activate(evalScope = this, downstream = Schedulable.S(state))?.let {
(connection, needsEval) ->
state.upstreamConnection = connection
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt
index 4f302a14ff00..0674a2e75659 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/debug/Debug.kt
@@ -31,6 +31,8 @@ import com.android.systemui.kairos.internal.TStateSource
import com.android.systemui.kairos.util.Just
import com.android.systemui.kairos.util.Maybe
import com.android.systemui.kairos.util.None
+import com.android.systemui.kairos.util.flatMap
+import com.android.systemui.kairos.util.map
import com.android.systemui.kairos.util.none
import com.android.systemui.kairos.util.orElseGet
@@ -178,3 +180,24 @@ private fun <A> TStateImpl<A>.getUnsafe(): Maybe<A> =
is TStateSource -> getStorageUnsafe()
is DerivedMapCheap<*, *> -> none
}
+
+private fun <A> TStateImpl<A>.getUnsafeWithEpoch(): Maybe<Pair<A, Long>> =
+ when (this) {
+ is TStateDerived -> getCachedUnsafe().map { it to invalidatedEpoch }
+ is TStateSource -> getStorageUnsafe().map { it to writeEpoch }
+ is DerivedMapCheap<*, *> -> none
+ }
+
+/**
+ * Returns the current value held in this [TState], or [none] if the [TState] has not been
+ * initialized.
+ *
+ * The returned [Long] is the *epoch* at which the internal cache was last updated. This can be used
+ * to identify values which are out-of-date.
+ */
+fun <A> TState<A>.sampleUnsafe(): Maybe<Pair<A, Long>> =
+ when (this) {
+ is MutableTState -> tState.init.getUnsafe().flatMap { it.getUnsafeWithEpoch() }
+ is TStateInit -> init.getUnsafe().flatMap { it.getUnsafeWithEpoch() }
+ is TStateLoop -> this.init.getUnsafe().flatMap { it.getUnsafeWithEpoch() }
+ }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt
index 90f1aea3e42f..7e6384925f38 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt
@@ -34,9 +34,9 @@ import com.android.systemui.kairos.TFlowInit
import com.android.systemui.kairos.groupByKey
import com.android.systemui.kairos.init
import com.android.systemui.kairos.internal.util.childScope
-import com.android.systemui.kairos.internal.util.launchOnCancel
import com.android.systemui.kairos.internal.util.mapValuesParallel
import com.android.systemui.kairos.launchEffect
+import com.android.systemui.kairos.mergeLeft
import com.android.systemui.kairos.util.Just
import com.android.systemui.kairos.util.Maybe
import com.android.systemui.kairos.util.None
@@ -49,7 +49,6 @@ import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CompletableJob
-import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Job
@@ -86,8 +85,7 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
builder: suspend S.() -> Unit,
): TFlow<A> {
var job: Job? = null
- val stopEmitter = newStopEmitter()
- val handle = this.job.invokeOnCompletion { stopEmitter.emit(Unit) }
+ val stopEmitter = newStopEmitter("buildTFlow")
// Create a child scope that will be kept alive beyond the end of this transaction.
val childScope = coroutineScope.childScope()
lateinit var emitter: Pair<T, S>
@@ -99,7 +97,6 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
reenterBuildScope(this@BuildScopeImpl, childScope).runInBuildScope {
launchEffect {
builder(emitter.second)
- handle.dispose()
stopEmitter.emit(Unit)
}
}
@@ -110,7 +107,7 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
},
)
emitter = constructFlow(inputNode)
- return with(frpScope) { emitter.first.takeUntil(stopEmitter) }
+ return with(frpScope) { emitter.first.takeUntil(mergeLeft(stopEmitter, endSignal)) }
}
private fun <T> tFlowInternal(builder: suspend FrpProducerScope<T>.() -> Unit): TFlow<T> =
@@ -134,7 +131,8 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
): TFlow<Out> =
buildTFlow(
constructFlow = { inputNode ->
- val flow = CoalescingMutableTFlow(coalesce, network, getInitialValue, inputNode)
+ val flow =
+ CoalescingMutableTFlow(null, coalesce, network, getInitialValue, inputNode)
flow to
object : FrpCoalescingProducerScope<In> {
override fun emit(value: In) {
@@ -164,11 +162,13 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
val subRef = AtomicReference<Maybe<Output<A>>>(null)
val childScope = coroutineScope.childScope()
// When our scope is cancelled, deactivate this observer.
- childScope.launchOnCancel(CoroutineName("TFlow.observeEffect")) {
+ childScope.coroutineContext.job.invokeOnCompletion {
subRef.getAndSet(None)?.let { output ->
if (output is Just) {
@Suppress("DeferredResultUnused")
- network.transaction { scheduleDeactivation(output.value) }
+ network.transaction("observeEffect cancelled") {
+ scheduleDeactivation(output.value)
+ }
}
}
}
@@ -215,7 +215,7 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
} else if (needsEval) {
outputNode.schedule(evalScope = stateScope.evalScope)
}
- } ?: childScope.cancel()
+ } ?: run { childScope.cancel() }
}
return childScope.coroutineContext.job
}
@@ -229,10 +229,7 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
"mapBuild",
mapImpl({ init.connect(evalScope = this) }) { spec ->
reenterBuildScope(outerScope = this@BuildScopeImpl, childScope)
- .runInBuildScope {
- val (result, _) = asyncScope { transform(spec) }
- result.get()
- }
+ .runInBuildScope { transform(spec) }
}
.cached(),
)
@@ -272,8 +269,9 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
return changes to FrpDeferredValue(initOut)
}
- private fun newStopEmitter(): CoalescingMutableTFlow<Unit, Unit> =
+ private fun newStopEmitter(name: String): CoalescingMutableTFlow<Unit, Unit> =
CoalescingMutableTFlow(
+ name = name,
coalesce = { _, _: Unit -> },
network = network,
getInitialValue = {},
@@ -299,17 +297,19 @@ internal class BuildScopeImpl(val stateScope: StateScopeImpl, val coroutineScope
}
private fun mutableChildBuildScope(): BuildScopeImpl {
- val stopEmitter = newStopEmitter()
+ val stopEmitter = newStopEmitter("mutableChildBuildScope")
val childScope = coroutineScope.childScope()
childScope.coroutineContext.job.invokeOnCompletion { stopEmitter.emit(Unit) }
// Ensure that once this transaction is done, the new child scope enters the completing
// state (kept alive so long as there are child jobs).
- scheduleOutput(
- OneShot {
- // TODO: don't like this cast
- (childScope.coroutineContext.job as CompletableJob).complete()
- }
- )
+ // TODO: need to keep the scope alive if it's used to accumulate state.
+ // Otherwise, stopEmitter will emit early, due to the call to complete().
+ // scheduleOutput(
+ // OneShot {
+ // // TODO: don't like this cast
+ // (childScope.coroutineContext.job as CompletableJob).complete()
+ // }
+ // )
return BuildScopeImpl(
stateScope = StateScopeImpl(evalScope = stateScope.evalScope, endSignal = stopEmitter),
coroutineScope = childScope,
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt
index 3aec319881d0..04ce5b6d8785 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Graph.kt
@@ -86,7 +86,7 @@ internal class DepthTracker {
@Volatile private var dirty_depthIsDirect = true
@Volatile private var dirty_isIndirectRoot = false
- suspend fun schedule(scheduler: Scheduler, node: MuxNode<*, *, *>) {
+ fun schedule(scheduler: Scheduler, node: MuxNode<*, *, *>) {
if (dirty_depthIsDirect) {
scheduler.schedule(dirty_directDepth, node)
} else {
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt
index af864e6c3496..69994ba6e866 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/InternalScopes.kt
@@ -66,8 +66,6 @@ internal interface NetworkScope : InitScope {
fun schedule(state: TStateSource<*>)
- suspend fun schedule(node: MuxNode<*, *, *>)
-
fun scheduleDeactivation(node: PushNode<*>)
fun scheduleDeactivation(output: Output<*>)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt
index f7ff15f0507b..af68a1e3d83c 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Mux.kt
@@ -188,6 +188,14 @@ internal sealed class MuxNode<K : Any, V, Output>(val lifecycle: MuxLifecycle<Ou
}
abstract fun hasCurrentValueLocked(transactionStore: TransactionStore): Boolean
+
+ fun schedule(evalScope: EvalScope) {
+ // TODO: Potential optimization
+ // Detect if this node is guaranteed to have a single upstream within this transaction,
+ // then bypass scheduling it. Instead immediately schedule its downstream and treat this
+ // MuxNode as a Pull (effectively making it a mapCheap).
+ depthTracker.schedule(evalScope.scheduler, this)
+ }
}
/** An input branch of a mux node, associated with a key. */
@@ -202,7 +210,7 @@ internal class MuxBranchNode<K : Any, V>(private val muxNode: MuxNode<K, V, *>,
val upstreamResult = upstream.getPushEvent(evalScope)
if (upstreamResult is Just) {
muxNode.upstreamData[key] = upstreamResult.value
- evalScope.schedule(muxNode)
+ muxNode.schedule(evalScope)
}
}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt
index 08bee855831a..3b9502a5d812 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt
@@ -409,7 +409,7 @@ internal fun <K : Any, A> switchDeferredImpl(
// Schedule for evaluation if any switched-in nodes have already emitted within
// this transaction.
if (muxNode.upstreamData.isNotEmpty()) {
- evalScope.schedule(muxNode)
+ muxNode.schedule(evalScope)
}
return muxNode.takeUnless { muxNode.switchedIn.isEmpty() && !isIndirect }
}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt
index cdfafa943121..b291c879b449 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt
@@ -75,7 +75,7 @@ internal class MuxPromptMovingNode<K : Any, V>(
if (depthTracker.dirty_depthIncreased()) {
depthTracker.schedule(evalScope.compactor, node = this)
}
- evalScope.schedule(this)
+ schedule(evalScope)
} else {
val compactDownstream = depthTracker.isDirty()
if (evalResult != null || compactDownstream) {
@@ -291,7 +291,7 @@ internal class MuxPromptPatchNode<K : Any, V>(private val muxNode: MuxPromptMovi
val upstreamResult = upstream.getPushEvent(evalScope)
if (upstreamResult is Just) {
muxNode.patchData = upstreamResult.value
- evalScope.schedule(muxNode)
+ muxNode.schedule(evalScope)
}
}
@@ -451,7 +451,7 @@ internal fun <K : Any, A> switchPromptImpl(
// Schedule for evaluation if any switched-in nodes or the patches node have
// already emitted within this transaction.
if (movingNode.patchData != null || movingNode.upstreamData.isNotEmpty()) {
- evalScope.schedule(movingNode)
+ movingNode.schedule(evalScope)
}
return movingNode.takeUnless { it.patches == null && it.switchedIn.isEmpty() }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt
index f0df89d780c9..599b18695034 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt
@@ -81,11 +81,6 @@ internal class Network(val coroutineScope: CoroutineScope) : NetworkScope {
stateWrites.add(state)
}
- // TODO: weird that we have this *and* scheduler exposed
- override suspend fun schedule(node: MuxNode<*, *, *>) {
- scheduler.schedule(node.depthTracker.dirty_directDepth, node)
- }
-
override fun scheduleDeactivation(node: PushNode<*>) {
deactivations.add(node)
}
@@ -95,9 +90,7 @@ internal class Network(val coroutineScope: CoroutineScope) : NetworkScope {
}
/** Listens for external events and starts FRP transactions. Runs forever. */
- suspend fun runInputScheduler() = coroutineScope {
- launch { scheduler.activate() }
- launch { compactor.activate() }
+ suspend fun runInputScheduler() {
val actions = mutableListOf<ScheduledAction<*>>()
for (first in inputScheduleChan) {
// Drain and conflate all transaction requests into a single transaction
@@ -125,12 +118,12 @@ internal class Network(val coroutineScope: CoroutineScope) : NetworkScope {
}
/** Evaluates [block] inside of a new transaction when the network is ready. */
- fun <R> transaction(block: suspend EvalScope.() -> R): Deferred<R> =
+ fun <R> transaction(reason: String, block: suspend EvalScope.() -> R): Deferred<R> =
CompletableDeferred<R>(parent = coroutineScope.coroutineContext.job).also { onResult ->
val job =
coroutineScope.launch {
inputScheduleChan.send(
- ScheduledAction(onStartTransaction = block, onResult = onResult)
+ ScheduledAction(reason, onStartTransaction = block, onResult = onResult)
)
}
onResult.invokeOnCompletion { job.cancel() }
@@ -229,6 +222,7 @@ internal class Network(val coroutineScope: CoroutineScope) : NetworkScope {
}
internal class ScheduledAction<T>(
+ val reason: String,
private val onResult: CompletableDeferred<T>? = null,
private val onStartTransaction: suspend EvalScope.() -> T,
) {
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt
index 872fb7a6cb74..c12ef6ae6a5d 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Scheduler.kt
@@ -21,44 +21,34 @@ package com.android.systemui.kairos.internal
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.PriorityBlockingQueue
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
internal interface Scheduler {
- suspend fun schedule(depth: Int, node: MuxNode<*, *, *>)
+ fun schedule(depth: Int, node: MuxNode<*, *, *>)
- suspend fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>)
+ fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>)
}
internal class SchedulerImpl : Scheduler {
val enqueued = ConcurrentHashMap<MuxNode<*, *, *>, Any>()
val scheduledQ = PriorityBlockingQueue<Pair<Int, MuxNode<*, *, *>>>(16, compareBy { it.first })
- val chan = Channel<Pair<Int, MuxNode<*, *, *>>>(Channel.UNLIMITED)
- override suspend fun schedule(depth: Int, node: MuxNode<*, *, *>) {
+ override fun schedule(depth: Int, node: MuxNode<*, *, *>) {
if (enqueued.putIfAbsent(node, node) == null) {
- chan.send(Pair(depth, node))
+ scheduledQ.add(Pair(depth, node))
}
}
- override suspend fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>) {
+ override fun scheduleIndirect(indirectDepth: Int, node: MuxNode<*, *, *>) {
schedule(Int.MIN_VALUE + indirectDepth, node)
}
- suspend fun activate() {
- for (nodeSchedule in chan) {
- scheduledQ.add(nodeSchedule)
- drainChan()
- }
- }
-
internal suspend fun drainEval(network: Network) {
drain { runStep ->
runStep { muxNode -> network.evalScope { muxNode.visit(this) } }
// If any visited MuxPromptNodes had their depths increased, eagerly propagate those
- // depth
- // changes now before performing further network evaluation.
+ // depth changes now before performing further network evaluation.
network.compactor.drainCompact()
}
}
@@ -71,19 +61,12 @@ internal class SchedulerImpl : Scheduler {
crossinline onStep:
suspend (runStep: suspend (visit: suspend (MuxNode<*, *, *>) -> Unit) -> Unit) -> Unit
): Unit = coroutineScope {
- while (!chan.isEmpty || scheduledQ.isNotEmpty()) {
- drainChan()
+ while (scheduledQ.isNotEmpty()) {
val maxDepth = scheduledQ.peek()?.first ?: error("Unexpected empty scheduler")
onStep { visit -> runStep(maxDepth, visit) }
}
}
- private suspend fun drainChan() {
- while (!chan.isEmpty) {
- scheduledQ.add(chan.receive())
- }
- }
-
private suspend inline fun runStep(
maxDepth: Int,
crossinline visit: suspend (MuxNode<*, *, *>) -> Unit,
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt
index 5cec05c8ef2d..c68b4c366776 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/TStateImpl.kt
@@ -314,6 +314,28 @@ internal fun <A, B, C, D, Z> zipStates(
@Suppress("UNCHECKED_CAST") transform(a as A, b as B, c as C, d as D)
}
+internal fun <A, B, C, D, E, Z> zipStates(
+ name: String?,
+ operatorName: String,
+ l1: TStateImpl<A>,
+ l2: TStateImpl<B>,
+ l3: TStateImpl<C>,
+ l4: TStateImpl<D>,
+ l5: TStateImpl<E>,
+ transform: suspend EvalScope.(A, B, C, D, E) -> Z,
+): TStateImpl<Z> =
+ zipStates(null, operatorName, mapOf(0 to l1, 1 to l2, 2 to l3, 3 to l4, 4 to l5)).map(
+ name,
+ operatorName,
+ ) {
+ val a = it.getValue(0)
+ val b = it.getValue(1)
+ val c = it.getValue(2)
+ val d = it.getValue(3)
+ val e = it.getValue(4)
+ @Suppress("UNCHECKED_CAST") transform(a as A, b as B, c as C, d as D, e as E)
+ }
+
internal fun <K : Any, A> zipStates(
name: String?,
operatorName: String,
diff --git a/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt
index 165230b2aeaf..688adae8fcae 100644
--- a/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt
+++ b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt
@@ -1170,12 +1170,12 @@ class KairosTests {
mergeIncrementally
.onEach { println("patch: $it") }
.foldMapIncrementally()
- .flatMap { it.combineValues() }
+ .flatMap { it.combine() }
}
}
}
.foldMapIncrementally()
- .flatMap { it.combineValues() }
+ .flatMap { it.combine() }
accState.toStateFlow()
}
@@ -1300,6 +1300,26 @@ class KairosTests {
}
@Test
+ fun buildScope_stateAccumulation() = runFrpTest { network ->
+ val input = network.mutableTFlow<Unit>()
+ var observedCount: Int? = null
+ activateSpec(network) {
+ val (c, j) = asyncScope { input.fold(0) { _, x -> x + 1 } }
+ deferredBuildScopeAction { c.get().observe { observedCount = it } }
+ }
+ runCurrent()
+ assertEquals(0, observedCount)
+
+ input.emit(Unit)
+ runCurrent()
+ assertEquals(1, observedCount)
+
+ input.emit(Unit)
+ runCurrent()
+ assertEquals(2, observedCount)
+ }
+
+ @Test
fun effect() = runFrpTest { network ->
val input = network.mutableTFlow<Unit>()
var effectRunning = false
diff --git a/services/appfunctions/Android.bp b/services/appfunctions/Android.bp
index eb6e46861898..7337aa26c145 100644
--- a/services/appfunctions/Android.bp
+++ b/services/appfunctions/Android.bp
@@ -19,6 +19,7 @@ java_library_static {
defaults: ["platform_service_defaults"],
srcs: [
":services.appfunctions-sources",
+ ":statslog-appfunctions-java-gen",
"java/**/*.logtags",
],
libs: ["services.core"],
@@ -26,3 +27,10 @@ java_library_static {
baseline_filename: "lint-baseline.xml",
},
}
+
+genrule {
+ name: "statslog-appfunctions-java-gen",
+ tools: ["stats-log-api-gen"],
+ cmd: "$(location stats-log-api-gen) --java $(out) --module appfunctions --javaPackage com.android.server.appfunctions --javaClass AppFunctionsStatsLog --minApiLevel 35",
+ out: ["java/com/android/server/appfunctions/AppFunctionsStatsLog.java"],
+}
diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java
index 81e83b563945..eaea4435099c 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java
@@ -16,6 +16,8 @@
package com.android.server.appfunctions;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -35,6 +37,11 @@ public final class AppFunctionExecutors {
/* workQueue= */ new LinkedBlockingQueue<>(),
new NamedThreadFactory("AppFunctionExecutors"));
+ /** Executor for stats logging. */
+ public static final ExecutorService LOGGING_THREAD_EXECUTOR =
+ Executors.newSingleThreadExecutor(
+ new NamedThreadFactory("AppFunctionsLoggingExecutors"));
+
static {
THREAD_POOL_EXECUTOR.allowCoreThreadTimeOut(true);
}
diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
index c17c34061d1b..9cc5a8c97258 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java
@@ -30,6 +30,7 @@ import android.app.appfunctions.AppFunctionManagerHelper;
import android.app.appfunctions.AppFunctionRuntimeMetadata;
import android.app.appfunctions.AppFunctionStaticMetadataHelper;
import android.app.appfunctions.ExecuteAppFunctionAidlRequest;
+import android.app.appfunctions.ExecuteAppFunctionResponse;
import android.app.appfunctions.IAppFunctionEnabledCallback;
import android.app.appfunctions.IAppFunctionManager;
import android.app.appfunctions.IAppFunctionService;
@@ -85,6 +86,7 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {
private final ServiceConfig mServiceConfig;
private final Context mContext;
private final Map<String, Object> mLocks = new WeakHashMap<>();
+ private final AppFunctionsLoggerWrapper mLoggerWrapper;
public AppFunctionManagerServiceImpl(@NonNull Context context) {
this(
@@ -93,7 +95,8 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {
context, IAppFunctionService.Stub::asInterface, THREAD_POOL_EXECUTOR),
new CallerValidatorImpl(context),
new ServiceHelperImpl(context),
- new ServiceConfigImpl());
+ new ServiceConfigImpl(),
+ new AppFunctionsLoggerWrapper(context));
}
@VisibleForTesting
@@ -102,12 +105,14 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {
RemoteServiceCaller<IAppFunctionService> remoteServiceCaller,
CallerValidator callerValidator,
ServiceHelper appFunctionInternalServiceHelper,
- ServiceConfig serviceConfig) {
+ ServiceConfig serviceConfig,
+ AppFunctionsLoggerWrapper loggerWrapper) {
mContext = Objects.requireNonNull(context);
mRemoteServiceCaller = Objects.requireNonNull(remoteServiceCaller);
mCallerValidator = Objects.requireNonNull(callerValidator);
mInternalServiceHelper = Objects.requireNonNull(appFunctionInternalServiceHelper);
mServiceConfig = serviceConfig;
+ mLoggerWrapper = loggerWrapper;
}
/** Called when the user is unlocked. */
@@ -146,8 +151,25 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {
Objects.requireNonNull(requestInternal);
Objects.requireNonNull(executeAppFunctionCallback);
+ int callingUid = Binder.getCallingUid();
+ int callingPid = Binder.getCallingPid();
+
final SafeOneTimeExecuteAppFunctionCallback safeExecuteAppFunctionCallback =
- new SafeOneTimeExecuteAppFunctionCallback(executeAppFunctionCallback);
+ new SafeOneTimeExecuteAppFunctionCallback(executeAppFunctionCallback,
+ new SafeOneTimeExecuteAppFunctionCallback.CompletionCallback() {
+ @Override
+ public void finalizeOnSuccess(
+ @NonNull ExecuteAppFunctionResponse result) {
+ mLoggerWrapper.logAppFunctionSuccess(requestInternal, result,
+ callingUid);
+ }
+
+ @Override
+ public void finalizeOnError(@NonNull AppFunctionException error) {
+ mLoggerWrapper.logAppFunctionError(requestInternal,
+ error.getErrorCode(), callingUid);
+ }
+ });
String validatedCallingPackage;
try {
@@ -162,9 +184,6 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {
return null;
}
- int callingUid = Binder.getCallingUid();
- int callingPid = Binder.getCallingPid();
-
ICancellationSignal localCancelTransport = CancellationSignal.createTransport();
THREAD_POOL_EXECUTOR.execute(
diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionsLoggerWrapper.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionsLoggerWrapper.java
new file mode 100644
index 000000000000..b59915aa6343
--- /dev/null
+++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionsLoggerWrapper.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appfunctions;
+
+import static com.android.server.appfunctions.AppFunctionExecutors.LOGGING_THREAD_EXECUTOR;
+
+import android.annotation.NonNull;
+import android.app.appfunctions.ExecuteAppFunctionAidlRequest;
+import android.app.appfunctions.ExecuteAppFunctionResponse;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.SystemClock;
+import android.util.Slog;
+
+import java.util.Objects;
+
+/** Wraps AppFunctionsStatsLog. */
+public class AppFunctionsLoggerWrapper {
+ private static final String TAG = AppFunctionsLoggerWrapper.class.getSimpleName();
+
+ private static final int SUCCESS_RESPONSE_CODE = -1;
+
+ private final Context mContext;
+
+ public AppFunctionsLoggerWrapper(@NonNull Context context) {
+ mContext = Objects.requireNonNull(context);
+ }
+
+ void logAppFunctionSuccess(ExecuteAppFunctionAidlRequest request,
+ ExecuteAppFunctionResponse response, int callingUid) {
+ logAppFunctionsRequestReported(request, SUCCESS_RESPONSE_CODE,
+ response.getResponseDataSize(), callingUid);
+ }
+
+ void logAppFunctionError(ExecuteAppFunctionAidlRequest request, int errorCode, int callingUid) {
+ logAppFunctionsRequestReported(request, errorCode, /* responseSizeBytes = */ 0, callingUid);
+ }
+
+ private void logAppFunctionsRequestReported(ExecuteAppFunctionAidlRequest request,
+ int errorCode, int responseSizeBytes, int callingUid) {
+ final long latency = SystemClock.elapsedRealtime() - request.getRequestTime();
+ LOGGING_THREAD_EXECUTOR.execute(() -> AppFunctionsStatsLog.write(
+ AppFunctionsStatsLog.APP_FUNCTIONS_REQUEST_REPORTED,
+ callingUid,
+ getPackageUid(request.getClientRequest().getTargetPackageName()),
+ errorCode,
+ request.getClientRequest().getRequestDataSize(), responseSizeBytes,
+ latency)
+ );
+ }
+
+ private int getPackageUid(String packageName) {
+ try {
+ return mContext.getPackageManager().getPackageUid(packageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(TAG, "Package uid not found for " + packageName);
+ }
+ return 0;
+ }
+}
diff --git a/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java b/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java
index c689bb92f8f7..896c0fc51683 100644
--- a/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java
+++ b/services/appfunctions/java/com/android/server/appfunctions/RunAppFunctionServiceCallback.java
@@ -16,8 +16,8 @@
package com.android.server.appfunctions;
import android.annotation.NonNull;
-import android.app.appfunctions.ExecuteAppFunctionAidlRequest;
import android.app.appfunctions.AppFunctionException;
+import android.app.appfunctions.ExecuteAppFunctionAidlRequest;
import android.app.appfunctions.ExecuteAppFunctionResponse;
import android.app.appfunctions.IAppFunctionService;
import android.app.appfunctions.ICancellationCallback;
diff --git a/services/autofill/bugfixes.aconfig b/services/autofill/bugfixes.aconfig
index 9c83757f4b0f..7c5cfa91ab8a 100644
--- a/services/autofill/bugfixes.aconfig
+++ b/services/autofill/bugfixes.aconfig
@@ -86,3 +86,13 @@ flag {
description: "Highlight single field after autofill selection"
bug: "41496744"
}
+
+flag {
+ name: "metrics_fixes"
+ namespace: "autofill"
+ description: "Fixes various framework reported metrics"
+ bug: "362581326, 363011343"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java b/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java
index bd1b0ea99e17..6ccf5e47ca6c 100644
--- a/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java
+++ b/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java
@@ -45,6 +45,7 @@ import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_NO_FOCUS;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_REQUEST_TIMEOUT;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_FOCUSED_BEFORE_FILL_DIALOG_RESPONSE;
@@ -98,6 +99,7 @@ public final class PresentationStatsEventLogger {
NOT_SHOWN_REASON_REQUEST_FAILED,
NOT_SHOWN_REASON_NO_FOCUS,
NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY,
+ NOT_SHOWN_REASON_SUGGESTION_FILTERED,
NOT_SHOWN_REASON_UNKNOWN
})
@Retention(RetentionPolicy.SOURCE)
@@ -178,6 +180,8 @@ public final class PresentationStatsEventLogger {
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY;
public static final int NOT_SHOWN_REASON_UNKNOWN =
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON;
+ public static final int NOT_SHOWN_REASON_SUGGESTION_FILTERED =
+ AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT;
public static final int AUTHENTICATION_TYPE_UNKNOWN =
AUTOFILL_PRESENTATION_EVENT_REPORTED__AUTHENTICATION_TYPE__AUTHENTICATION_TYPE_UNKNOWN;
@@ -286,12 +290,43 @@ public final class PresentationStatsEventLogger {
});
}
+ /**
+ * Call this when first entering the View. It will check if there are pre-existing characters
+ * in the view, and sets NOT_SHOWN_REASON_SUGGESTION_FILTERED if there is
+ */
+ public void maybeSetNoPresentationEventReasonSuggestionsFiltered(AutofillValue value) {
+ mEventInternal.ifPresent(
+ event -> {
+ if (value == null || !value.isText()) {
+ return;
+ }
+
+ int length = value.getTextValue().length();
+
+ if (length > 0) {
+ maybeSetNoPresentationEventReason(NOT_SHOWN_REASON_SUGGESTION_FILTERED);
+ }
+ });
+ }
+
public void maybeSetNoPresentationEventReasonIfNoReasonExists(@NotShownReason int reason) {
- mEventInternal.ifPresent(event -> {
- if (event.mCountShown == 0 && event.mNoPresentationReason == NOT_SHOWN_REASON_UNKNOWN) {
- event.mNoPresentationReason = reason;
- }
- });
+ mEventInternal.ifPresent(
+ event -> {
+ if (event.mCountShown != 0) {
+ return;
+ }
+
+ // The only events that can be overwritten.
+ // NOT_SHOWN_REASON_UNKNOWN is the default for inline/dropdown
+ // NOT_SHOWN_REASON_NO_FOCUS is the default for fill dialog
+ if (event.mNoPresentationReason != NOT_SHOWN_REASON_UNKNOWN
+ || event.mNoPresentationReason != NOT_SHOWN_REASON_NO_FOCUS) {
+ Slog.d(TAG, "Not setting no presentation reason because it already exists");
+ return;
+ }
+
+ event.mNoPresentationReason = reason;
+ });
}
public void maybeSetAvailableCount(@Nullable List<Dataset> datasetList,
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 9c6e4741730a..ba9865d513d7 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -41,6 +41,7 @@ import static android.service.autofill.FillRequest.FLAG_VIEW_REQUESTS_CREDMAN_SE
import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
import static android.service.autofill.Flags.highlightAutofillSingleField;
import static android.service.autofill.Flags.improveFillDialogAconfig;
+import static android.service.autofill.Flags.metricsFixes;
import static android.view.autofill.AutofillManager.ACTION_RESPONSE_EXPIRED;
import static android.view.autofill.AutofillManager.ACTION_START_SESSION;
import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED;
@@ -3741,8 +3742,13 @@ final class Session
final FillResponse lastResponse = getLastResponseLocked("logContextCommited(%s)");
if (lastResponse == null) return;
- mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
- PresentationStatsEventLogger.getNoPresentationEventReason(commitReason));
+ if (metricsFixes()) {
+ mPresentationStatsEventLogger.maybeSetNoPresentationEventReasonIfNoReasonExists(
+ PresentationStatsEventLogger.getNoPresentationEventReason(commitReason));
+ } else {
+ mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
+ PresentationStatsEventLogger.getNoPresentationEventReason(commitReason));
+ }
mPresentationStatsEventLogger.logAndEndEvent("Context committed");
final int flags = lastResponse.getFlags();
@@ -5125,6 +5131,13 @@ final class Session
mPreviouslyFillDialogPotentiallyStarted = false;
} else {
mPreviouslyFillDialogPotentiallyStarted = true;
+ if (metricsFixes()) {
+ // Set the default reason for now if the user doesn't trigger any focus
+ // event on the autofillable view. This can be changed downstream when
+ // more information is available or session is committed.
+ mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
+ NOT_SHOWN_REASON_NO_FOCUS);
+ }
}
Optional<Integer> maybeRequestId =
requestNewFillResponseLocked(
@@ -5291,6 +5304,10 @@ final class Session
if (maybeNewRequestId.isPresent()) {
mPresentationStatsEventLogger.maybeSetRequestId(maybeNewRequestId.get());
}
+ if (metricsFixes()) {
+ mPresentationStatsEventLogger
+ .maybeSetNoPresentationEventReasonSuggestionsFiltered(value);
+ }
}
logPresentationStatsOnViewEnteredLocked(
@@ -5325,8 +5342,14 @@ final class Session
// It's not necessary that there's no more presentation for this view. It could
// be that the user chose some suggestion, in which case, view exits.
- mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
- NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED);
+ if (metricsFixes()) {
+ mPresentationStatsEventLogger
+ .maybeSetNoPresentationEventReasonIfNoReasonExists(
+ NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED);
+ } else {
+ mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
+ NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED);
+ }
}
break;
default:
@@ -6935,11 +6958,15 @@ final class Session
private void startNewEventForPresentationStatsEventLogger() {
synchronized (mLock) {
mPresentationStatsEventLogger.startNewEvent();
- // Set the default reason for now if the user doesn't trigger any focus event
- // on the autofillable view. This can be changed downstream when more
- // information is available or session is committed.
- mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
- NOT_SHOWN_REASON_NO_FOCUS);
+ // This is a fill dialog only state, moved to when we set
+ // mPreviouslyFillDialogPotentiallyStarted = true
+ if (!metricsFixes()) {
+ // Set the default reason for now if the user doesn't trigger any focus event
+ // on the autofillable view. This can be changed downstream when more
+ // information is available or session is committed.
+ mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
+ NOT_SHOWN_REASON_NO_FOCUS);
+ }
mPresentationStatsEventLogger.maybeSetDetectionPreference(
getDetectionPreferenceForLogging());
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(getAutofillServiceUid());
@@ -7696,7 +7723,11 @@ final class Session
if (sVerbose) {
Slog.v(TAG, "logAllEvents(" + id + "): commitReason: " + val);
}
- mSessionCommittedEventLogger.maybeSetCommitReason(val);
+ if (metricsFixes()) {
+ mSessionCommittedEventLogger.maybeSetCommitReasonIfUnset(val);
+ } else {
+ mSessionCommittedEventLogger.maybeSetCommitReason(val);
+ }
mSessionCommittedEventLogger.maybeSetRequestCount(mRequestCount);
mSessionCommittedEventLogger.maybeSetSessionDurationMillis(
SystemClock.elapsedRealtime() - mStartTime);
diff --git a/services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java b/services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java
index 8f3c8803154d..7fd5648156a8 100644
--- a/services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java
+++ b/services/autofill/java/com/android/server/autofill/SessionCommittedEventLogger.java
@@ -76,6 +76,17 @@ public final class SessionCommittedEventLogger {
});
}
+ /** Set commit_reason if not already set */
+ public void maybeSetCommitReasonIfUnset(@AutofillCommitReason int val) {
+ mEventInternal.ifPresent(
+ event -> {
+ if (event.mCommitReason != COMMIT_REASON_UNKNOWN) {
+ return;
+ }
+ event.mCommitReason = val;
+ });
+ }
+
/**
* Set session_duration_millis as long as mEventInternal presents.
*/
diff --git a/services/core/java/com/android/server/GestureLauncherService.java b/services/core/java/com/android/server/GestureLauncherService.java
index d84a892e4f54..ccc44a41759b 100644
--- a/services/core/java/com/android/server/GestureLauncherService.java
+++ b/services/core/java/com/android/server/GestureLauncherService.java
@@ -16,14 +16,9 @@
package com.android.server;
-import static android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap;
-
-import static com.android.hardware.input.Flags.overridePowerKeyBehaviorInFocusedWindow;
import static com.android.internal.R.integer.config_defaultMinEmergencyGestureTapDurationMillis;
import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -38,7 +33,6 @@ import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
-import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
@@ -47,12 +41,10 @@ import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.provider.Settings;
-import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.util.MutableBoolean;
import android.util.Slog;
import android.view.KeyEvent;
-import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEvent;
@@ -78,8 +70,7 @@ public class GestureLauncherService extends SystemService {
* Time in milliseconds in which the power button must be pressed twice so it will be considered
* as a camera launch.
*/
- @VisibleForTesting
- static final long POWER_DOUBLE_TAP_MAX_TIME_MS = 300;
+ @VisibleForTesting static final long CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS = 300;
/**
@@ -109,23 +100,10 @@ public class GestureLauncherService extends SystemService {
@VisibleForTesting
static final int EMERGENCY_GESTURE_POWER_BUTTON_COOLDOWN_PERIOD_MS_MAX = 5000;
- /** Indicates camera should be launched on power double tap. */
- @VisibleForTesting static final int LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER = 0;
-
- /** Indicates wallet should be launched on power double tap. */
- @VisibleForTesting static final int LAUNCH_WALLET_ON_DOUBLE_TAP_POWER = 1;
-
- /** Number of taps required to launch the double tap shortcut (either camera or wallet). */
- public static final int DOUBLE_POWER_TAP_COUNT_THRESHOLD = 2;
-
- /** Bundle to send with PendingIntent to grant background activity start privileges. */
- private static final Bundle GRANT_BACKGROUND_START_PRIVILEGES =
- ActivityOptions.makeBasic()
- .setPendingIntentBackgroundActivityStartMode(
- ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS)
- .toBundle();
-
- private final QuickAccessWalletClient mQuickAccessWalletClient;
+ /**
+ * Number of taps required to launch camera shortcut.
+ */
+ private static final int CAMERA_POWER_TAP_COUNT_THRESHOLD = 2;
/** The listener that receives the gesture event. */
private final GestureEventListener mGestureListener = new GestureEventListener();
@@ -180,9 +158,6 @@ public class GestureLauncherService extends SystemService {
*/
private boolean mCameraDoubleTapPowerEnabled;
- /** Whether wallet double tap power button gesture is currently enabled. */
- private boolean mWalletDoubleTapPowerEnabled;
-
/**
* Whether emergency gesture is currently enabled
*/
@@ -229,22 +204,14 @@ public class GestureLauncherService extends SystemService {
}
}
public GestureLauncherService(Context context) {
- this(
- context,
- new MetricsLogger(),
- QuickAccessWalletClient.create(context),
- new UiEventLoggerImpl());
+ this(context, new MetricsLogger(), new UiEventLoggerImpl());
}
@VisibleForTesting
- public GestureLauncherService(
- Context context,
- MetricsLogger metricsLogger,
- QuickAccessWalletClient quickAccessWalletClient,
+ GestureLauncherService(Context context, MetricsLogger metricsLogger,
UiEventLogger uiEventLogger) {
super(context);
mContext = context;
- mQuickAccessWalletClient = quickAccessWalletClient;
mMetricsLogger = metricsLogger;
mUiEventLogger = uiEventLogger;
}
@@ -270,9 +237,6 @@ public class GestureLauncherService extends SystemService {
"GestureLauncherService");
updateCameraRegistered();
updateCameraDoubleTapPowerEnabled();
- if (launchWalletOptionOnPowerDoubleTap()) {
- updateWalletDoubleTapPowerEnabled();
- }
updateEmergencyGestureEnabled();
updateEmergencyGesturePowerButtonCooldownPeriodMs();
@@ -328,14 +292,6 @@ public class GestureLauncherService extends SystemService {
}
@VisibleForTesting
- void updateWalletDoubleTapPowerEnabled() {
- boolean enabled = isWalletDoubleTapPowerSettingEnabled(mContext, mUserId);
- synchronized (this) {
- mWalletDoubleTapPowerEnabled = enabled;
- }
- }
-
- @VisibleForTesting
void updateEmergencyGestureEnabled() {
boolean enabled = isEmergencyGestureSettingEnabled(mContext, mUserId);
synchronized (this) {
@@ -462,33 +418,10 @@ public class GestureLauncherService extends SystemService {
Settings.Secure.CAMERA_GESTURE_DISABLED, 0, userId) == 0);
}
- /** Checks if camera should be launched on double press of the power button. */
public static boolean isCameraDoubleTapPowerSettingEnabled(Context context, int userId) {
- boolean res;
-
- if (launchWalletOptionOnPowerDoubleTap()) {
- res = isDoubleTapPowerGestureSettingEnabled(context, userId)
- && getDoubleTapPowerGestureAction(context, userId)
- == LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER;
- } else {
- // These are legacy settings that will be deprecated once the option to launch both
- // wallet and camera has been created.
- res = isCameraDoubleTapPowerEnabled(context.getResources())
- && (Settings.Secure.getIntForUser(context.getContentResolver(),
- Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0, userId) == 0);
- }
- return res;
- }
-
- /** Checks if wallet should be launched on double tap of the power button. */
- public static boolean isWalletDoubleTapPowerSettingEnabled(Context context, int userId) {
- if (!launchWalletOptionOnPowerDoubleTap()) {
- return false;
- }
-
- return isDoubleTapPowerGestureSettingEnabled(context, userId)
- && getDoubleTapPowerGestureAction(context, userId)
- == LAUNCH_WALLET_ON_DOUBLE_TAP_POWER;
+ return isCameraDoubleTapPowerEnabled(context.getResources())
+ && (Settings.Secure.getIntForUser(context.getContentResolver(),
+ Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0, userId) == 0);
}
public static boolean isCameraLiftTriggerSettingEnabled(Context context, int userId) {
@@ -508,28 +441,6 @@ public class GestureLauncherService extends SystemService {
isDefaultEmergencyGestureEnabled(context.getResources()) ? 1 : 0, userId) != 0;
}
- private static int getDoubleTapPowerGestureAction(Context context, int userId) {
- return Settings.Secure.getIntForUser(
- context.getContentResolver(),
- Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE,
- LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER,
- userId);
- }
-
- /** Whether the shortcut to launch app on power double press is enabled. */
- private static boolean isDoubleTapPowerGestureSettingEnabled(Context context, int userId) {
- return Settings.Secure.getIntForUser(
- context.getContentResolver(),
- Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED,
- isDoubleTapConfigEnabled(context.getResources()) ? 1 : 0,
- userId)
- == 1;
- }
-
- private static boolean isDoubleTapConfigEnabled(Resources resources) {
- return resources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled);
- }
-
/**
* Gets power button cooldown period in milliseconds after emergency gesture is triggered. The
* value is capped at a maximum
@@ -583,56 +494,10 @@ public class GestureLauncherService extends SystemService {
* Whether GestureLauncherService should be enabled according to system properties.
*/
public static boolean isGestureLauncherEnabled(Resources resources) {
- boolean res =
- isCameraLaunchEnabled(resources)
- || isCameraLiftTriggerEnabled(resources)
- || isEmergencyGestureEnabled(resources);
- if (launchWalletOptionOnPowerDoubleTap()) {
- res |= isDoubleTapConfigEnabled(resources);
- } else {
- res |= isCameraDoubleTapPowerEnabled(resources);
- }
- return res;
- }
-
- /**
- * Processes a power key event in GestureLauncherService without performing an action. This
- * method is called on every KEYCODE_POWER ACTION_DOWN event and ensures that, even if
- * KEYCODE_POWER events are passed to and handled by the app, the GestureLauncherService still
- * keeps track of all running KEYCODE_POWER events for its gesture detection and relevant
- * actions.
- */
- public void processPowerKeyDown(KeyEvent event) {
- if (mEmergencyGestureEnabled && mEmergencyGesturePowerButtonCooldownPeriodMs >= 0
- && event.getEventTime() - mLastEmergencyGestureTriggered
- < mEmergencyGesturePowerButtonCooldownPeriodMs) {
- return;
- }
- if (event.isLongPress()) {
- return;
- }
-
- final long powerTapInterval;
-
- synchronized (this) {
- powerTapInterval = event.getEventTime() - mLastPowerDown;
- mLastPowerDown = event.getEventTime();
- if (powerTapInterval >= POWER_SHORT_TAP_SEQUENCE_MAX_INTERVAL_MS) {
- // Tap too slow, reset consecutive tap counts.
- mFirstPowerDown = event.getEventTime();
- mPowerButtonConsecutiveTaps = 1;
- mPowerButtonSlowConsecutiveTaps = 1;
- } else if (powerTapInterval >= POWER_DOUBLE_TAP_MAX_TIME_MS) {
- // Tap too slow for shortcuts
- mFirstPowerDown = event.getEventTime();
- mPowerButtonConsecutiveTaps = 1;
- mPowerButtonSlowConsecutiveTaps++;
- } else if (powerTapInterval > 0) {
- // Fast consecutive tap
- mPowerButtonConsecutiveTaps++;
- mPowerButtonSlowConsecutiveTaps++;
- }
- }
+ return isCameraLaunchEnabled(resources)
+ || isCameraDoubleTapPowerEnabled(resources)
+ || isCameraLiftTriggerEnabled(resources)
+ || isEmergencyGestureEnabled(resources);
}
/**
@@ -642,8 +507,8 @@ public class GestureLauncherService extends SystemService {
* @param outLaunched true if some action is taken as part of the key intercept (eg, app launch)
* @return true if the key down event is intercepted
*/
- public boolean interceptPowerKeyDown(
- KeyEvent event, boolean interactive, MutableBoolean outLaunched) {
+ public boolean interceptPowerKeyDown(KeyEvent event, boolean interactive,
+ MutableBoolean outLaunched) {
if (mEmergencyGestureEnabled && mEmergencyGesturePowerButtonCooldownPeriodMs >= 0
&& event.getEventTime() - mLastEmergencyGestureTriggered
< mEmergencyGesturePowerButtonCooldownPeriodMs) {
@@ -665,7 +530,6 @@ public class GestureLauncherService extends SystemService {
return false;
}
boolean launchCamera = false;
- boolean launchWallet = false;
boolean launchEmergencyGesture = false;
boolean intercept = false;
long powerTapInterval;
@@ -677,12 +541,12 @@ public class GestureLauncherService extends SystemService {
mFirstPowerDown = event.getEventTime();
mPowerButtonConsecutiveTaps = 1;
mPowerButtonSlowConsecutiveTaps = 1;
- } else if (powerTapInterval >= POWER_DOUBLE_TAP_MAX_TIME_MS) {
+ } else if (powerTapInterval >= CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS) {
// Tap too slow for shortcuts
mFirstPowerDown = event.getEventTime();
mPowerButtonConsecutiveTaps = 1;
mPowerButtonSlowConsecutiveTaps++;
- } else if (!overridePowerKeyBehaviorInFocusedWindow() || powerTapInterval > 0) {
+ } else {
// Fast consecutive tap
mPowerButtonConsecutiveTaps++;
mPowerButtonSlowConsecutiveTaps++;
@@ -722,16 +586,10 @@ public class GestureLauncherService extends SystemService {
}
}
if (mCameraDoubleTapPowerEnabled
- && powerTapInterval < POWER_DOUBLE_TAP_MAX_TIME_MS
- && mPowerButtonConsecutiveTaps == DOUBLE_POWER_TAP_COUNT_THRESHOLD) {
+ && powerTapInterval < CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS
+ && mPowerButtonConsecutiveTaps == CAMERA_POWER_TAP_COUNT_THRESHOLD) {
launchCamera = true;
intercept = interactive;
- } else if (launchWalletOptionOnPowerDoubleTap()
- && mWalletDoubleTapPowerEnabled
- && powerTapInterval < POWER_DOUBLE_TAP_MAX_TIME_MS
- && mPowerButtonConsecutiveTaps == DOUBLE_POWER_TAP_COUNT_THRESHOLD) {
- launchWallet = true;
- intercept = interactive;
}
}
if (mPowerButtonConsecutiveTaps > 1 || mPowerButtonSlowConsecutiveTaps > 1) {
@@ -750,10 +608,6 @@ public class GestureLauncherService extends SystemService {
(int) powerTapInterval);
mUiEventLogger.log(GestureLauncherEvent.GESTURE_CAMERA_DOUBLE_TAP_POWER);
}
- } else if (launchWallet) {
- Slog.i(TAG, "Power button double tap gesture detected, launching wallet. Interval="
- + powerTapInterval + "ms");
- launchWallet = sendGestureTargetActivityPendingIntent();
} else if (launchEmergencyGesture) {
Slog.i(TAG, "Emergency gesture detected, launching.");
launchEmergencyGesture = handleEmergencyGesture();
@@ -769,74 +623,11 @@ public class GestureLauncherService extends SystemService {
mPowerButtonSlowConsecutiveTaps);
mMetricsLogger.histogram("power_double_tap_interval", (int) powerTapInterval);
- outLaunched.value = launchCamera || launchEmergencyGesture || launchWallet;
+ outLaunched.value = launchCamera || launchEmergencyGesture;
// Intercept power key event if the press is part of a gesture (camera, eGesture) and the
// user has completed setup.
return intercept && isUserSetupComplete();
}
-
- /**
- * Fetches and sends gestureTargetActivityPendingIntent from QuickAccessWallet, which is a
- * specific activity that QuickAccessWalletService has defined to be launch on detection of the
- * power button gesture.
- */
- private boolean sendGestureTargetActivityPendingIntent() {
- boolean userSetupComplete = isUserSetupComplete();
- if (mQuickAccessWalletClient == null
- || !mQuickAccessWalletClient.isWalletServiceAvailable()) {
- Slog.w(TAG, "QuickAccessWalletService is not available, ignoring wallet gesture.");
- return false;
- }
-
- if (!userSetupComplete) {
- if (DBG) {
- Slog.d(TAG, "userSetupComplete = false, ignoring wallet gesture.");
- }
- return false;
- }
- if (DBG) {
- Slog.d(TAG, "userSetupComplete = true, performing wallet gesture.");
- }
-
- mQuickAccessWalletClient.getGestureTargetActivityPendingIntent(
- getContext().getMainExecutor(),
- gesturePendingIntent -> {
- if (gesturePendingIntent == null) {
- Slog.d(TAG, "getGestureTargetActivityPendingIntent is null.");
- sendFallbackPendingIntent();
- return;
- }
- sendPendingIntentWithBackgroundStartPrivileges(gesturePendingIntent);
- });
- return true;
- }
-
- /**
- * If gestureTargetActivityPendingIntent is null, this method is invoked to start the activity
- * that QuickAccessWalletService has defined to host the Wallet view, which is typically the
- * home screen of the Wallet application.
- */
- private void sendFallbackPendingIntent() {
- mQuickAccessWalletClient.getWalletPendingIntent(
- getContext().getMainExecutor(),
- walletPendingIntent -> {
- if (walletPendingIntent == null) {
- Slog.w(TAG, "getWalletPendingIntent returns null. Not launching "
- + "anything for wallet.");
- return;
- }
- sendPendingIntentWithBackgroundStartPrivileges(walletPendingIntent);
- });
- }
-
- private void sendPendingIntentWithBackgroundStartPrivileges(PendingIntent pendingIntent) {
- try {
- pendingIntent.send(GRANT_BACKGROUND_START_PRIVILEGES);
- } catch (PendingIntent.CanceledException e) {
- Slog.e(TAG, "PendingIntent was canceled", e);
- }
- }
-
/**
* @return true if camera was launched, false otherwise.
*/
@@ -909,39 +700,31 @@ public class GestureLauncherService extends SystemService {
Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0;
}
- private final BroadcastReceiver mUserReceiver =
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
- mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
- mContext.getContentResolver().unregisterContentObserver(mSettingObserver);
- registerContentObservers();
- updateCameraRegistered();
- updateCameraDoubleTapPowerEnabled();
- if (launchWalletOptionOnPowerDoubleTap()) {
- updateWalletDoubleTapPowerEnabled();
- }
- updateEmergencyGestureEnabled();
- updateEmergencyGesturePowerButtonCooldownPeriodMs();
- }
- }
- };
-
- private final ContentObserver mSettingObserver =
- new ContentObserver(new Handler()) {
- public void onChange(boolean selfChange, android.net.Uri uri, int userId) {
- if (userId == mUserId) {
- updateCameraRegistered();
- updateCameraDoubleTapPowerEnabled();
- if (launchWalletOptionOnPowerDoubleTap()) {
- updateWalletDoubleTapPowerEnabled();
- }
- updateEmergencyGestureEnabled();
- updateEmergencyGesturePowerButtonCooldownPeriodMs();
- }
- }
- };
+ private final BroadcastReceiver mUserReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
+ mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
+ mContext.getContentResolver().unregisterContentObserver(mSettingObserver);
+ registerContentObservers();
+ updateCameraRegistered();
+ updateCameraDoubleTapPowerEnabled();
+ updateEmergencyGestureEnabled();
+ updateEmergencyGesturePowerButtonCooldownPeriodMs();
+ }
+ }
+ };
+
+ private final ContentObserver mSettingObserver = new ContentObserver(new Handler()) {
+ public void onChange(boolean selfChange, android.net.Uri uri, int userId) {
+ if (userId == mUserId) {
+ updateCameraRegistered();
+ updateCameraDoubleTapPowerEnabled();
+ updateEmergencyGestureEnabled();
+ updateEmergencyGesturePowerButtonCooldownPeriodMs();
+ }
+ }
+ };
private final class GestureEventListener implements SensorEventListener {
@Override
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index c27126a01a32..aea24d978bee 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -1101,6 +1101,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
/** StatsPullAtomCallback for pulling BatteryUsageStats data. */
private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback {
+ private static final long BATTERY_USAGE_STATS_PER_UID_MAX_STATS_AGE =
+ TimeUnit.HOURS.toMillis(2);
+
@Override
public int onPullAtom(int atomTag, List<StatsEvent> data) {
final BatteryUsageStats bus;
@@ -1168,7 +1171,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
.setMinConsumedPowerThreshold(minConsumedPowerThreshold);
if (isBatteryUsageStatsAccumulationSupported()) {
- query.accumulated();
+ query.accumulated()
+ .setMaxStatsAgeMs(BATTERY_USAGE_STATS_PER_UID_MAX_STATS_AGE);
}
bus = getBatteryUsageStats(List.of(query.build())).get(0);
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index 883e09f53e41..87f87c76725e 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -143,6 +143,7 @@ public class SettingsToPropertiesMapper {
"tv_os",
"aaos_carframework_triage",
"aaos_performance_triage",
+ "aaos_input_triage",
"aaos_user_triage",
"aaos_window_triage",
"aaos_audio_triage",
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index 34d4fb02ad99..acb46d9b85e6 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -793,6 +793,7 @@ public class AudioDeviceInventory {
* (see AudioService.onAudioServerDied() method)
*/
// Always executed on AudioDeviceBroker message queue
+ @GuardedBy("mDeviceBroker.mDeviceStateLock")
/*package*/ void onRestoreDevices() {
synchronized (mDevicesLock) {
int res;
@@ -815,6 +816,9 @@ public class AudioDeviceInventory {
"Device inventory restore failed to reconnect " + di,
EventLogger.Event.ALOGE, TAG);
mConnectedDevices.remove(di.getKey(), di);
+ if (AudioSystem.isBluetoothScoDevice(di.mDeviceType)) {
+ mDeviceBroker.onSetBtScoActiveDevice(null);
+ }
}
}
mAppliedStrategyRolesInt.clear();
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 09b8e212bfad..1799b7715e5c 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -4177,6 +4177,12 @@ public class AudioService extends IAudioService.Stub
// Stream mute changed, fire the intent.
Intent intent = new Intent(AudioManager.STREAM_MUTE_CHANGED_ACTION);
intent.putExtra(AudioManager.EXTRA_STREAM_VOLUME_MUTED, isMuted);
+ if (replaceStreamBtSco() && isStreamBluetoothSco(streamType)) {
+ intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE,
+ AudioSystem.STREAM_BLUETOOTH_SCO);
+ // in this case broadcast for both sco and voice_call streams the mute status
+ sendBroadcastToAll(intent, null /* options */);
+ }
intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, streamType);
sendBroadcastToAll(intent, null /* options */);
}
@@ -9670,9 +9676,16 @@ public class AudioService extends IAudioService.Stub
mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, index);
mVolumeChanged.putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE,
oldIndex);
-
- mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE,
- mStreamType);
+ int extraStreamType = mStreamType;
+ // TODO: remove this when deprecating STREAM_BLUETOOTH_SCO
+ if (isStreamBluetoothSco(mStreamType)) {
+ mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE,
+ AudioSystem.STREAM_BLUETOOTH_SCO);
+ extraStreamType = AudioSystem.STREAM_BLUETOOTH_SCO;
+ } else {
+ mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE,
+ mStreamType);
+ }
mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE_ALIAS,
streamAlias);
@@ -9683,9 +9696,21 @@ public class AudioService extends IAudioService.Stub
" aliased streams: " + aliasStreamIndexes;
}
AudioService.sVolumeLogger.enqueue(new VolChangedBroadcastEvent(
- mStreamType, aliasStreamIndexesString, index, oldIndex));
+ extraStreamType, aliasStreamIndexesString, index, oldIndex));
+ if (extraStreamType != mStreamType) {
+ AudioService.sVolumeLogger.enqueue(new VolChangedBroadcastEvent(
+ mStreamType, aliasStreamIndexesString, index, oldIndex));
+ }
}
sendBroadcastToAll(mVolumeChanged, mVolumeChangedOptions);
+ if (extraStreamType != mStreamType) {
+ // send multiple intents in case we merged voice call and bt sco streams
+ mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE,
+ mStreamType);
+ // do not use the options in thid case which could discard
+ // the previous intent
+ sendBroadcastToAll(mVolumeChanged, null);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 452dc5f97d12..0b633bd9c549 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -2042,7 +2042,7 @@ public final class DisplayManagerService extends SystemService {
// handles stopping the projection.
Slog.w(TAG, "Content Recording: failed to start mirroring - "
+ "releasing virtual display " + displayId);
- releaseVirtualDisplayInternal(callback.asBinder(), callingUid);
+ releaseVirtualDisplayInternal(callback.asBinder());
return Display.INVALID_DISPLAY;
} else if (projection != null) {
// Indicate that this projection has been used to record, and can't be used
@@ -2131,7 +2131,7 @@ public final class DisplayManagerService extends SystemService {
// Something weird happened and the logical display was not created.
Slog.w(TAG, "Rejecting request to create virtual display "
+ "because the logical display was not created.");
- mVirtualDisplayAdapter.releaseVirtualDisplayLocked(callback.asBinder(), callingUid);
+ mVirtualDisplayAdapter.releaseVirtualDisplayLocked(callback.asBinder());
mDisplayDeviceRepo.onDisplayDeviceEvent(device,
DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED);
return -1;
@@ -2158,14 +2158,14 @@ public final class DisplayManagerService extends SystemService {
}
}
- private void releaseVirtualDisplayInternal(IBinder appToken, int callingUid) {
+ private void releaseVirtualDisplayInternal(IBinder appToken) {
synchronized (mSyncRoot) {
if (mVirtualDisplayAdapter == null) {
return;
}
DisplayDevice device =
- mVirtualDisplayAdapter.releaseVirtualDisplayLocked(appToken, callingUid);
+ mVirtualDisplayAdapter.releaseVirtualDisplayLocked(appToken);
Slog.d(TAG, "Virtual Display: Display Device released");
if (device != null) {
// TODO: multi-display - handle virtual displays the same as other display adapters.
@@ -4789,10 +4789,9 @@ public final class DisplayManagerService extends SystemService {
@Override // Binder call
public void releaseVirtualDisplay(IVirtualDisplayCallback callback) {
- final int callingUid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
- releaseVirtualDisplayInternal(callback.asBinder(), callingUid);
+ releaseVirtualDisplayInternal(callback.asBinder());
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 945365dcf8fe..f48fbea64f65 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -906,6 +906,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mLogicalDisplay.getPowerThrottlingDataIdLocked();
mHandler.postAtTime(() -> {
+ if (mStopped) {
+ // DPC has already stopped, don't execute any more.
+ return;
+ }
+
boolean changed = false;
if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) {
@@ -3306,7 +3311,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
int displayId, SensorManager sensorManager) {
return new DisplayPowerProximityStateController(wakelockController, displayDeviceConfig,
looper, nudgeUpdatePowerState,
- displayId, sensorManager, /* injector= */ null);
+ displayId, sensorManager);
}
AutomaticBrightnessController getAutomaticBrightnessController(
diff --git a/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java b/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java
index 215932ca19be..35455c841c7b 100644
--- a/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java
@@ -16,6 +16,8 @@
package com.android.server.display;
+import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -34,6 +36,8 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.utils.SensorUtils;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/**
* Maintains the proximity state of the display.
@@ -42,18 +46,26 @@ import java.io.PrintWriter;
*/
public final class DisplayPowerProximityStateController {
@VisibleForTesting
- static final int MSG_PROXIMITY_SENSOR_DEBOUNCED = 1;
- @VisibleForTesting
static final int PROXIMITY_UNKNOWN = -1;
+ private static final int PROXIMITY_NEGATIVE = 0;
@VisibleForTesting
static final int PROXIMITY_POSITIVE = 1;
+
+ @IntDef(prefix = { "PROXIMITY_" }, value = {
+ PROXIMITY_UNKNOWN,
+ PROXIMITY_NEGATIVE,
+ PROXIMITY_POSITIVE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @interface ProximityState {}
+
+ @VisibleForTesting
+ static final int MSG_PROXIMITY_SENSOR_DEBOUNCED = 1;
@VisibleForTesting
static final int PROXIMITY_SENSOR_POSITIVE_DEBOUNCE_DELAY = 0;
private static final int MSG_IGNORE_PROXIMITY = 2;
- private static final int PROXIMITY_NEGATIVE = 0;
-
private static final boolean DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT = false;
// Proximity sensor debounce delay in milliseconds for positive transitions.
@@ -73,7 +85,7 @@ public final class DisplayPowerProximityStateController {
private final DisplayPowerProximityStateHandler mHandler;
// A runnable to execute the utility to update the power state.
private final Runnable mNudgeUpdatePowerState;
- private Clock mClock;
+ private final Clock mClock;
// A listener which listen's to the events emitted by the proximity sensor.
private final SensorEventListener mProximitySensorListener = new SensorEventListener() {
@Override
@@ -117,9 +129,6 @@ public final class DisplayPowerProximityStateController {
// with the sensor manager.
private boolean mProximitySensorEnabled;
- // The raw non-debounced proximity sensor state.
- private int mPendingProximity = PROXIMITY_UNKNOWN;
-
// -1 if fully debounced. Else, represents the time in ms when the debounce suspend blocker will
// be removed. Applies for both positive and negative proximity flips.
private long mPendingProximityDebounceTime = -1;
@@ -128,8 +137,11 @@ public final class DisplayPowerProximityStateController {
// When the screen turns on again, we report user activity to the power manager.
private boolean mScreenOffBecauseOfProximity;
+ // The raw non-debounced proximity sensor state.
+ private @ProximityState int mPendingProximity = PROXIMITY_UNKNOWN;
+
// The debounced proximity sensor state.
- private int mProximity = PROXIMITY_UNKNOWN;
+ private @ProximityState int mProximity = PROXIMITY_UNKNOWN;
// The actual proximity sensor threshold value.
private float mProximityThreshold;
@@ -139,7 +151,7 @@ public final class DisplayPowerProximityStateController {
private boolean mSkipRampBecauseOfProximityChangeToNegative = false;
// The DisplayId of the associated Logical Display.
- private int mDisplayId;
+ private final int mDisplayId;
/**
* Create a new instance of DisplayPowerProximityStateController.
@@ -152,11 +164,18 @@ public final class DisplayPowerProximityStateController {
* @param displayId The DisplayId of the associated Logical Display.
* @param sensorManager The manager which lets us access the display's ProximitySensor
*/
- public DisplayPowerProximityStateController(
- WakelockController wakeLockController, DisplayDeviceConfig displayDeviceConfig,
- Looper looper,
+ public DisplayPowerProximityStateController(WakelockController wakeLockController,
+ DisplayDeviceConfig displayDeviceConfig, Looper looper,
+ Runnable nudgeUpdatePowerState, int displayId, SensorManager sensorManager) {
+ this(wakeLockController, displayDeviceConfig, looper, nudgeUpdatePowerState, displayId,
+ sensorManager, new Injector());
+ }
+
+ @VisibleForTesting
+ DisplayPowerProximityStateController(WakelockController wakeLockController,
+ DisplayDeviceConfig displayDeviceConfig, Looper looper,
Runnable nudgeUpdatePowerState, int displayId, SensorManager sensorManager,
- Injector injector) {
+ @Nullable Injector injector) {
if (injector == null) {
injector = new Injector();
}
@@ -437,7 +456,7 @@ public final class DisplayPowerProximityStateController {
if (mProximity != mPendingProximity) {
// if the status of the sensor changed, stop ignoring.
mIgnoreProximityUntilChanged = false;
- Slog.i(mTag, "No longer ignoring proximity [" + mPendingProximity + "]");
+ Slog.i(mTag, "Applying proximity: " + proximityToString(mPendingProximity));
}
// Sensor reading accepted. Apply the change then release the wake lock.
mProximity = mPendingProximity;
@@ -478,7 +497,7 @@ public final class DisplayPowerProximityStateController {
}
}
- private String proximityToString(int state) {
+ private String proximityToString(@ProximityState int state) {
switch (state) {
case PROXIMITY_UNKNOWN:
return "Unknown";
@@ -518,12 +537,12 @@ public final class DisplayPowerProximityStateController {
}
@VisibleForTesting
- int getPendingProximity() {
+ @ProximityState int getPendingProximity() {
return mPendingProximity;
}
@VisibleForTesting
- int getProximity() {
+ @ProximityState int getProximity() {
return mProximity;
}
@@ -550,7 +569,7 @@ public final class DisplayPowerProximityStateController {
@VisibleForTesting
static class Injector {
Clock createClock() {
- return () -> SystemClock.uptimeMillis();
+ return SystemClock::uptimeMillis;
}
}
}
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index c0903a9bafac..79592a656409 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -506,9 +506,6 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
return;
}
- Slog.i(TAG, "Requesting Transition to state: " + state.getIdentifier() + ", from state="
- + mDeviceState.getIdentifier() + ", interactive=" + mInteractive
- + ", mBootCompleted=" + mBootCompleted);
// As part of a state transition, we may need to turn off some displays temporarily so that
// the transition is smooth. Plus, on some devices, only one internal displays can be
// on at a time. We use LogicalDisplay.setIsInTransition to mark a display that needs to be
@@ -522,6 +519,11 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
final boolean sleepDevice = shouldDeviceBePutToSleep(mPendingDeviceState, mDeviceState,
mInteractive, mBootCompleted);
+ Slog.i(TAG, "Requesting Transition to state: " + state.getIdentifier() + ", from state="
+ + mDeviceState.getIdentifier() + ", interactive=" + mInteractive
+ + ", mBootCompleted=" + mBootCompleted + ", wakeDevice=" + wakeDevice
+ + ", sleepDevice=" + sleepDevice);
+
// If all displays are off already, we can just transition here, unless we are trying to
// wake or sleep the device as part of this transition. In that case defer the final
// transition until later once the device is awake/asleep.
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index 836f4ede8f57..f14e452ab8d3 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -91,6 +91,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
private final ArrayMap<IBinder, VirtualDisplayDevice> mVirtualDisplayDevices = new ArrayMap<>();
+ // When a virtual display is created, the mapping (appToken -> ownerUid) is stored here. That
+ // way, when the display is released later, we can retrieve the ownerUid and decrement
+ // the number of virtual displays that exist for that ownerUid. We can't use
+ // Binder.getCallingUid() because the display might be released by the system process and not
+ // the process that created the display.
+ private final ArrayMap<IBinder, Integer> mOwnerUids = new ArrayMap<>();
+
private final int mMaxDevices;
private final int mMaxDevicesPerPackage;
private final SparseIntArray mNoOfDevicesPerPackage = new SparseIntArray();
@@ -194,6 +201,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
mVirtualDisplayDevices.put(appToken, device);
if (getFeatureFlags().isVirtualDisplayLimitEnabled()) {
mNoOfDevicesPerPackage.put(ownerUid, noOfDevices + 1);
+ mOwnerUids.put(appToken, ownerUid);
}
try {
@@ -205,7 +213,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
appToken.linkToDeath(device, 0);
} catch (RemoteException ex) {
Slog.e(TAG, "Virtual Display: error while setting up VirtualDisplayDevice", ex);
- removeVirtualDisplayDeviceLocked(appToken, ownerUid);
+ removeVirtualDisplayDeviceLocked(appToken);
device.destroyLocked(false);
return null;
}
@@ -252,12 +260,10 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
/**
* Release a virtual display that was previously created
* @param appToken The token to identify the display
- * @param ownerUid The UID of the package, used to keep track of and limit the number of
- * displays created per package
* @return The display device that has been removed
*/
- public DisplayDevice releaseVirtualDisplayLocked(IBinder appToken, int ownerUid) {
- VirtualDisplayDevice device = removeVirtualDisplayDeviceLocked(appToken, ownerUid);
+ public DisplayDevice releaseVirtualDisplayLocked(IBinder appToken) {
+ VirtualDisplayDevice device = removeVirtualDisplayDeviceLocked(appToken);
if (device != null) {
Slog.v(TAG, "Release VirtualDisplay " + device.mName);
device.destroyLocked(true);
@@ -299,11 +305,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
}
}
- private VirtualDisplayDevice removeVirtualDisplayDeviceLocked(IBinder appToken, int ownerUid) {
- int noOfDevices = mNoOfDevicesPerPackage.get(ownerUid, /* valueIfKeyNotFound= */ 0);
+ private VirtualDisplayDevice removeVirtualDisplayDeviceLocked(IBinder appToken) {
if (getFeatureFlags().isVirtualDisplayLimitEnabled()) {
+ int ownerUid = mOwnerUids.get(appToken);
+ int noOfDevices = mNoOfDevicesPerPackage.get(ownerUid, /* valueIfKeyNotFound= */ 0);
if (noOfDevices <= 1) {
mNoOfDevicesPerPackage.delete(ownerUid);
+ mOwnerUids.remove(appToken);
} else {
mNoOfDevicesPerPackage.put(ownerUid, noOfDevices - 1);
}
@@ -378,7 +386,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
@Override
public void binderDied() {
synchronized (getSyncRoot()) {
- removeVirtualDisplayDeviceLocked(mAppToken, mOwnerUid);
+ removeVirtualDisplayDeviceLocked(mAppToken);
Slog.i(TAG, "Virtual display device released because application token died: "
+ mOwnerPackageName);
destroyLocked(false);
diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
index 585fc44fa452..78bd41bd2e11 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -93,6 +93,10 @@ public class DisplayManagerFlags {
com.android.graphics.surfaceflinger.flags.Flags.FLAG_ENABLE_SMALL_AREA_DETECTION,
com.android.graphics.surfaceflinger.flags.Flags::enableSmallAreaDetection);
+ private final FlagState mDisplayConfigErrorHalFlagState = new FlagState(
+ com.android.graphics.surfaceflinger.flags.Flags.FLAG_DISPLAY_CONFIG_ERROR_HAL,
+ com.android.graphics.surfaceflinger.flags.Flags::displayConfigErrorHal);
+
private final FlagState mBrightnessIntRangeUserPerceptionFlagState = new FlagState(
Flags.FLAG_BRIGHTNESS_INT_RANGE_USER_PERCEPTION,
Flags::brightnessIntRangeUserPerception);
@@ -361,6 +365,10 @@ public class DisplayManagerFlags {
return mSmallAreaDetectionFlagState.isEnabled();
}
+ public boolean isDisplayConfigErrorHalEnabled() {
+ return mDisplayConfigErrorHalFlagState.isEnabled();
+ }
+
public boolean isBrightnessIntRangeUserPerceptionEnabled() {
return mBrightnessIntRangeUserPerceptionFlagState.isEnabled();
}
@@ -591,6 +599,7 @@ public class DisplayManagerFlags {
pw.println(" " + mPowerThrottlingClamperFlagState);
pw.println(" " + mEvenDimmerFlagState);
pw.println(" " + mSmallAreaDetectionFlagState);
+ pw.println(" " + mDisplayConfigErrorHalFlagState);
pw.println(" " + mBrightnessIntRangeUserPerceptionFlagState);
pw.println(" " + mRestrictDisplayModes);
pw.println(" " + mBrightnessWearBedtimeModeClamperFlagState);
diff --git a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
index 8423e1911764..02e2882442bf 100644
--- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
@@ -136,6 +136,7 @@ public class DisplayModeDirector {
private final ProximitySensorObserver mSensorObserver;
private final HbmObserver mHbmObserver;
private final SkinThermalStatusObserver mSkinThermalStatusObserver;
+ private final ModeChangeObserver mModeChangeObserver;
@Nullable
private final SystemRequestObserver mSystemRequestObserver;
@@ -247,6 +248,7 @@ public class DisplayModeDirector {
mDisplayObserver = new DisplayObserver(context, handler, mVotesStorage, injector);
mSensorObserver = new ProximitySensorObserver(mVotesStorage, injector);
mSkinThermalStatusObserver = new SkinThermalStatusObserver(injector, mVotesStorage);
+ mModeChangeObserver = new ModeChangeObserver(mVotesStorage, injector, handler.getLooper());
mHbmObserver = new HbmObserver(injector, mVotesStorage, BackgroundThread.getHandler(),
mDeviceConfigDisplaySettings);
if (displayManagerFlags.isRestrictDisplayModesEnabled()) {
@@ -275,6 +277,9 @@ public class DisplayModeDirector {
mSensorObserver.observe();
mHbmObserver.observe();
mSkinThermalStatusObserver.observe();
+ if (mDisplayManagerFlags.isDisplayConfigErrorHalEnabled()) {
+ mModeChangeObserver.observe();
+ }
synchronized (mLock) {
// We may have a listener already registered before the call to start, so go ahead and
// notify them to pick up our newly initialized state.
diff --git a/services/core/java/com/android/server/display/mode/ModeChangeObserver.java b/services/core/java/com/android/server/display/mode/ModeChangeObserver.java
new file mode 100644
index 000000000000..bbc13cc6ae7e
--- /dev/null
+++ b/services/core/java/com/android/server/display/mode/ModeChangeObserver.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.mode;
+
+import android.os.Looper;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.view.Display;
+import android.view.DisplayAddress;
+import android.view.DisplayEventReceiver;
+
+import com.android.internal.annotations.KeepForWeakReference;
+
+import java.util.HashSet;
+import java.util.Set;
+
+final class ModeChangeObserver {
+ private static final String TAG = "ModeChangeObserver";
+
+ private final VotesStorage mVotesStorage;
+ private final DisplayModeDirector.Injector mInjector;
+
+ @SuppressWarnings("unused")
+ @KeepForWeakReference
+ private DisplayEventReceiver mModeChangeListener;
+ private final SparseArray<Set<Integer>> mRejectedModesByDisplay = new SparseArray<>();
+ private Looper mLooper;
+
+ ModeChangeObserver(VotesStorage votesStorage, DisplayModeDirector.Injector injector,
+ Looper looper) {
+ mVotesStorage = votesStorage;
+ mInjector = injector;
+ mLooper = looper;
+ }
+
+ void observe() {
+ mModeChangeListener = new DisplayEventReceiver(mLooper) {
+ @Override
+ public void onModeRejected(long physicalDisplayId, int modeId) {
+ Slog.d(TAG, "Mode Rejected event received");
+ int displayId = getLogicalDisplayId(physicalDisplayId);
+ if (displayId < 0) {
+ Slog.e(TAG, "Logical Display Id not found");
+ return;
+ }
+ populateRejectedModesListByDisplay(displayId, modeId);
+ }
+
+ @Override
+ public void onHotplug(long timestampNanos, long physicalDisplayId, boolean connected) {
+ Slog.d(TAG, "Hotplug event received");
+ if (!connected) {
+ int displayId = getLogicalDisplayId(physicalDisplayId);
+ if (displayId < 0) {
+ Slog.e(TAG, "Logical Display Id not found");
+ return;
+ }
+ clearRejectedModesListByDisplay(displayId);
+ }
+ }
+ };
+ }
+
+ private int getLogicalDisplayId(long rejectedModePhysicalDisplayId) {
+ Display[] displays = mInjector.getDisplays();
+
+ for (Display display : displays) {
+ DisplayAddress address = display.getAddress();
+ if (address instanceof DisplayAddress.Physical physical) {
+ long physicalDisplayId = physical.getPhysicalDisplayId();
+ if (physicalDisplayId == rejectedModePhysicalDisplayId) {
+ return display.getDisplayId();
+ }
+ }
+ }
+ return -1;
+ }
+
+ private void populateRejectedModesListByDisplay(int displayId, int rejectedModeId) {
+ Set<Integer> alreadyRejectedModes = mRejectedModesByDisplay.get(displayId);
+ if (alreadyRejectedModes == null) {
+ alreadyRejectedModes = new HashSet<>();
+ mRejectedModesByDisplay.put(displayId, alreadyRejectedModes);
+ }
+ alreadyRejectedModes.add(rejectedModeId);
+ mVotesStorage.updateVote(displayId, Vote.PRIORITY_REJECTED_MODES,
+ Vote.forRejectedModes(alreadyRejectedModes));
+ }
+
+ private void clearRejectedModesListByDisplay(int displayId) {
+ mRejectedModesByDisplay.remove(displayId);
+ mVotesStorage.updateVote(displayId, Vote.PRIORITY_REJECTED_MODES, null);
+ }
+}
diff --git a/services/core/java/com/android/server/display/mode/RejectedModesVote.java b/services/core/java/com/android/server/display/mode/RejectedModesVote.java
new file mode 100644
index 000000000000..db8c8527844b
--- /dev/null
+++ b/services/core/java/com/android/server/display/mode/RejectedModesVote.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.mode;
+
+import android.annotation.NonNull;
+
+import java.util.Collections;
+import java.util.Set;
+
+public class RejectedModesVote implements Vote {
+
+ final Set<Integer> mModeIds;
+
+ RejectedModesVote(Set<Integer> modeIds) {
+ mModeIds = Collections.unmodifiableSet(modeIds);
+ }
+ @Override
+ public void updateSummary(@NonNull VoteSummary summary) {
+ summary.rejectedModeIds.addAll(mModeIds);
+ }
+
+ @Override
+ public String toString() {
+ return "RejectedModesVote{ mModeIds=" + mModeIds + " }";
+ }
+}
diff --git a/services/core/java/com/android/server/display/mode/Vote.java b/services/core/java/com/android/server/display/mode/Vote.java
index f5abb0561ce7..428ccedf8760 100644
--- a/services/core/java/com/android/server/display/mode/Vote.java
+++ b/services/core/java/com/android/server/display/mode/Vote.java
@@ -25,6 +25,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
interface Vote {
// DEFAULT_RENDER_FRAME_RATE votes for render frame rate [0, DEFAULT]. As the lowest
@@ -82,68 +83,73 @@ interface Vote {
int PRIORITY_APP_REQUEST_SIZE = 7;
+ // PRIORITY_REJECTED_MODES rejects the modes for which the mode config failed
+ // so that the modeset can be retried for next available mode after filtering
+ // out the rejected modes for the connected display
+ int PRIORITY_REJECTED_MODES = 8;
+
// PRIORITY_USER_SETTING_PEAK_REFRESH_RATE restricts physical refresh rate to
// [0, max(PEAK, MIN)], depending on user settings peakRR/minRR values
- int PRIORITY_USER_SETTING_PEAK_REFRESH_RATE = 8;
+ int PRIORITY_USER_SETTING_PEAK_REFRESH_RATE = 9;
// PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE has a higher priority than
// PRIORITY_USER_SETTING_PEAK_REFRESH_RATE and will limit render rate to [0, max(PEAK, MIN)]
// in case physical refresh rate vote is discarded (due to other high priority votes),
// render rate vote can still apply
- int PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE = 9;
+ int PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE = 10;
// Restrict all displays physical refresh rate to 60Hz when external display is connected.
// It votes [59Hz, 61Hz].
- int PRIORITY_SYNCHRONIZED_REFRESH_RATE = 10;
+ int PRIORITY_SYNCHRONIZED_REFRESH_RATE = 11;
// PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE has a higher priority than
// PRIORITY_SYNCHRONIZED_REFRESH_RATE and will limit render rate to [59Hz, 61Hz].
// In case physical refresh rate vote discarded (due to physical refresh rate not supported),
// render rate vote can still apply.
- int PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE = 11;
+ int PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE = 12;
// Restrict displays max available resolution and refresh rates. It votes [0, LIMIT]
- int PRIORITY_LIMIT_MODE = 12;
+ int PRIORITY_LIMIT_MODE = 13;
// To avoid delay in switching between 60HZ -> 90HZ when activating LHBM, set refresh
// rate to max value (same as for PRIORITY_UDFPS) on lock screen
- int PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE = 13;
+ int PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE = 14;
// For concurrent displays we want to limit refresh rate on all displays
- int PRIORITY_LAYOUT_LIMITED_REFRESH_RATE = 14;
+ int PRIORITY_LAYOUT_LIMITED_REFRESH_RATE = 15;
// For concurrent displays we want to limit refresh rate on all displays
- int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 15;
+ int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 16;
// For internal application to limit display modes to specific ids
- int PRIORITY_SYSTEM_REQUESTED_MODES = 16;
+ int PRIORITY_SYSTEM_REQUESTED_MODES = 17;
// PRIORITY_LOW_POWER_MODE_MODES limits display modes to specific refreshRate-vsync pairs if
// Settings.Global.LOW_POWER_MODE is on.
// Lower priority that PRIORITY_LOW_POWER_MODE_RENDER_RATE and if discarded (due to other
// higher priority votes), render rate limit can still apply
- int PRIORITY_LOW_POWER_MODE_MODES = 17;
+ int PRIORITY_LOW_POWER_MODE_MODES = 18;
// PRIORITY_LOW_POWER_MODE_RENDER_RATE force the render frame rate to [0, 60HZ] if
// Settings.Global.LOW_POWER_MODE is on.
- int PRIORITY_LOW_POWER_MODE_RENDER_RATE = 18;
+ int PRIORITY_LOW_POWER_MODE_RENDER_RATE = 19;
// PRIORITY_FLICKER_REFRESH_RATE_SWITCH votes for disabling refresh rate switching. If the
// higher priority voters' result is a range, it will fix the rate to a single choice.
// It's used to avoid refresh rate switches in certain conditions which may result in the
// user seeing the display flickering when the switches occur.
- int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 19;
+ int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 20;
// Force display to [0, 60HZ] if skin temperature is at or above CRITICAL.
- int PRIORITY_SKIN_TEMPERATURE = 20;
+ int PRIORITY_SKIN_TEMPERATURE = 21;
// The proximity sensor needs the refresh rate to be locked in order to function, so this is
// set to a high priority.
- int PRIORITY_PROXIMITY = 21;
+ int PRIORITY_PROXIMITY = 22;
// The Under-Display Fingerprint Sensor (UDFPS) needs the refresh rate to be locked in order
// to function, so this needs to be the highest priority of all votes.
- int PRIORITY_UDFPS = 22;
+ int PRIORITY_UDFPS = 23;
@IntDef(prefix = { "PRIORITY_" }, value = {
PRIORITY_DEFAULT_RENDER_FRAME_RATE,
@@ -154,6 +160,7 @@ interface Vote {
PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE,
PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE,
PRIORITY_APP_REQUEST_SIZE,
+ PRIORITY_REJECTED_MODES,
PRIORITY_USER_SETTING_PEAK_REFRESH_RATE,
PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE,
PRIORITY_SYNCHRONIZED_REFRESH_RATE,
@@ -245,6 +252,10 @@ interface Vote {
return new SupportedModesVote(modeIds);
}
+ static Vote forRejectedModes(Set<Integer> modeIds) {
+ return new RejectedModesVote(modeIds);
+ }
+
static String priorityToString(int priority) {
switch (priority) {
case PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE:
@@ -253,6 +264,8 @@ interface Vote {
return "PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE";
case PRIORITY_APP_REQUEST_SIZE:
return "PRIORITY_APP_REQUEST_SIZE";
+ case PRIORITY_REJECTED_MODES:
+ return "PRIORITY_REJECTED_MODES";
case PRIORITY_DEFAULT_RENDER_FRAME_RATE:
return "PRIORITY_DEFAULT_REFRESH_RATE";
case PRIORITY_FLICKER_REFRESH_RATE:
diff --git a/services/core/java/com/android/server/display/mode/VoteSummary.java b/services/core/java/com/android/server/display/mode/VoteSummary.java
index 00a922630d8e..41664930fc2e 100644
--- a/services/core/java/com/android/server/display/mode/VoteSummary.java
+++ b/services/core/java/com/android/server/display/mode/VoteSummary.java
@@ -55,6 +55,11 @@ final class VoteSummary {
@Nullable
public List<Integer> supportedModeIds;
+ /**
+ * set of rejected modes due to mode config failure for connected display
+ */
+ public Set<Integer> rejectedModeIds = new HashSet<>();
+
final boolean mIsDisplayResolutionRangeVotingEnabled;
private final boolean mSupportedModesVoteEnabled;
@@ -132,6 +137,9 @@ final class VoteSummary {
if (!validateModeSupported(mode)) {
continue;
}
+ if (!validateModeRejected(mode)) {
+ continue;
+ }
if (!validateModeSize(mode)) {
continue;
}
@@ -285,6 +293,22 @@ final class VoteSummary {
return false;
}
+ private boolean validateModeRejected(Display.Mode mode) {
+ if (rejectedModeIds == null) {
+ return true;
+ }
+ if (!rejectedModeIds.contains(mode.getModeId())) {
+ return true;
+ }
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode" + mode.getModeId()
+ + ", is a rejectedMode"
+ + ": mode.modeId=" + mode.getModeId()
+ + ", rejectedModeIds=" + rejectedModeIds);
+ }
+ return false;
+ }
+
private boolean validateRefreshRatesSupported(Display.Mode mode) {
if (supportedRefreshRates == null || !mSupportedModesVoteEnabled) {
return true;
@@ -397,6 +421,7 @@ final class VoteSummary {
requestedRefreshRates.clear();
supportedRefreshRates = null;
supportedModeIds = null;
+ rejectedModeIds.clear();
if (mLoggingEnabled) {
Slog.i(TAG, "Summary reset: " + this);
}
@@ -421,6 +446,7 @@ final class VoteSummary {
+ ", requestRefreshRates=" + requestedRefreshRates
+ ", supportedRefreshRates=" + supportedRefreshRates
+ ", supportedModeIds=" + supportedModeIds
+ + ", rejectedModeIds=" + rejectedModeIds
+ ", mIsDisplayResolutionRangeVotingEnabled="
+ mIsDisplayResolutionRangeVotingEnabled
+ ", mSupportedModesVoteEnabled=" + mSupportedModesVoteEnabled
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
index 236333ee433d..18ae0446b3e0 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
@@ -303,6 +303,10 @@ abstract class HdmiCecFeatureAction {
return mSource.getDeviceInfo().getPhysicalAddress();
}
+ protected final int getServicePath() {
+ return mService.getPhysicalAddress();
+ }
+
protected final void sendUserControlPressedAndReleased(int targetAddress, int uiCommand) {
mSource.sendUserControlPressedAndReleased(targetAddress, uiCommand);
}
diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
index 256905d50dc1..9f6322d9b229 100644
--- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
+++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
@@ -152,7 +152,8 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
// If the device wasn´t the active source yet,
// this makes it the active source and wakes it up.
mSource.mService.setAndBroadcastActiveSourceFromOneDeviceType(
- mTargetAddress, getSourcePath(), "OneTouchPlayAction#broadcastActiveSource()");
+ mTargetAddress, getServicePath(),
+ "OneTouchPlayAction#broadcastActiveSource()");
// When OneTouchPlay is called, client side should be responsible to send out the intent
// of which internal source, for example YouTube, it would like to switch to.
// Here we only update the active port and the active source records in the local
diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
index db1e6b465ff8..5ee9452c6a53 100644
--- a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
+++ b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
@@ -66,6 +66,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider {
private final int mUserId;
private final Handler mHandler;
private final boolean mIsSelfScanOnlyProvider;
+ private final boolean mSupportsSystemMediaRouting;
private final ServiceConnection mServiceConnection = new ServiceConnectionImpl();
// Connection state
@@ -95,12 +96,14 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider {
@NonNull Looper looper,
@NonNull ComponentName componentName,
boolean isSelfScanOnlyProvider,
+ boolean supportsSystemMediaRouting,
int userId) {
super(componentName, /* isSystemRouteProvider= */ false);
mContext = Objects.requireNonNull(context, "Context must not be null.");
mRequestIdToSessionCreationRequest = new LongSparseArray<>();
mSessionOriginalIdToTransferRequest = new HashMap<>();
mIsSelfScanOnlyProvider = isSelfScanOnlyProvider;
+ mSupportsSystemMediaRouting = supportsSystemMediaRouting;
mUserId = userId;
mHandler = new Handler(looper);
}
@@ -651,11 +654,12 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider {
}
return TextUtils.formatSimple(
"ProviderServiceProxy - package: %s, bound: %b, connection (active:%b, ready:%b), "
- + "pending (session creations: %d, transfers: %d)",
+ + "system media=%b, pending (session creations: %d, transfers: %d)",
mComponentName.getPackageName(),
mBound,
mActiveConnection != null,
mConnectionReady,
+ mSupportsSystemMediaRouting,
pendingSessionCreationCount,
pendingTransferCount);
}
@@ -697,7 +701,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider {
Connection(IMediaRoute2ProviderService serviceBinder) {
mService = serviceBinder;
- mCallbackStub = new ServiceCallbackStub(this);
+ mCallbackStub = new ServiceCallbackStub(this, mSupportsSystemMediaRouting);
}
public boolean register() {
@@ -811,9 +815,11 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider {
private static final class ServiceCallbackStub extends
IMediaRoute2ProviderServiceCallback.Stub {
private final WeakReference<Connection> mConnectionRef;
+ private final boolean mAllowSystemMediaRoutes;
- ServiceCallbackStub(Connection connection) {
+ ServiceCallbackStub(Connection connection, boolean allowSystemMediaRoutes) {
mConnectionRef = new WeakReference<>(connection);
+ mAllowSystemMediaRoutes = allowSystemMediaRoutes;
}
public void dispose() {
@@ -846,6 +852,13 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider {
+ "Disallowed route: "
+ route);
}
+
+ if (route.supportsSystemMediaRouting() && !mAllowSystemMediaRoutes) {
+ throw new SecurityException(
+ "This provider is not allowed to publish routes that support system"
+ + " media routing. Disallowed route: "
+ + route);
+ }
}
Connection connection = mConnectionRef.get();
diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
index 93ef6f044e1b..69c460e0f19d 100644
--- a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
+++ b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
@@ -17,7 +17,9 @@
package com.android.server.media;
import static android.content.pm.PackageManager.GET_RESOLVED_FILTER;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import android.Manifest;
import android.annotation.NonNull;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -130,22 +132,33 @@ final class MediaRoute2ProviderWatcher {
ServiceInfo serviceInfo = resolveInfo.serviceInfo;
if (serviceInfo != null) {
boolean isSelfScanOnlyProvider = false;
+ boolean supportsSystemMediaRouting = false;
Iterator<String> categoriesIterator = resolveInfo.filter.categoriesIterator();
if (categoriesIterator != null) {
while (categoriesIterator.hasNext()) {
+ String category = categoriesIterator.next();
isSelfScanOnlyProvider |=
- MediaRoute2ProviderService.CATEGORY_SELF_SCAN_ONLY.equals(
- categoriesIterator.next());
+ MediaRoute2ProviderService.CATEGORY_SELF_SCAN_ONLY.equals(category);
+ supportsSystemMediaRouting |=
+ MediaRoute2ProviderService.SERVICE_INTERFACE_SYSTEM_MEDIA.equals(
+ category);
}
}
int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name);
if (sourceIndex < 0) {
+ supportsSystemMediaRouting &= Flags.enableMirroringInMediaRouter2();
+ supportsSystemMediaRouting &=
+ mPackageManager.checkPermission(
+ Manifest.permission.MODIFY_AUDIO_ROUTING,
+ serviceInfo.packageName)
+ == PERMISSION_GRANTED;
MediaRoute2ProviderServiceProxy proxy =
new MediaRoute2ProviderServiceProxy(
mContext,
mHandler.getLooper(),
new ComponentName(serviceInfo.packageName, serviceInfo.name),
isSelfScanOnlyProvider,
+ supportsSystemMediaRouting,
mUserId);
Slog.i(
TAG,
diff --git a/services/core/java/com/android/server/media/quality/MediaQualityService.java b/services/core/java/com/android/server/media/quality/MediaQualityService.java
index 1673b8e6a0af..f363d5852354 100644
--- a/services/core/java/com/android/server/media/quality/MediaQualityService.java
+++ b/services/core/java/com/android/server/media/quality/MediaQualityService.java
@@ -31,6 +31,7 @@ import android.media.quality.PictureProfile;
import android.media.quality.PictureProfileHandle;
import android.media.quality.SoundProfile;
import android.media.quality.SoundProfileHandle;
+import android.os.Binder;
import android.os.PersistableBundle;
import android.os.UserHandle;
import android.util.Log;
@@ -58,6 +59,7 @@ public class MediaQualityService extends SystemService {
private static final boolean DEBUG = false;
private static final String TAG = "MediaQualityService";
+ private static final int MAX_UUID_GENERATION_ATTEMPTS = 10;
private final Context mContext;
private final MediaQualityDbHelper mMediaQualityDbHelper;
private final BiMap<Long, String> mPictureProfileTempIdMap;
@@ -85,12 +87,12 @@ public class MediaQualityService extends SystemService {
public PictureProfile createPictureProfile(PictureProfile pp, UserHandle user) {
SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase();
- ContentValues values = new ContentValues();
- values.put(BaseParameters.PARAMETER_TYPE, pp.getProfileType());
- values.put(BaseParameters.PARAMETER_NAME, pp.getName());
- values.put(BaseParameters.PARAMETER_PACKAGE, pp.getPackageName());
- values.put(BaseParameters.PARAMETER_INPUT_ID, pp.getInputId());
- values.put(mMediaQualityDbHelper.SETTINGS, persistableBundleToJson(pp.getParameters()));
+ ContentValues values = getContentValues(null,
+ pp.getProfileType(),
+ pp.getName(),
+ pp.getPackageName(),
+ pp.getInputId(),
+ pp.getParameters());
// id is auto-generated by SQLite upon successful insertion of row
Long id = db.insert(mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME,
@@ -102,7 +104,18 @@ public class MediaQualityService extends SystemService {
@Override
public void updatePictureProfile(String id, PictureProfile pp, UserHandle user) {
- // TODO: implement
+ Long intId = mPictureProfileTempIdMap.inverse().get(id);
+
+ ContentValues values = getContentValues(intId,
+ pp.getProfileType(),
+ pp.getName(),
+ pp.getPackageName(),
+ pp.getInputId(),
+ pp.getParameters());
+
+ SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase();
+ db.replace(mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME,
+ null, values);
}
@Override
@@ -157,6 +170,11 @@ public class MediaQualityService extends SystemService {
@Override
public List<PictureProfile> getAvailablePictureProfiles(
boolean includeParams, UserHandle user) {
+ String[] packageNames = mContext.getPackageManager().getPackagesForUid(
+ Binder.getCallingUid());
+ if (packageNames != null && packageNames.length == 1 && !packageNames[0].isEmpty()) {
+ return getPictureProfilesByPackage(packageNames[0], includeParams, user);
+ }
return new ArrayList<>();
}
@@ -191,12 +209,12 @@ public class MediaQualityService extends SystemService {
public SoundProfile createSoundProfile(SoundProfile sp, UserHandle user) {
SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase();
- ContentValues values = new ContentValues();
- values.put(BaseParameters.PARAMETER_TYPE, sp.getProfileType());
- values.put(BaseParameters.PARAMETER_NAME, sp.getName());
- values.put(BaseParameters.PARAMETER_PACKAGE, sp.getPackageName());
- values.put(BaseParameters.PARAMETER_INPUT_ID, sp.getInputId());
- values.put(mMediaQualityDbHelper.SETTINGS, persistableBundleToJson(sp.getParameters()));
+ ContentValues values = getContentValues(null,
+ sp.getProfileType(),
+ sp.getName(),
+ sp.getPackageName(),
+ sp.getInputId(),
+ sp.getParameters());
// id is auto-generated by SQLite upon successful insertion of row
Long id = db.insert(mMediaQualityDbHelper.SOUND_QUALITY_TABLE_NAME,
@@ -207,8 +225,18 @@ public class MediaQualityService extends SystemService {
}
@Override
- public void updateSoundProfile(String id, SoundProfile pp, UserHandle user) {
- // TODO: implement
+ public void updateSoundProfile(String id, SoundProfile sp, UserHandle user) {
+ Long intId = mSoundProfileTempIdMap.inverse().get(id);
+
+ ContentValues values = getContentValues(intId,
+ sp.getProfileType(),
+ sp.getName(),
+ sp.getPackageName(),
+ sp.getInputId(),
+ sp.getParameters());
+
+ SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase();
+ db.replace(mMediaQualityDbHelper.SOUND_QUALITY_TABLE_NAME, null, values);
}
@Override
@@ -263,6 +291,11 @@ public class MediaQualityService extends SystemService {
@Override
public List<SoundProfile> getAvailableSoundProfiles(
boolean includeParams, UserHandle user) {
+ String[] packageNames = mContext.getPackageManager().getPackagesForUid(
+ Binder.getCallingUid());
+ if (packageNames != null && packageNames.length == 1 && !packageNames[0].isEmpty()) {
+ return getSoundProfilesByPackage(packageNames[0], includeParams, user);
+ }
return new ArrayList<>();
}
@@ -285,11 +318,16 @@ public class MediaQualityService extends SystemService {
private void populateTempIdMap(BiMap<Long, String> map, Long id) {
if (id != null && map.get(id) == null) {
- String uuid = UUID.randomUUID().toString();
- while (map.inverse().containsKey(uuid)) {
+ String uuid;
+ int attempts = 0;
+ while (attempts < MAX_UUID_GENERATION_ATTEMPTS) {
uuid = UUID.randomUUID().toString();
+ if (!map.inverse().containsKey(uuid)) {
+ map.put(id, uuid);
+ return;
+ }
+ attempts++;
}
- map.put(id, uuid);
}
}
@@ -316,7 +354,7 @@ public class MediaQualityService extends SystemService {
return json.toString();
}
- private PersistableBundle jsonToBundle(String jsonString) {
+ private PersistableBundle jsonToPersistableBundle(String jsonString) {
PersistableBundle bundle = new PersistableBundle();
if (jsonString != null) {
JSONObject jsonObject = null;
@@ -347,6 +385,30 @@ public class MediaQualityService extends SystemService {
return bundle;
}
+ private ContentValues getContentValues(Long dbId, Integer profileType, String name,
+ String packageName, String inputId, PersistableBundle params) {
+ ContentValues values = new ContentValues();
+ if (dbId != null) {
+ values.put(BaseParameters.PARAMETER_ID, dbId);
+ }
+ if (profileType != null) {
+ values.put(BaseParameters.PARAMETER_TYPE, profileType);
+ }
+ if (name != null) {
+ values.put(BaseParameters.PARAMETER_NAME, name);
+ }
+ if (packageName != null) {
+ values.put(BaseParameters.PARAMETER_PACKAGE, packageName);
+ }
+ if (inputId != null) {
+ values.put(BaseParameters.PARAMETER_INPUT_ID, inputId);
+ }
+ if (params != null) {
+ values.put(mMediaQualityDbHelper.SETTINGS, persistableBundleToJson(params));
+ }
+ return values;
+ }
+
private String[] getAllMediaProfileColumns() {
return new String[]{
BaseParameters.PARAMETER_ID,
@@ -365,7 +427,7 @@ public class MediaQualityService extends SystemService {
getName(cursor),
getInputId(cursor),
getPackageName(cursor),
- jsonToBundle(getSettingsString(cursor)),
+ jsonToPersistableBundle(getSettingsString(cursor)),
PictureProfileHandle.NONE
);
}
@@ -377,7 +439,7 @@ public class MediaQualityService extends SystemService {
getName(cursor),
getInputId(cursor),
getPackageName(cursor),
- jsonToBundle(getSettingsString(cursor)),
+ jsonToPersistableBundle(getSettingsString(cursor)),
SoundProfileHandle.NONE
);
}
diff --git a/services/core/java/com/android/server/media/quality/OWNERS b/services/core/java/com/android/server/media/quality/OWNERS
index e455846dd75d..7171aa4ce9b6 100644
--- a/services/core/java/com/android/server/media/quality/OWNERS
+++ b/services/core/java/com/android/server/media/quality/OWNERS
@@ -1,2 +1,3 @@
shubang@google.com
-haofanw@google.com \ No newline at end of file
+haofanw@google.com
+pkandhalu@google.com \ No newline at end of file
diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java
index c09077e349fd..f17ac5c92889 100644
--- a/services/core/java/com/android/server/notification/NotificationUsageStats.java
+++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
+import android.service.notification.RateEstimator;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
diff --git a/services/core/java/com/android/server/pm/InstallDependencyHelper.java b/services/core/java/com/android/server/pm/InstallDependencyHelper.java
index c0ddebeb9868..837adf004df7 100644
--- a/services/core/java/com/android/server/pm/InstallDependencyHelper.java
+++ b/services/core/java/com/android/server/pm/InstallDependencyHelper.java
@@ -78,24 +78,22 @@ public class InstallDependencyHelper {
mPackageInstallerService = packageInstallerService;
}
- void resolveLibraryDependenciesIfNeeded(PackageLite pkg, Computer snapshot, int userId,
- Handler handler, OutcomeReceiver<Void, PackageManagerException> origCallback) {
+ void resolveLibraryDependenciesIfNeeded(List<SharedLibraryInfo> missingLibraries,
+ PackageLite pkg, Computer snapshot, int userId, Handler handler,
+ OutcomeReceiver<Void, PackageManagerException> origCallback) {
CallOnceProxy callback = new CallOnceProxy(handler, origCallback);
try {
- resolveLibraryDependenciesIfNeededInternal(pkg, snapshot, userId, handler, callback);
- } catch (PackageManagerException e) {
- callback.onError(e);
+ resolveLibraryDependenciesIfNeededInternal(
+ missingLibraries, pkg, snapshot, userId, handler, callback);
} catch (Exception e) {
onError(callback, e.getMessage());
}
}
- private void resolveLibraryDependenciesIfNeededInternal(PackageLite pkg, Computer snapshot,
- int userId, Handler handler, CallOnceProxy callback) throws PackageManagerException {
- final List<SharedLibraryInfo> missing =
- mSharedLibraries.collectMissingSharedLibraryInfos(pkg);
-
+ private void resolveLibraryDependenciesIfNeededInternal(List<SharedLibraryInfo> missing,
+ PackageLite pkg, Computer snapshot, int userId, Handler handler,
+ CallOnceProxy callback) {
if (missing.isEmpty()) {
if (DEBUG) {
Slog.d(TAG, "No missing dependency for " + pkg.getPackageName());
@@ -129,6 +127,11 @@ public class InstallDependencyHelper {
}
}
+ List<SharedLibraryInfo> getMissingSharedLibraries(PackageLite pkg)
+ throws PackageManagerException {
+ return mSharedLibraries.collectMissingSharedLibraryInfos(pkg);
+ }
+
void notifySessionComplete(int sessionId) {
if (DEBUG) {
Slog.d(TAG, "Session complete for " + sessionId);
diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java
index b0fe3a97af6e..c96c160deb0f 100644
--- a/services/core/java/com/android/server/pm/InstallRequest.java
+++ b/services/core/java/com/android/server/pm/InstallRequest.java
@@ -170,6 +170,8 @@ final class InstallRequest {
private final boolean mHasAppMetadataFileFromInstaller;
private boolean mKeepArtProfile = false;
+ private final boolean mDependencyInstallerEnabled;
+ private final int mMissingSharedLibraryCount;
// New install
InstallRequest(InstallingSession params) {
@@ -190,6 +192,8 @@ final class InstallRequest {
mRequireUserAction = params.mRequireUserAction;
mPreVerifiedDomains = params.mPreVerifiedDomains;
mHasAppMetadataFileFromInstaller = params.mHasAppMetadataFile;
+ mDependencyInstallerEnabled = params.mDependencyInstallerEnabled;
+ mMissingSharedLibraryCount = params.mMissingSharedLibraryCount;
}
// Install existing package as user
@@ -209,6 +213,8 @@ final class InstallRequest {
mInstallerUidForInstallExisting = installerUid;
mSystem = isSystem;
mHasAppMetadataFileFromInstaller = false;
+ mDependencyInstallerEnabled = false;
+ mMissingSharedLibraryCount = 0;
}
// addForInit
@@ -231,6 +237,8 @@ final class InstallRequest {
mRequireUserAction = USER_ACTION_UNSPECIFIED;
mDisabledPs = disabledPs;
mHasAppMetadataFileFromInstaller = false;
+ mDependencyInstallerEnabled = false;
+ mMissingSharedLibraryCount = 0;
}
@Nullable
@@ -1069,4 +1077,12 @@ final class InstallRequest {
boolean isKeepArtProfile() {
return mKeepArtProfile;
}
+
+ int getMissingSharedLibraryCount() {
+ return mMissingSharedLibraryCount;
+ }
+
+ boolean isDependencyInstallerEnabled() {
+ return mDependencyInstallerEnabled;
+ }
}
diff --git a/services/core/java/com/android/server/pm/InstallingSession.java b/services/core/java/com/android/server/pm/InstallingSession.java
index ccc117566989..6a2bf83ba368 100644
--- a/services/core/java/com/android/server/pm/InstallingSession.java
+++ b/services/core/java/com/android/server/pm/InstallingSession.java
@@ -103,6 +103,8 @@ class InstallingSession {
final DomainSet mPreVerifiedDomains;
final boolean mHasAppMetadataFile;
@Nullable final String mDexoptCompilerFilter;
+ final boolean mDependencyInstallerEnabled;
+ final int mMissingSharedLibraryCount;
// For move install
InstallingSession(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer,
@@ -138,13 +140,16 @@ class InstallingSession {
mPreVerifiedDomains = null;
mHasAppMetadataFile = false;
mDexoptCompilerFilter = null;
+ mDependencyInstallerEnabled = false;
+ mMissingSharedLibraryCount = 0;
}
InstallingSession(int sessionId, File stagedDir, IPackageInstallObserver2 observer,
PackageInstaller.SessionParams sessionParams, InstallSource installSource,
UserHandle user, SigningDetails signingDetails, int installerUid,
PackageLite packageLite, DomainSet preVerifiedDomains, PackageManagerService pm,
- boolean hasAppMetadatafile) {
+ boolean hasAppMetadatafile, boolean dependencyInstallerEnabled,
+ int missingSharedLibraryCount) {
mPm = pm;
mUser = user;
mOriginInfo = OriginInfo.fromStagedFile(stagedDir);
@@ -175,6 +180,8 @@ class InstallingSession {
mPreVerifiedDomains = preVerifiedDomains;
mHasAppMetadataFile = hasAppMetadatafile;
mDexoptCompilerFilter = sessionParams.dexoptCompilerFilter;
+ mDependencyInstallerEnabled = dependencyInstallerEnabled;
+ mMissingSharedLibraryCount = missingSharedLibraryCount;
}
@Override
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 891d66a5d238..c6760431116e 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -31,6 +31,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STOR
import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
import static android.content.pm.PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE;
+import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY;
import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SPLIT;
import static android.content.pm.PackageManager.INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE;
import static android.content.pm.PackageManager.INSTALL_FAILED_SESSION_INVALID;
@@ -109,6 +110,7 @@ import android.content.pm.PackageInstaller.UserActionReason;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.PackageInfoFlags;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.dex.DexMetadataHelper;
import android.content.pm.parsing.ApkLite;
@@ -540,6 +542,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
@GuardedBy("mLock")
private DomainSet mPreVerifiedDomains;
+ private AtomicBoolean mDependencyInstallerEnabled = new AtomicBoolean();
+ private AtomicInteger mMissingSharedLibraryCount = new AtomicInteger();
+
static class FileEntry {
private final int mIndex;
private final InstallationFile mFile;
@@ -3232,6 +3237,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
if (Flags.sdkDependencyInstaller()
&& params.isAutoInstallDependenciesEnabled
&& !isMultiPackage()) {
+ mDependencyInstallerEnabled.set(true);
resolveLibraryDependenciesIfNeeded();
} else {
install();
@@ -3241,8 +3247,20 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private void resolveLibraryDependenciesIfNeeded() {
synchronized (mLock) {
- mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(mPackageLite,
- mPm.snapshotComputer(), userId, mHandler,
+ List<SharedLibraryInfo> missingLibraries = new ArrayList<>();
+ try {
+ missingLibraries = mInstallDependencyHelper.getMissingSharedLibraries(mPackageLite);
+ } catch (PackageManagerException e) {
+ handleDependencyResolutionFailure(e);
+ } catch (Exception e) {
+ handleDependencyResolutionFailure(
+ new PackageManagerException(
+ INSTALL_FAILED_MISSING_SHARED_LIBRARY, e.getMessage()));
+ }
+
+ mMissingSharedLibraryCount.set(missingLibraries.size());
+ mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(missingLibraries,
+ mPackageLite, mPm.snapshotComputer(), userId, mHandler,
new OutcomeReceiver<>() {
@Override
@@ -3252,14 +3270,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
@Override
public void onError(@NonNull PackageManagerException e) {
- final String completeMsg = ExceptionUtils.getCompleteMessage(e);
- setSessionFailed(e.error, completeMsg);
- onSessionDependencyResolveFailure(e.error, completeMsg);
+ handleDependencyResolutionFailure(e);
}
});
}
}
+ private void handleDependencyResolutionFailure(@NonNull PackageManagerException e) {
+ final String completeMsg = ExceptionUtils.getCompleteMessage(e);
+ setSessionFailed(e.error, completeMsg);
+ onSessionDependencyResolveFailure(e.error, completeMsg);
+ PackageMetrics.onDependencyInstallationFailure(
+ sessionId, getPackageName(), e.error, mInstallerUid, params,
+ mMissingSharedLibraryCount.get());
+ }
+
/**
* Stages this session for install and returns a
* {@link InstallingSession} representing this new staged state.
@@ -3327,7 +3352,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
synchronized (mLock) {
return new InstallingSession(sessionId, stageDir, localObserver, params, mInstallSource,
user, mSigningDetails, mInstallerUid, mPackageLite, mPreVerifiedDomains, mPm,
- mHasAppMetadataFile);
+ mHasAppMetadataFile, mDependencyInstallerEnabled.get(),
+ mMissingSharedLibraryCount.get());
}
}
diff --git a/services/core/java/com/android/server/pm/PackageMetrics.java b/services/core/java/com/android/server/pm/PackageMetrics.java
index 0acadb129f2b..856d6a726da5 100644
--- a/services/core/java/com/android/server/pm/PackageMetrics.java
+++ b/services/core/java/com/android/server/pm/PackageMetrics.java
@@ -32,7 +32,9 @@ import android.app.admin.SecurityLog;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
+import android.content.pm.DataLoaderType;
import android.content.pm.Flags;
+import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.parsing.ApkLiteParseUtils;
@@ -173,7 +175,10 @@ final class PackageMetrics {
mInstallRequest.isInstallInherit() /* is_inherit */,
mInstallRequest.isInstallForUsers() /* is_installing_existing_as_user */,
mInstallRequest.isInstallMove() /* is_move_install */,
- false /* is_staged */
+ false /* is_staged */,
+ mInstallRequest
+ .isDependencyInstallerEnabled() /* is_install_dependencies_enabled */,
+ mInstallRequest.getMissingSharedLibraryCount() /* missing_dependencies_count */
);
}
@@ -323,7 +328,53 @@ final class PackageMetrics {
verifyingSession.isInherit() /* is_inherit */,
false /* is_installing_existing_as_user */,
false /* is_move_install */,
- verifyingSession.isStaged() /* is_staged */
+ verifyingSession.isStaged() /* is_staged */,
+ false /* is_install_dependencies_enabled */,
+ 0 /* missing_dependencies_count */
+ );
+ }
+
+ static void onDependencyInstallationFailure(
+ int sessionId, String packageName, int errorCode, int installerPackageUid,
+ PackageInstaller.SessionParams params, int missingDependenciesCount) {
+ if (params == null) {
+ return;
+ }
+ int dataLoaderType = DataLoaderType.NONE;
+ if (params.dataLoaderParams != null) {
+ dataLoaderType = params.dataLoaderParams.getType();
+ }
+
+ FrameworkStatsLog.write(FrameworkStatsLog.PACKAGE_INSTALLATION_SESSION_REPORTED,
+ sessionId /* session_id */,
+ packageName /* package_name */,
+ INVALID_UID /* uid */,
+ null /* user_ids */,
+ null /* user_types */,
+ null /* original_user_ids */,
+ null /* original_user_types */,
+ errorCode /* public_return_code */,
+ 0 /* internal_error_code */,
+ 0 /* apks_size_bytes */,
+ 0 /* version_code */,
+ null /* install_steps */,
+ null /* step_duration_millis */,
+ 0 /* total_duration_millis */,
+ 0 /* install_flags */,
+ installerPackageUid /* installer_package_uid */,
+ INVALID_UID /* original_installer_package_uid */,
+ dataLoaderType /* data_loader_type */,
+ params.requireUserAction /* user_action_required_type */,
+ (params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0 /* is_instant */,
+ false /* is_replace */,
+ false /* is_system */,
+ params.mode
+ == PackageInstaller.SessionParams.MODE_INHERIT_EXISTING /* is_inherit */,
+ false /* is_installing_existing_as_user */,
+ false /* is_move_install */,
+ params.isStaged /* is_staged */,
+ true /* is_install_dependencies_enabled */,
+ missingDependenciesCount /* missing_dependencies_count */
);
}
diff --git a/services/core/java/com/android/server/pm/VerifyingSession.java b/services/core/java/com/android/server/pm/VerifyingSession.java
index 542ae8eb9207..dd60a155f2fb 100644
--- a/services/core/java/com/android/server/pm/VerifyingSession.java
+++ b/services/core/java/com/android/server/pm/VerifyingSession.java
@@ -16,11 +16,7 @@
package com.android.server.pm;
-import static android.content.Intent.EXTRA_LONG_VERSION_CODE;
-import static android.content.Intent.EXTRA_PACKAGE_NAME;
-import static android.content.Intent.EXTRA_VERSION_CODE;
import static android.content.pm.PackageInstaller.SessionParams.MODE_INHERIT_EXISTING;
-import static android.content.pm.PackageManager.EXTRA_VERIFICATION_ID;
import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
import static android.content.pm.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V4;
@@ -40,9 +36,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
-import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.DataLoaderType;
@@ -68,7 +62,6 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.incremental.IncrementalManager;
import android.provider.DeviceConfig;
-import android.provider.Settings;
import android.text.TextUtils;
import android.util.Pair;
import android.util.Slog;
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index d5e4c3f1eb9f..f1a481155458 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -88,12 +88,10 @@ import static com.android.hardware.input.Flags.enableTalkbackAndMagnifierKeyGest
import static com.android.hardware.input.Flags.inputManagerLifecycleSupport;
import static com.android.hardware.input.Flags.keyboardA11yShortcutControl;
import static com.android.hardware.input.Flags.modifierShortcutDump;
-import static com.android.hardware.input.Flags.overridePowerKeyBehaviorInFocusedWindow;
import static com.android.hardware.input.Flags.useKeyGestureEventHandler;
-import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY;
-import static com.android.server.GestureLauncherService.DOUBLE_POWER_TAP_COUNT_THRESHOLD;
import static com.android.server.flags.Flags.modifierShortcutManagerMultiuser;
import static com.android.server.flags.Flags.newBugreportKeyboardShortcut;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED;
@@ -434,16 +432,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
"android.intent.action.VOICE_ASSIST_RETAIL";
/**
- * Maximum amount of time in milliseconds between consecutive power onKeyDown events to be
- * considered a multi-press, only used for the power button.
- * Note: To maintain backwards compatibility for the power button, we are measuring the times
- * between consecutive down events instead of the first tap's up event and the second tap's
- * down event.
- */
- @VisibleForTesting public static final int POWER_MULTI_PRESS_TIMEOUT_MILLIS =
- ViewConfiguration.getMultiPressTimeout();
-
- /**
* Lock protecting internal state. Must not call out into window
* manager with lock held. (This lock will be acquired in places
* where the window manager is calling in with its own lock held.)
@@ -504,32 +492,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private WindowWakeUpPolicy mWindowWakeUpPolicy;
- /**
- * The three variables below are used for custom power key gesture detection in
- * PhoneWindowManager. They are used to detect when the power button has been double pressed
- * and, when it does happen, makes the behavior overrideable by the app.
- *
- * We cannot use the {@link PowerKeyRule} for this because multi-press power gesture detection
- * and behaviors are handled by {@link com.android.server.GestureLauncherService}, and the
- * {@link PowerKeyRule} only handles single and long-presses of the power button. As a result,
- * overriding the double tap behavior requires custom gesture detection here that mimics the
- * logic in {@link com.android.server.GestureLauncherService}.
- *
- * Long-term, it would be beneficial to move all power gesture detection to
- * {@link PowerKeyRule} so that this custom logic isn't required.
- */
- // Time of last power down event.
- private long mLastPowerDown;
-
- // Number of power button events consecutively triggered (within a specific timeout threshold).
- private int mPowerButtonConsecutiveTaps = 0;
-
- // Whether a double tap of the power button has been detected.
- volatile boolean mDoubleTapPowerDetected;
-
- // Runnable that is queued on a delay when the first power keyDown event is sent to the app.
- private Runnable mPowerKeyDelayedRunnable = null;
-
boolean mSafeMode;
// Whether to allow dock apps with METADATA_DOCK_HOME to temporarily take over the Home key.
@@ -1135,11 +1097,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mPowerKeyHandled = mPowerKeyHandled || hungUp
|| handledByPowerManager || isKeyGestureTriggered
|| mKeyCombinationManager.isPowerKeyIntercepted();
-
- if (overridePowerKeyBehaviorInFocusedWindow()) {
- mPowerKeyHandled |= mDoubleTapPowerDetected;
- }
-
if (!mPowerKeyHandled) {
if (!interactive) {
wakeUpFromWakeKey(event);
@@ -2712,19 +2669,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (mShouldEarlyShortPressOnPower) {
return;
}
- // TODO(b/380433365): Remove deferring single power press action when refactoring.
- if (overridePowerKeyBehaviorInFocusedWindow()) {
- mDeferredKeyActionExecutor.cancelQueuedAction(KEYCODE_POWER);
- mDeferredKeyActionExecutor.queueKeyAction(
- KEYCODE_POWER,
- downTime,
- () -> {
- powerPress(downTime, 1 /*count*/, displayId);
- });
- } else {
- powerPress(downTime, 1 /*count*/, displayId);
- }
-
+ powerPress(downTime, 1 /*count*/, displayId);
}
@Override
@@ -2755,17 +2700,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
void onMultiPress(long downTime, int count, int displayId) {
- if (overridePowerKeyBehaviorInFocusedWindow()) {
- mDeferredKeyActionExecutor.cancelQueuedAction(KEYCODE_POWER);
- mDeferredKeyActionExecutor.queueKeyAction(
- KEYCODE_POWER,
- downTime,
- () -> {
- powerPress(downTime, count, displayId);
- });
- } else {
- powerPress(downTime, count, displayId);
- }
+ powerPress(downTime, count, displayId);
}
@Override
@@ -3542,12 +3477,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
- if (overridePowerKeyBehaviorInFocusedWindow() && event.getKeyCode() == KEYCODE_POWER
- && event.getAction() == KeyEvent.ACTION_UP
- && mDoubleTapPowerDetected) {
- mDoubleTapPowerDetected = false;
- }
-
return needToConsumeKey ? keyConsumed : keyNotConsumed;
}
@@ -4063,8 +3992,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
sendSystemKeyToStatusBarAsync(event);
return true;
}
- case KeyEvent.KEYCODE_POWER:
- return interceptPowerKeyBeforeDispatching(focusedToken, event);
case KeyEvent.KEYCODE_SCREENSHOT:
if (firstDown) {
interceptScreenshotChord(SCREENSHOT_KEY_OTHER, 0 /*pressDelay*/);
@@ -4120,8 +4047,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
sendSystemKeyToStatusBarAsync(event);
return true;
}
- case KeyEvent.KEYCODE_POWER:
- return interceptPowerKeyBeforeDispatching(focusedToken, event);
}
if (isValidGlobalKey(keyCode)
&& mGlobalKeyManager.handleGlobalKey(mContext, keyCode, event)) {
@@ -4132,90 +4057,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return (metaState & KeyEvent.META_META_ON) != 0;
}
- /**
- * Called by interceptKeyBeforeDispatching to handle interception logic for KEYCODE_POWER
- * KeyEvents.
- *
- * @return true if intercepting the key, false if sending to app.
- */
- private boolean interceptPowerKeyBeforeDispatching(IBinder focusedToken, KeyEvent event) {
- if (!overridePowerKeyBehaviorInFocusedWindow()) {
- //Flag disabled: intercept the power key and do not send to app.
- return true;
- }
- if (event.getKeyCode() != KEYCODE_POWER) {
- Log.wtf(TAG, "interceptPowerKeyBeforeDispatching received a non-power KeyEvent "
- + "with key code: " + event.getKeyCode());
- return false;
- }
-
- // Intercept keys (don't send to app) for 3x, 4x, 5x gestures)
- if (mPowerButtonConsecutiveTaps > DOUBLE_POWER_TAP_COUNT_THRESHOLD) {
- setDeferredKeyActionsExecutableAsync(KEYCODE_POWER, event.getDownTime());
- return true;
- }
-
- // UP key; just reuse the original decision.
- if (event.getAction() == KeyEvent.ACTION_UP) {
- final Set<Integer> consumedKeys = mConsumedKeysForDevice.get(event.getDeviceId());
- return consumedKeys != null
- && consumedKeys.contains(event.getKeyCode());
- }
-
- KeyInterceptionInfo info =
- mWindowManagerInternal.getKeyInterceptionInfoFromToken(focusedToken);
-
- if (info == null || !mButtonOverridePermissionChecker.canWindowOverridePowerKey(mContext,
- info.windowOwnerUid, info.inputFeaturesFlags)) {
- // The focused window does not have the permission to override power key behavior.
- if (DEBUG_INPUT) {
- String interceptReason = "";
- if (info == null) {
- interceptReason = "Window is null";
- } else if (!mButtonOverridePermissionChecker.canAppOverrideSystemKey(mContext,
- info.windowOwnerUid)) {
- interceptReason = "Application does not have "
- + "OVERRIDE_SYSTEM_KEY_BEHAVIOR_IN_FOCUSED_WINDOW permission";
- } else {
- interceptReason = "Window does not have inputFeatureFlag set";
- }
-
- Log.d(TAG, String.format("Intercepting KEYCODE_POWER event. action=%d, "
- + "eventTime=%d to window=%s. interceptReason=%s. "
- + "mDoubleTapPowerDetected=%b",
- event.getAction(), event.getEventTime(), (info != null)
- ? info.windowTitle : "null", interceptReason,
- mDoubleTapPowerDetected));
- }
- // Intercept the key (i.e. do not send to app)
- setDeferredKeyActionsExecutableAsync(KEYCODE_POWER, event.getDownTime());
- return true;
- }
-
- if (DEBUG_INPUT) {
- Log.d(TAG, String.format("Sending KEYCODE_POWER to app. action=%d, "
- + "eventTime=%d to window=%s. mDoubleTapPowerDetected=%b",
- event.getAction(), event.getEventTime(), info.windowTitle,
- mDoubleTapPowerDetected));
- }
-
- if (!mDoubleTapPowerDetected) {
- //Single press: post a delayed runnable for the single press power action that will be
- // called if it's not cancelled by a double press.
- final var downTime = event.getDownTime();
- mPowerKeyDelayedRunnable = () ->
- setDeferredKeyActionsExecutableAsync(KEYCODE_POWER, downTime);
- mHandler.postDelayed(mPowerKeyDelayedRunnable, POWER_MULTI_PRESS_TIMEOUT_MILLIS);
- } else if (mPowerKeyDelayedRunnable != null) {
- //Double press detected: cancel the single press runnable.
- mHandler.removeCallbacks(mPowerKeyDelayedRunnable);
- mPowerKeyDelayedRunnable = null;
- }
-
- // Focused window has permission. Send to app.
- return false;
- }
-
@SuppressLint("MissingPermission")
private void initKeyGestures() {
if (!useKeyGestureEventHandler()) {
@@ -4792,11 +4633,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return true;
}
- if (overridePowerKeyBehaviorInFocusedWindow() && keyCode == KEYCODE_POWER) {
- handleUnhandledSystemKey(event);
- return true;
- }
-
if (useKeyGestureEventHandler()) {
return false;
}
@@ -5631,13 +5467,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
KeyEvent.actionToString(event.getAction()),
mPowerKeyHandled ? 1 : 0,
mSingleKeyGestureDetector.getKeyPressCounter(KeyEvent.KEYCODE_POWER));
- if (overridePowerKeyBehaviorInFocusedWindow()) {
- result |= ACTION_PASS_TO_USER;
- } else {
- // Any activity on the power button stops the accessibility shortcut
- result &= ~ACTION_PASS_TO_USER;
- }
-
+ // Any activity on the power button stops the accessibility shortcut
+ result &= ~ACTION_PASS_TO_USER;
isWakeKey = false; // wake-up will be handled separately
if (down) {
interceptPowerKeyDown(event, interactiveAndAwake, isKeyGestureTriggered);
@@ -5899,35 +5730,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
if (event.getKeyCode() == KEYCODE_POWER && event.getAction() == KeyEvent.ACTION_DOWN) {
- if (overridePowerKeyBehaviorInFocusedWindow()) {
- if (event.getRepeatCount() > 0) {
- return;
- }
- if (mGestureLauncherService != null) {
- mGestureLauncherService.processPowerKeyDown(event);
- }
-
- if (detectDoubleTapPower(event)) {
- mDoubleTapPowerDetected = true;
-
- // Copy of the event for handler in case the original event gets recycled.
- KeyEvent eventCopy = KeyEvent.obtain(event);
- mDeferredKeyActionExecutor.queueKeyAction(
- KeyEvent.KEYCODE_POWER,
- eventCopy.getEventTime(),
- () -> {
- if (!handleCameraGesture(eventCopy, interactive)) {
- mSingleKeyGestureDetector.interceptKey(
- eventCopy, interactive, defaultDisplayOn);
- } else {
- mSingleKeyGestureDetector.reset();
- }
- eventCopy.recycle();
- });
- return;
- }
- }
-
mPowerKeyHandled = handleCameraGesture(event, interactive);
if (mPowerKeyHandled) {
// handled by camera gesture.
@@ -5939,25 +5741,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mSingleKeyGestureDetector.interceptKey(event, interactive, defaultDisplayOn);
}
- private boolean detectDoubleTapPower(KeyEvent event) {
- if (event.getKeyCode() != KEYCODE_POWER || event.getAction() != KeyEvent.ACTION_DOWN
- || event.getRepeatCount() != 0) {
- return false;
- }
-
- final long powerTapInterval = event.getEventTime() - mLastPowerDown;
- mLastPowerDown = event.getEventTime();
- if (powerTapInterval >= POWER_MULTI_PRESS_TIMEOUT_MILLIS) {
- // Tap too slow for double press
- mPowerButtonConsecutiveTaps = 1;
- } else {
- mPowerButtonConsecutiveTaps++;
- }
-
- return powerTapInterval < POWER_MULTI_PRESS_TIMEOUT_MILLIS
- && mPowerButtonConsecutiveTaps == DOUBLE_POWER_TAP_COUNT_THRESHOLD;
- }
-
// The camera gesture will be detected by GestureLauncherService.
private boolean handleCameraGesture(KeyEvent event, boolean interactive) {
// camera gesture.
@@ -7814,12 +7597,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
null)
== PERMISSION_GRANTED;
}
-
- boolean canWindowOverridePowerKey(Context context, int uid, int inputFeaturesFlags) {
- return canAppOverrideSystemKey(context, uid)
- && (inputFeaturesFlags & WindowManager.LayoutParams
- .INPUT_FEATURE_RECEIVE_POWER_KEY_DOUBLE_PRESS) != 0;
- }
}
private int getTargetDisplayIdForKeyEvent(KeyEvent event) {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 36bc0b93cd7c..ce8dc69e4b26 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -7093,7 +7093,11 @@ public final class PowerManagerService extends SystemService
if ((flags & PowerManager.GO_TO_SLEEP_FLAG_SOFT_SLEEP) != 0) {
if (mFoldGracePeriodProvider.isEnabled()) {
if (!powerGroup.hasWakeLockKeepingScreenOnLocked()) {
+ Slog.d(TAG, "Showing dismissible keyguard");
mNotifier.showDismissibleKeyguard();
+ } else {
+ Slog.i(TAG, "There is a screen wake lock present: "
+ + "sleep request will be ignored");
}
continue; // never actually goes to sleep for SOFT_SLEEP
} else {
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
index 987a84994451..137ea0617f21 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -296,7 +296,11 @@ public final class HintManagerService extends SystemService {
mPowerHalVersion = 0;
mUsesFmq = false;
if (mPowerHal != null) {
- mSupportInfo = getSupportInfo();
+ try {
+ mSupportInfo = getSupportInfo();
+ } catch (RemoteException e) {
+ throw new IllegalStateException("Could not contact PowerHAL!", e);
+ }
}
mDefaultCpuHeadroomCalculationWindowMillis =
new CpuHeadroomParamsInternal().calculationWindowMillis;
@@ -314,7 +318,7 @@ public final class HintManagerService extends SystemService {
}
}
- SupportInfo getSupportInfo() {
+ SupportInfo getSupportInfo() throws RemoteException {
try {
mPowerHalVersion = mPowerHal.getInterfaceVersion();
if (mPowerHalVersion >= 6) {
@@ -325,9 +329,40 @@ public final class HintManagerService extends SystemService {
}
SupportInfo supportInfo = new SupportInfo();
+ supportInfo.usesSessions = isHintSessionSupported();
+ // Global boosts & modes aren't currently relevant for HMS clients
+ supportInfo.boosts = 0;
+ supportInfo.modes = 0;
+ supportInfo.sessionHints = 0;
+ supportInfo.sessionModes = 0;
+ supportInfo.sessionTags = 0;
+
supportInfo.headroom = new SupportInfo.HeadroomSupportInfo();
supportInfo.headroom.isCpuSupported = false;
supportInfo.headroom.isGpuSupported = false;
+ if (isHintSessionSupported()) {
+ if (mPowerHalVersion == 4) {
+ // Assume we support the V4 hints & modes unless specified
+ // otherwise; this is to avoid breaking backwards compat
+ // since we historically just assumed they were.
+ supportInfo.sessionHints = 31; // first 5 bits are ones
+ }
+ if (mPowerHalVersion == 5) {
+ // Assume we support the V5 hints & modes unless specified
+ // otherwise; this is to avoid breaking backwards compat
+ // since we historically just assumed they were.
+
+ // Hal V5 has 8 modes, all of which it assumes are supported,
+ // so we represent that by having the first 8 bits set
+ supportInfo.sessionHints = 255; // first 8 bits are ones
+ // Hal V5 has 1 mode which it assumes is supported, so we
+ // represent that by having the first bit set
+ supportInfo.sessionModes = 1;
+ // Hal V5 has 5 tags, all of which it assumes are supported,
+ // so we represent that by having the first 5 bits set
+ supportInfo.sessionTags = 31;
+ }
+ }
return supportInfo;
}
@@ -1228,7 +1263,7 @@ public final class HintManagerService extends SystemService {
@SessionTag int tag, SessionCreationConfig creationConfig,
SessionConfig config) {
if (!isHintSessionSupported()) {
- throw new UnsupportedOperationException("PowerHAL is not supported!");
+ throw new UnsupportedOperationException("PowerHintSessions are not supported!");
}
java.util.Objects.requireNonNull(token);
@@ -1424,12 +1459,6 @@ public final class HintManagerService extends SystemService {
removeChannelItem(callingTgid, callingUid);
};
- @Override
- public long getHintSessionPreferredRate() {
- return mHintSessionPreferredRate;
- }
-
- @Override
public int getMaxGraphicsPipelineThreadsCount() {
return MAX_GRAPHICS_PIPELINE_THREADS_COUNT;
}
@@ -1561,6 +1590,16 @@ public final class HintManagerService extends SystemService {
mSessionManager = ISessionManager.Stub.asInterface(sessionManager);
}
+ public IHintManager.HintManagerClientData
+ registerClient(@NonNull IHintManager.IHintManagerClient clientBinder) {
+ IHintManager.HintManagerClientData out = new IHintManager.HintManagerClientData();
+ out.preferredRateNanos = mHintSessionPreferredRate;
+ out.maxGraphicsPipelineThreads = getMaxGraphicsPipelineThreadsCount();
+ out.powerHalVersion = mPowerHalVersion;
+ out.supportInfo = mSupportInfo;
+ return out;
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) {
@@ -1568,7 +1607,7 @@ public final class HintManagerService extends SystemService {
}
pw.println("HintSessionPreferredRate: " + mHintSessionPreferredRate);
pw.println("MaxGraphicsPipelineThreadsCount: " + MAX_GRAPHICS_PIPELINE_THREADS_COUNT);
- pw.println("HAL Support: " + isHintSessionSupported());
+ pw.println("Hint Session Support: " + isHintSessionSupported());
pw.println("Active Sessions:");
synchronized (mLock) {
for (int i = 0; i < mActiveSessions.size(); i++) {
diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
index 63e8d9973237..8c588b4c9b98 100644
--- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
+++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
@@ -195,23 +195,22 @@ public class BatteryUsageStatsProvider {
mLastAccumulationMonotonicHistorySize = historySize;
}
- handler.post(() -> accumulateBatteryUsageStats(stats));
+ // No need to store the accumulated stats asynchronously, as the entire accumulation
+ // operation is async
+ handler.post(() -> accumulateBatteryUsageStats(stats, false));
}
/**
* Computes BatteryUsageStats for the period since the last accumulated stats were stored,
- * adds them to the accumulated stats and saves the result.
+ * adds them to the accumulated stats and asynchronously saves the result.
*/
public void accumulateBatteryUsageStats(BatteryStatsImpl stats) {
- AccumulatedBatteryUsageStats accumulatedStats = loadAccumulatedBatteryUsageStats();
+ accumulateBatteryUsageStats(stats, true);
+ }
- final BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder()
- .setMaxStatsAgeMs(0)
- .includeProcessStateData()
- .includePowerStateData()
- .includeScreenStateData()
- .build();
- updateAccumulatedBatteryUsageStats(accumulatedStats, stats, query);
+ private void accumulateBatteryUsageStats(BatteryStatsImpl stats, boolean storeAsync) {
+ AccumulatedBatteryUsageStats accumulatedStats = loadAccumulatedBatteryUsageStats();
+ updateAccumulatedBatteryUsageStats(accumulatedStats, stats);
PowerStatsSpan powerStatsSpan = new PowerStatsSpan(AccumulatedBatteryUsageStatsSection.ID);
powerStatsSpan.addSection(
@@ -220,8 +219,13 @@ public class BatteryUsageStatsProvider {
accumulatedStats.startWallClockTime,
accumulatedStats.endMonotonicTime - accumulatedStats.startMonotonicTime);
mMonotonicClock.write();
- mPowerStatsStore.storePowerStatsSpanAsync(powerStatsSpan,
- accumulatedStats.builder::discard);
+ if (storeAsync) {
+ mPowerStatsStore.storePowerStatsSpanAsync(powerStatsSpan,
+ accumulatedStats.builder::discard);
+ } else {
+ mPowerStatsStore.storePowerStatsSpan(powerStatsSpan);
+ accumulatedStats.builder.discard();
+ }
}
/**
@@ -269,7 +273,7 @@ public class BatteryUsageStatsProvider {
BatteryUsageStats batteryUsageStats;
if ((query.getFlags()
& BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_ACCUMULATED) != 0) {
- batteryUsageStats = getAccumulatedBatteryUsageStats(stats, query, currentTimeMs);
+ batteryUsageStats = getAccumulatedBatteryUsageStats(stats, query);
} else if (query.getAggregatedToTimestamp() == 0) {
BatteryUsageStats.Builder builder = computeBatteryUsageStats(stats, query,
query.getMonotonicStartTime(),
@@ -288,9 +292,13 @@ public class BatteryUsageStatsProvider {
}
private BatteryUsageStats getAccumulatedBatteryUsageStats(BatteryStatsImpl stats,
- BatteryUsageStatsQuery query, long currentTimeMs) {
+ BatteryUsageStatsQuery query) {
AccumulatedBatteryUsageStats accumulatedStats = loadAccumulatedBatteryUsageStats();
- updateAccumulatedBatteryUsageStats(accumulatedStats, stats, query);
+ if (accumulatedStats.endMonotonicTime == MonotonicClock.UNDEFINED
+ || mMonotonicClock.monotonicTime() - accumulatedStats.endMonotonicTime
+ > query.getMaxStatsAge()) {
+ updateAccumulatedBatteryUsageStats(accumulatedStats, stats);
+ }
return accumulatedStats.builder.build();
}
@@ -321,7 +329,7 @@ public class BatteryUsageStatsProvider {
}
private void updateAccumulatedBatteryUsageStats(AccumulatedBatteryUsageStats accumulatedStats,
- BatteryStatsImpl stats, BatteryUsageStatsQuery query) {
+ BatteryStatsImpl stats) {
long startMonotonicTime = accumulatedStats.endMonotonicTime;
if (startMonotonicTime == MonotonicClock.UNDEFINED) {
startMonotonicTime = stats.getMonotonicStartTime();
@@ -333,6 +341,7 @@ public class BatteryUsageStatsProvider {
accumulatedStats.builder = new BatteryUsageStats.Builder(
stats.getCustomEnergyConsumerNames(), true, true, true, 0);
accumulatedStats.startWallClockTime = stats.getStartClockTime();
+ accumulatedStats.startMonotonicTime = stats.getMonotonicStartTime();
accumulatedStats.builder.setStatsStartTimestamp(accumulatedStats.startWallClockTime);
}
@@ -342,7 +351,7 @@ public class BatteryUsageStatsProvider {
accumulatedStats.builder.setStatsDuration(endWallClockTime - startMonotonicTime);
mPowerAttributor.estimatePowerConsumption(accumulatedStats.builder, stats.getHistory(),
- startMonotonicTime, MonotonicClock.UNDEFINED);
+ startMonotonicTime, endMonotonicTime);
populateGeneralInfo(accumulatedStats.builder, stats);
}
diff --git a/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java
index dcdd3bd8b3fa..1b864bbe479c 100644
--- a/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java
+++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java
@@ -23,6 +23,7 @@ import android.util.SparseBooleanArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BatteryStatsHistory;
import com.android.internal.os.BatteryStatsHistoryIterator;
+import com.android.internal.os.MonotonicClock;
import java.util.function.Consumer;
@@ -169,10 +170,15 @@ public class PowerStatsAggregator {
}
}
}
- if (lastTime > baseTime) {
- mStats.setDuration(lastTime - baseTime);
- mStats.finish(lastTime);
- consumer.accept(mStats);
+ if (startedSession) {
+ if (endTimeMs != MonotonicClock.UNDEFINED) {
+ lastTime = endTimeMs;
+ }
+ if (lastTime > baseTime) {
+ mStats.setDuration(lastTime - baseTime);
+ mStats.finish(lastTime);
+ consumer.accept(mStats);
+ }
}
mStats.reset(); // to free up memory
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 3467f947ece4..5989fc8465c6 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -3212,8 +3212,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* will be ignored.
*/
boolean isUniversalResizeable() {
- final boolean isLargeScreen = mDisplayContent != null && mDisplayContent.getConfiguration()
- .smallestScreenWidthDp >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP
+ final boolean isLargeScreen = mDisplayContent != null && mDisplayContent.isLargeScreen()
&& mDisplayContent.getIgnoreOrientationRequest();
if (!canBeUniversalResizeable(info.applicationInfo, mWmService, isLargeScreen,
true /* forActivity */)) {
@@ -4585,6 +4584,19 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
+ /**
+ * Returns {@code true} if the requested orientation of this activity is the same as the
+ * resolved orientation of the from activity.
+ */
+ private boolean isStartingOrientationCompatible(@NonNull ActivityRecord fromActivity) {
+ final int fromOrientation = fromActivity.getConfiguration().orientation;
+ final int requestedOrientation = getRequestedConfigurationOrientation();
+ if (requestedOrientation == ORIENTATION_UNDEFINED) {
+ return fromOrientation == getConfiguration().orientation;
+ }
+ return fromOrientation == requestedOrientation;
+ }
+
private boolean transferStartingWindow(@NonNull ActivityRecord fromActivity) {
final WindowState tStartingWindow = fromActivity.mStartingWindow;
if (tStartingWindow != null && fromActivity.mStartingSurface != null) {
@@ -4604,13 +4616,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
// Do not transfer if the orientation doesn't match, redraw starting window while it is
// on top will cause flicker.
- final int fromOrientation = fromActivity.getConfiguration().orientation;
- final int requestedOrientation = getRequestedConfigurationOrientation();
- if (requestedOrientation == ORIENTATION_UNDEFINED) {
- if (fromOrientation != getConfiguration().orientation) {
- return false;
- }
- } else if (fromOrientation != requestedOrientation) {
+ if (!isStartingOrientationCompatible(fromActivity)) {
return false;
}
@@ -4708,6 +4714,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
return true;
} else if (fromActivity.mStartingData != null) {
+ if (fromActivity.mStartingData instanceof SnapshotStartingData
+ && !isStartingOrientationCompatible(fromActivity)) {
+ // Do not transfer because the snapshot will be distorted in different orientation.
+ return false;
+ }
// The previous app was getting ready to show a
// starting window, but hasn't yet done so. Steal it!
ProtoLog.v(WM_DEBUG_STARTING_WINDOW,
@@ -5408,10 +5419,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
void setDeferHidingClient() {
+ if (Flags.removeDeferHidingClient()) {
+ return;
+ }
mDeferHidingClient = true;
}
void clearDeferHidingClient() {
+ if (Flags.removeDeferHidingClient()) {
+ return;
+ }
if (!mDeferHidingClient) return;
mDeferHidingClient = false;
if (!mVisibleRequested) {
@@ -7141,9 +7158,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
@Override
void setClientVisible(boolean clientVisible) {
- // TODO(shell-transitions): Remove mDeferHidingClient once everything is shell-transitions.
- // pip activities should just remain in clientVisible.
- if (!clientVisible && mDeferHidingClient) return;
+ if (!Flags.removeDeferHidingClient()) {
+ // TODO(shell-transitions): Remove mDeferHidingClient once everything is
+ // shell-transitions. pip activities should just remain in clientVisible.
+ if (!clientVisible && mDeferHidingClient) return;
+ }
super.setClientVisible(clientVisible);
}
diff --git a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java
index 1208b6ef396f..08ceb61e14a8 100644
--- a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java
+++ b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java
@@ -142,6 +142,8 @@ public class ActivityServiceConnectionsHolder<T> {
/** Used by {@link ActivityRecord#dump}. */
@Override
public String toString() {
- return String.valueOf(mConnections);
+ synchronized (mActivity) {
+ return String.valueOf(mConnections);
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c2141a7103be..f8086615b7d1 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -439,6 +439,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
*/
private boolean mSandboxDisplayApis = true;
+ /** Whether {@link #setIgnoreOrientationRequest} is called to override the default policy. */
+ @VisibleForTesting
+ boolean mHasSetIgnoreOrientationRequest;
+
/**
* Overridden display density for current user. Initialized with {@link #mInitialDisplayDensity}
* but can be set from Settings or via shell command "adb shell wm density".
@@ -6722,8 +6726,25 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
return mDisplayPolicy.getSystemUiContext();
}
+ /** Returns {@code} true if the smallest screen width dp >= 600. */
+ boolean isLargeScreen() {
+ return getConfiguration().smallestScreenWidthDp
+ >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP;
+ }
+
+ @Override
+ boolean getIgnoreOrientationRequest() {
+ if (mHasSetIgnoreOrientationRequest
+ || !com.android.window.flags.Flags.universalResizableByDefault()) {
+ return super.getIgnoreOrientationRequest();
+ }
+ // Large screen (sw >= 600dp) ignores orientation request by default.
+ return isLargeScreen() && !mWmService.isIgnoreOrientationRequestDisabled();
+ }
+
@Override
boolean setIgnoreOrientationRequest(boolean ignoreOrientationRequest) {
+ mHasSetIgnoreOrientationRequest = true;
if (mSetIgnoreOrientationRequest == ignoreOrientationRequest) return false;
final boolean rotationChanged = super.setIgnoreOrientationRequest(ignoreOrientationRequest);
mWmService.mDisplayWindowSettings.setIgnoreOrientationRequest(
diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java
index f6d05d08cb04..f0ba822c37c5 100644
--- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java
+++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java
@@ -374,9 +374,9 @@ class DisplayWindowSettings {
final DisplayInfo displayInfo = dc.getDisplayInfo();
final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo);
- final boolean ignoreOrientationRequest = settings.mIgnoreOrientationRequest != null
- ? settings.mIgnoreOrientationRequest : false;
- dc.setIgnoreOrientationRequest(ignoreOrientationRequest);
+ if (settings.mIgnoreOrientationRequest != null) {
+ dc.setIgnoreOrientationRequest(settings.mIgnoreOrientationRequest);
+ }
dc.getDisplayRotation().resetAllowAllRotations();
}
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index 4230cd868c03..cba606cf2b0c 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -324,7 +324,8 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
if (target != imeControlTarget) {
// TODO(b/353463205): check if fromUser=false is correct here
boolean imeVisible = target.isRequestedVisible(WindowInsets.Type.ime());
- ImeTracker.Token statsToken = ImeTracker.forLogging().onStart(ImeTracker.TYPE_HIDE,
+ ImeTracker.Token statsToken = ImeTracker.forLogging().onStart(
+ imeVisible ? ImeTracker.TYPE_SHOW : ImeTracker.TYPE_HIDE,
ImeTracker.ORIGIN_SERVER,
imeVisible ? SoftInputShowHideReason.SHOW_INPUT_TARGET_CHANGED
: SoftInputShowHideReason.HIDE_INPUT_TARGET_CHANGED,
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 46312aff1fb6..b3b8c6eab25e 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -156,6 +156,7 @@ import com.android.server.policy.PermissionPolicyInternal;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.utils.Slogf;
import com.android.server.wm.utils.RegionUtils;
+import com.android.window.flags.Flags;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -262,6 +263,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
int mCurrentUser;
/** Root task id of the front root task when user switched, indexed by userId. */
SparseIntArray mUserRootTaskInFront = new SparseIntArray(2);
+ SparseArray<IntArray> mUserVisibleRootTasks = new SparseArray<>();
/**
* A list of tokens that cause the top activity to be put to sleep.
@@ -1924,7 +1926,18 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
// appropriate.
removeRootTasksInWindowingModes(WINDOWING_MODE_PINNED);
- mUserRootTaskInFront.put(mCurrentUser, focusRootTaskId);
+ if (Flags.enableTopVisibleRootTaskPerUserTracking()) {
+ final IntArray visibleRootTasks = new IntArray();
+ forAllRootTasks(rootTask -> {
+ if (mCurrentUser == rootTask.mUserId && rootTask.isVisibleRequested()) {
+ visibleRootTasks.add(rootTask.getRootTaskId());
+ }
+ }, /* traverseTopToBottom */ false);
+ mUserVisibleRootTasks.put(mCurrentUser, visibleRootTasks);
+ } else {
+ mUserRootTaskInFront.put(mCurrentUser, focusRootTaskId);
+ }
+
mCurrentUser = userId;
mTaskSupervisor.mStartingUsers.add(uss);
@@ -1937,22 +1950,60 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
Slog.i(TAG, "Persisting top task because it belongs to an always-visible user");
// For a normal user-switch, we will restore the new user's task. But if the pre-switch
// top task is an always-visible (Communal) one, keep it even after the switch.
- mUserRootTaskInFront.put(mCurrentUser, focusRootTaskId);
+ if (Flags.enableTopVisibleRootTaskPerUserTracking()) {
+ final IntArray rootTasks = mUserVisibleRootTasks.get(mCurrentUser);
+ rootTasks.add(focusRootTaskId);
+ mUserVisibleRootTasks.put(mCurrentUser, rootTasks);
+ } else {
+ mUserRootTaskInFront.put(mCurrentUser, focusRootTaskId);
+ }
+
}
final int restoreRootTaskId = mUserRootTaskInFront.get(userId);
+ final IntArray rootTaskIdsToRestore = mUserVisibleRootTasks.get(userId);
+ boolean homeInFront = false;
+ if (Flags.enableTopVisibleRootTaskPerUserTracking()) {
+ if (rootTaskIdsToRestore == null) {
+ // If there are no root tasks saved, try restore id 0 which should create and launch
+ // the home task.
+ handleRootTaskLaunchOnUserSwitch(/* restoreRootTaskId */INVALID_TASK_ID);
+ homeInFront = true;
+ } else {
+ for (int i = 0; i < rootTaskIdsToRestore.size(); i++) {
+ handleRootTaskLaunchOnUserSwitch(rootTaskIdsToRestore.get(i));
+ }
+ // Check if the top task is type home
+ if (rootTaskIdsToRestore.size() > 0) {
+ final int topRootTaskId = rootTaskIdsToRestore.get(
+ rootTaskIdsToRestore.size() - 1);
+ homeInFront = isHomeTask(topRootTaskId);
+ }
+ }
+ } else {
+ handleRootTaskLaunchOnUserSwitch(restoreRootTaskId);
+ // Check if the top task is type home
+ homeInFront = isHomeTask(restoreRootTaskId);
+ }
+ return homeInFront;
+ }
+
+ private boolean isHomeTask(int taskId) {
+ final Task rootTask = getRootTask(taskId);
+ return rootTask != null && rootTask.isActivityTypeHome();
+ }
+
+ private void handleRootTaskLaunchOnUserSwitch(int restoreRootTaskId) {
Task rootTask = getRootTask(restoreRootTaskId);
if (rootTask == null) {
rootTask = getDefaultTaskDisplayArea().getOrCreateRootHomeTask();
}
- final boolean homeInFront = rootTask.isActivityTypeHome();
if (rootTask.isOnHomeDisplay()) {
rootTask.moveToFront("switchUserOnHomeDisplay");
} else {
// Root task was moved to another display while user was swapped out.
resumeHomeActivity(null, "switchUserOnOtherDisplay", getDefaultTaskDisplayArea());
}
- return homeInFront;
}
/** Returns whether the given user is to be always-visible (e.g. a communal profile). */
@@ -1963,7 +2014,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
}
void removeUser(int userId) {
- mUserRootTaskInFront.delete(userId);
+ if (Flags.enableTopVisibleRootTaskPerUserTracking()) {
+ mUserVisibleRootTasks.delete(userId);
+ } else {
+ mUserRootTaskInFront.delete(userId);
+ }
}
/**
@@ -1976,7 +2031,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
rootTask = getDefaultTaskDisplayArea().getOrCreateRootHomeTask();
}
- mUserRootTaskInFront.put(userId, rootTask.getRootTaskId());
+ if (Flags.enableTopVisibleRootTaskPerUserTracking()) {
+ final IntArray rootTasks = mUserVisibleRootTasks.get(userId, new IntArray());
+ rootTasks.add(rootTask.getRootTaskId());
+ mUserVisibleRootTasks.put(userId, rootTasks);
+ } else {
+ mUserRootTaskInFront.put(userId, rootTask.getRootTaskId());
+ }
}
}
@@ -2124,7 +2185,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
if (!tf.isOrganizedTaskFragment()) {
return;
}
- tf.resetAdjacentTaskFragment();
+ tf.clearAdjacentTaskFragments();
tf.setCompanionTaskFragment(null /* companionTaskFragment */);
tf.setAnimationParams(TaskFragmentAnimationParams.DEFAULT);
if (tf.getTopNonFinishingActivity() != null) {
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 51b8bd1f0091..9fb5bea132ef 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -94,6 +94,7 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.UserHandle;
+import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
@@ -239,12 +240,20 @@ class TaskFragment extends WindowContainer<WindowContainer> {
/** This task fragment will be removed when the cleanup of its children are done. */
private boolean mIsRemovalRequested;
- /** The TaskFragment that is adjacent to this one. */
+ /** @deprecated b/373709676 replace with {@link #mAdjacentTaskFragments} */
+ @Deprecated
@Nullable
private TaskFragment mAdjacentTaskFragment;
/**
- * Unlike the {@link mAdjacentTaskFragment}, the companion TaskFragment is not always visually
+ * The TaskFragments that are adjacent to each other, including this TaskFragment.
+ * All TaskFragments in this set share the same set instance.
+ */
+ @Nullable
+ private AdjacentSet mAdjacentTaskFragments;
+
+ /**
+ * Unlike the {@link #mAdjacentTaskFragments}, the companion TaskFragment is not always visually
* adjacent to this one, but this TaskFragment will be removed by the organizer if the
* companion TaskFragment is removed.
*/
@@ -442,15 +451,24 @@ class TaskFragment extends WindowContainer<WindowContainer> {
return service.mWindowOrganizerController.getTaskFragment(token);
}
- void setAdjacentTaskFragment(@Nullable TaskFragment taskFragment) {
- if (mAdjacentTaskFragment == taskFragment) {
- return;
- }
- resetAdjacentTaskFragment();
- if (taskFragment != null) {
+ /** @deprecated b/373709676 replace with {@link #setAdjacentTaskFragments}. */
+ @Deprecated
+ void setAdjacentTaskFragment(@NonNull TaskFragment taskFragment) {
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ if (mAdjacentTaskFragment == taskFragment) {
+ return;
+ }
+ resetAdjacentTaskFragment();
mAdjacentTaskFragment = taskFragment;
taskFragment.setAdjacentTaskFragment(this);
+ return;
}
+
+ setAdjacentTaskFragments(new AdjacentSet(this, taskFragment));
+ }
+
+ void setAdjacentTaskFragments(@NonNull AdjacentSet adjacentTaskFragments) {
+ adjacentTaskFragments.setAsAdjacent();
}
void setCompanionTaskFragment(@Nullable TaskFragment companionTaskFragment) {
@@ -461,7 +479,14 @@ class TaskFragment extends WindowContainer<WindowContainer> {
return mCompanionTaskFragment;
}
- void resetAdjacentTaskFragment() {
+ /** @deprecated b/373709676 replace with {@link #clearAdjacentTaskFragments()}. */
+ @Deprecated
+ private void resetAdjacentTaskFragment() {
+ if (Flags.allowMultipleAdjacentTaskFragments()) {
+ throw new IllegalStateException("resetAdjacentTaskFragment shouldn't be called when"
+ + " allowMultipleAdjacentTaskFragments is enabled. Use either"
+ + " #clearAdjacentTaskFragments or #removeFromAdjacentTaskFragments");
+ }
// Reset the adjacent TaskFragment if its adjacent TaskFragment is also this TaskFragment.
if (mAdjacentTaskFragment != null && mAdjacentTaskFragment.mAdjacentTaskFragment == this) {
mAdjacentTaskFragment.mAdjacentTaskFragment = null;
@@ -471,6 +496,57 @@ class TaskFragment extends WindowContainer<WindowContainer> {
mDelayLastActivityRemoval = false;
}
+ void clearAdjacentTaskFragments() {
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ resetAdjacentTaskFragment();
+ return;
+ }
+
+ if (mAdjacentTaskFragments != null) {
+ mAdjacentTaskFragments.clear();
+ }
+ }
+
+ void removeFromAdjacentTaskFragments() {
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ resetAdjacentTaskFragment();
+ return;
+ }
+
+ if (mAdjacentTaskFragments != null) {
+ mAdjacentTaskFragments.remove(this);
+ }
+ }
+
+ // TODO(b/373709676): update usages.
+ /** @deprecated b/373709676 replace with {@link #getAdjacentTaskFragments()}. */
+ @Deprecated
+ @Nullable
+ TaskFragment getAdjacentTaskFragment() {
+ return mAdjacentTaskFragment;
+ }
+
+ @Nullable
+ AdjacentSet getAdjacentTaskFragments() {
+ return mAdjacentTaskFragments;
+ }
+
+ boolean hasAdjacentTaskFragment() {
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ return mAdjacentTaskFragment != null;
+ }
+ return mAdjacentTaskFragments != null;
+ }
+
+ boolean isAdjacentTo(@NonNull TaskFragment other) {
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ return mAdjacentTaskFragment == other;
+ }
+ return other != this
+ && mAdjacentTaskFragments != null
+ && mAdjacentTaskFragments.contains(other);
+ }
+
void setTaskFragmentOrganizer(@NonNull TaskFragmentOrganizerToken organizer, int uid,
@NonNull String processName) {
mTaskFragmentOrganizer = ITaskFragmentOrganizer.Stub.asInterface(organizer.asBinder());
@@ -566,10 +642,6 @@ class TaskFragment extends WindowContainer<WindowContainer> {
return isEmbedded() && mPinned;
}
- TaskFragment getAdjacentTaskFragment() {
- return mAdjacentTaskFragment;
- }
-
/** Returns the currently topmost resumed activity. */
@Nullable
ActivityRecord getTopResumedActivity() {
@@ -616,7 +688,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
mResumedActivity = r;
final ActivityRecord topResumed = mTaskSupervisor.updateTopResumedActivityIfNeeded(reason);
if (mResumedActivity != null && topResumed != null && topResumed.isEmbedded()
- && topResumed.getTaskFragment().getAdjacentTaskFragment() == this) {
+ && topResumed.getTaskFragment().isAdjacentTo(this)) {
// Explicitly updates the last resumed Activity if the resumed activity is
// adjacent to the top-resumed embedded activity.
mAtmService.setLastResumedActivityUncheckLocked(mResumedActivity, reason);
@@ -2036,7 +2108,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
private boolean shouldReportOrientationUnspecified() {
// Apps and their containers are not allowed to specify orientation from adjacent
// TaskFragment.
- return getAdjacentTaskFragment() != null && isVisibleRequested();
+ return hasAdjacentTaskFragment() && isVisibleRequested();
}
@Override
@@ -3086,7 +3158,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
EventLogTags.writeWmTfRemoved(System.identityHashCode(this), getTaskId());
}
mIsRemovalRequested = false;
- resetAdjacentTaskFragment();
+ removeFromAdjacentTaskFragments();
cleanUpEmbeddedTaskFragment();
final boolean shouldExecuteAppTransition =
mClearedTaskFragmentForPip && isTaskVisibleRequested();
@@ -3267,9 +3339,16 @@ class TaskFragment extends WindowContainer<WindowContainer> {
sb.append(" organizerProc=");
sb.append(mTaskFragmentOrganizerProcessName);
}
- if (mAdjacentTaskFragment != null) {
- sb.append(" adjacent=");
- sb.append(mAdjacentTaskFragment);
+ if (Flags.allowMultipleAdjacentTaskFragments()) {
+ if (mAdjacentTaskFragments != null) {
+ sb.append(" adjacent=");
+ sb.append(mAdjacentTaskFragments);
+ }
+ } else {
+ if (mAdjacentTaskFragment != null) {
+ sb.append(" adjacent=");
+ sb.append(mAdjacentTaskFragment);
+ }
}
sb.append('}');
return sb.toString();
@@ -3385,4 +3464,94 @@ class TaskFragment extends WindowContainer<WindowContainer> {
proto.end(token);
}
+
+ /** Set of {@link TaskFragment}s that are adjacent to each other. */
+ static class AdjacentSet {
+ private final ArraySet<TaskFragment> mAdjacentSet;
+
+ AdjacentSet(@NonNull TaskFragment... taskFragments) {
+ this(new ArraySet<>(taskFragments));
+ }
+
+ AdjacentSet(@NonNull ArraySet<TaskFragment> taskFragments) {
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ throw new IllegalStateException("allowMultipleAdjacentTaskFragments must be"
+ + " enabled to set more than two TaskFragments adjacent to each other.");
+ }
+ if (taskFragments.size() < 2) {
+ throw new IllegalArgumentException("Adjacent TaskFragments must contain at least"
+ + " two TaskFragments, but only " + taskFragments.size()
+ + " were provided.");
+ }
+ mAdjacentSet = taskFragments;
+ }
+
+ /** Updates each {@link TaskFragment} in the set to be adjacent to each other. */
+ private void setAsAdjacent() {
+ if (mAdjacentSet.isEmpty()
+ || equals(mAdjacentSet.valueAt(0).mAdjacentTaskFragments)) {
+ // No need to update if any TaskFragment in the set has already been updated to the
+ // same set.
+ return;
+ }
+ for (int i = mAdjacentSet.size() - 1; i >= 0; i--) {
+ final TaskFragment taskFragment = mAdjacentSet.valueAt(i);
+ taskFragment.removeFromAdjacentTaskFragments();
+ taskFragment.mAdjacentTaskFragments = this;
+ }
+ }
+
+ /** Removes the {@link TaskFragment} from the adjacent set. */
+ private void remove(@NonNull TaskFragment taskFragment) {
+ taskFragment.mAdjacentTaskFragments = null;
+ taskFragment.mDelayLastActivityRemoval = false;
+ mAdjacentSet.remove(taskFragment);
+ if (mAdjacentSet.size() < 2) {
+ // To be considered as adjacent, there must be at least 2 TaskFragments in the set.
+ clear();
+ }
+ }
+
+ /** Clears the adjacent relationship. */
+ private void clear() {
+ for (int i = mAdjacentSet.size() - 1; i >= 0; i--) {
+ final TaskFragment taskFragment = mAdjacentSet.valueAt(i);
+ // Clear all reference.
+ taskFragment.mAdjacentTaskFragments = null;
+ taskFragment.mDelayLastActivityRemoval = false;
+ }
+ mAdjacentSet.clear();
+ }
+
+ /** Whether the {@link TaskFragment} is in this adjacent set. */
+ boolean contains(@NonNull TaskFragment taskFragment) {
+ return mAdjacentSet.contains(taskFragment);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof AdjacentSet other)) {
+ return false;
+ }
+ return mAdjacentSet.equals(other.mAdjacentSet);
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("AdjacentSet{");
+ final int size = mAdjacentSet.size();
+ for (int i = 0; i < size; i++) {
+ if (i != 0) {
+ sb.append(", ");
+ }
+ sb.append(mAdjacentSet.valueAt(i));
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 1fc609b7d03a..bcd12f253299 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -1870,7 +1870,13 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
final DisplayArea<?> da = wc.asDisplayArea();
if (da == null) continue;
if (da.isVisibleRequested()) {
- mController.mValidateDisplayVis.remove(da);
+ final int inValidateList = mController.mValidateDisplayVis.indexOf(da);
+ if (inValidateList >= 0
+ // The display-area is visible, but if we only detect a non-visibility
+ // change, then we shouldn't remove the validator.
+ && !mChanges.get(da).mVisible) {
+ mController.mValidateDisplayVis.remove(inValidateList);
+ }
} else {
// In case something accidentally hides a displayarea and nothing shows it again.
mController.mValidateDisplayVis.add(da);
diff --git a/services/core/java/com/android/server/wm/WindowManagerConstants.java b/services/core/java/com/android/server/wm/WindowManagerConstants.java
index 3ad9b62ef058..9a5c8dffc0fc 100644
--- a/services/core/java/com/android/server/wm/WindowManagerConstants.java
+++ b/services/core/java/com/android/server/wm/WindowManagerConstants.java
@@ -42,12 +42,23 @@ final class WindowManagerConstants {
* <ul>
* <li>false: applies to no apps (default)</li>
* <li>true: applies to all apps</li>
- * <li>large: applies to all apps but only on large screens</li>
* </ul>
*/
private static final String KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST =
"ignore_activity_orientation_request";
+ /**
+ * The orientation of activity will be always "unspecified" except for game apps.
+ * <p>Possible values:
+ * <ul>
+ * <li>none: applies to no apps (default)</li>
+ * <li>all: applies to all apps ({@see #KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST})</li>
+ * <li>large: applies to all apps but only on large screens</li>
+ * </ul>
+ */
+ private static final String KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST_SCREENS =
+ "ignore_activity_orientation_request_screens";
+
/** The packages that ignore {@link #KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST}. */
private static final String KEY_OPT_OUT_IGNORE_ACTIVITY_ORIENTATION_REQUEST_LIST =
"opt_out_ignore_activity_orientation_request_list";
@@ -155,6 +166,7 @@ final class WindowManagerConstants {
updateSystemGestureExclusionLogDebounceMillis();
break;
case KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST:
+ case KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST_SCREENS:
updateIgnoreActivityOrientationRequest();
break;
case KEY_OPT_OUT_IGNORE_ACTIVITY_ORIENTATION_REQUEST_LIST:
@@ -186,12 +198,16 @@ final class WindowManagerConstants {
}
private void updateIgnoreActivityOrientationRequest() {
- final String value = mDeviceConfig.getProperty(
+ boolean allScreens = mDeviceConfig.getBoolean(
+ DeviceConfig.NAMESPACE_WINDOW_MANAGER,
+ KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST, false);
+ String whichScreens = mDeviceConfig.getProperty(
DeviceConfig.NAMESPACE_WINDOW_MANAGER,
- KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST);
- mIgnoreActivityOrientationRequestSmallScreen = Boolean.parseBoolean(value);
- mIgnoreActivityOrientationRequestLargeScreen = mIgnoreActivityOrientationRequestSmallScreen
- || ("large".equals(value));
+ KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST_SCREENS);
+ allScreens |= ("all".equalsIgnoreCase(whichScreens));
+ boolean largeScreens = allScreens || ("large".equalsIgnoreCase(whichScreens));
+ mIgnoreActivityOrientationRequestSmallScreen = allScreens;
+ mIgnoreActivityOrientationRequestLargeScreen = largeScreens;
}
private void updateOptOutIgnoreActivityOrientationRequestList() {
@@ -221,9 +237,9 @@ final class WindowManagerConstants {
pw.print("="); pw.println(mSystemGestureExclusionLimitDp);
pw.print(" "); pw.print(KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE);
pw.print("="); pw.println(mSystemGestureExcludedByPreQStickyImmersive);
- pw.print(" "); pw.print(KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST);
- pw.print("="); pw.println(mIgnoreActivityOrientationRequestSmallScreen ? "true"
- : mIgnoreActivityOrientationRequestLargeScreen ? "large" : "false");
+ pw.print(" "); pw.print(KEY_IGNORE_ACTIVITY_ORIENTATION_REQUEST_SCREENS);
+ pw.print("="); pw.println(mIgnoreActivityOrientationRequestSmallScreen ? "all"
+ : mIgnoreActivityOrientationRequestLargeScreen ? "large" : "none");
if (mOptOutIgnoreActivityOrientationRequestPackages != null) {
pw.print(" "); pw.print(KEY_OPT_OUT_IGNORE_ACTIVITY_ORIENTATION_REQUEST_LIST);
pw.print("="); pw.println(mOptOutIgnoreActivityOrientationRequestPackages);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 0b6ca75c5f0d..58319f4cdabc 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2673,7 +2673,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (outRelayoutResult != null) {
if (win.syncNextBuffer() && viewVisibility == View.VISIBLE
- && win.mSyncSeqId > lastSyncSeqId) {
+ && win.mSyncSeqId > lastSyncSeqId && !displayContent.mWaitingForConfig) {
outRelayoutResult.syncSeqId = win.shouldSyncWithBuffers()
? win.mSyncSeqId
: -1;
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 66921ff3adeb..fb197c566b7d 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -1155,7 +1155,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
} else if (!task.mCreatedByOrganizer) {
throw new UnsupportedOperationException(
"Cannot set non-organized task as adjacent flag root: " + wc);
- } else if (task.getAdjacentTaskFragment() == null && !clearRoot) {
+ } else if (!task.hasAdjacentTaskFragment() && !clearRoot) {
throw new UnsupportedOperationException(
"Cannot set non-adjacent task as adjacent flag root: " + wc);
}
@@ -1645,9 +1645,15 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
opType, exception);
break;
}
- if (taskFragment.getAdjacentTaskFragment() != secondaryTaskFragment) {
+ if (!taskFragment.isAdjacentTo(secondaryTaskFragment)) {
// Only have lifecycle effect if the adjacent changed.
- taskFragment.setAdjacentTaskFragment(secondaryTaskFragment);
+ if (Flags.allowMultipleAdjacentTaskFragments()) {
+ // Activity Embedding only set two TFs adjacent.
+ taskFragment.setAdjacentTaskFragments(
+ new TaskFragment.AdjacentSet(taskFragment, secondaryTaskFragment));
+ } else {
+ taskFragment.setAdjacentTaskFragment(secondaryTaskFragment);
+ }
effects |= TRANSACT_EFFECTS_LIFECYCLE;
}
@@ -1663,21 +1669,25 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
break;
}
case OP_TYPE_CLEAR_ADJACENT_TASK_FRAGMENTS: {
- final TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment();
- if (adjacentTaskFragment == null) {
+ if (!taskFragment.hasAdjacentTaskFragment()) {
break;
}
- taskFragment.resetAdjacentTaskFragment();
- effects |= TRANSACT_EFFECTS_LIFECYCLE;
- // Clear the focused app if the focused app is no longer visible after reset the
- // adjacent TaskFragments.
+ // Check if the focused app is in the adjacent set that will be cleared.
final ActivityRecord focusedApp = taskFragment.getDisplayContent().mFocusedApp;
final TaskFragment focusedTaskFragment = focusedApp != null
? focusedApp.getTaskFragment()
: null;
- if ((focusedTaskFragment == taskFragment
- || focusedTaskFragment == adjacentTaskFragment)
+ final boolean wasFocusedInAdjacent = focusedTaskFragment == taskFragment
+ || (focusedTaskFragment != null
+ && taskFragment.isAdjacentTo(focusedTaskFragment));
+
+ taskFragment.removeFromAdjacentTaskFragments();
+ effects |= TRANSACT_EFFECTS_LIFECYCLE;
+
+ // Clear the focused app if the focused app is no longer visible after reset the
+ // adjacent TaskFragments.
+ if (wasFocusedInAdjacent
&& !focusedTaskFragment.shouldBeVisible(null /* starting */)) {
focusedTaskFragment.getDisplayContent().setFocusedApp(null /* newFocus */);
}
@@ -2191,26 +2201,60 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
}
private int setAdjacentRootsHierarchyOp(WindowContainerTransaction.HierarchyOp hop) {
- final WindowContainer wc1 = WindowContainer.fromBinder(hop.getContainer());
- if (wc1 == null || !wc1.isAttached()) {
- Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc1);
- return TRANSACT_EFFECTS_NONE;
- }
- final TaskFragment root1 = wc1.asTaskFragment();
- final WindowContainer wc2 = WindowContainer.fromBinder(hop.getAdjacentRoot());
- if (wc2 == null || !wc2.isAttached()) {
- Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc2);
- return TRANSACT_EFFECTS_NONE;
- }
- final TaskFragment root2 = wc2.asTaskFragment();
- if (!root1.mCreatedByOrganizer || !root2.mCreatedByOrganizer) {
- throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: Not created by"
- + " organizer root1=" + root1 + " root2=" + root2);
- }
- if (root1.getAdjacentTaskFragment() == root2) {
+ if (!Flags.allowMultipleAdjacentTaskFragments()) {
+ final WindowContainer wc1 = WindowContainer.fromBinder(hop.getContainer());
+ if (wc1 == null || !wc1.isAttached()) {
+ Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc1);
+ return TRANSACT_EFFECTS_NONE;
+ }
+ final TaskFragment root1 = wc1.asTaskFragment();
+ final WindowContainer wc2 = WindowContainer.fromBinder(hop.getAdjacentRoot());
+ if (wc2 == null || !wc2.isAttached()) {
+ Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc2);
+ return TRANSACT_EFFECTS_NONE;
+ }
+ final TaskFragment root2 = wc2.asTaskFragment();
+ if (!root1.mCreatedByOrganizer || !root2.mCreatedByOrganizer) {
+ throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: Not created by"
+ + " organizer root1=" + root1 + " root2=" + root2);
+ }
+ if (root1.isAdjacentTo(root2)) {
+ return TRANSACT_EFFECTS_NONE;
+ }
+ root1.setAdjacentTaskFragment(root2);
+ return TRANSACT_EFFECTS_LIFECYCLE;
+ }
+
+ final IBinder[] containers = hop.getContainers();
+ final ArraySet<TaskFragment> adjacentRoots = new ArraySet<>();
+ for (IBinder container : containers) {
+ final WindowContainer wc = WindowContainer.fromBinder(container);
+ if (wc == null || !wc.isAttached()) {
+ Slog.e(TAG, "Attempt to operate on unknown or detached container: " + wc);
+ return TRANSACT_EFFECTS_NONE;
+ }
+ final Task root = wc.asTask();
+ if (root == null) {
+ // Only support Task. Use WCT#setAdjacentTaskFragments for non-Task TaskFragment.
+ throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: Not called with"
+ + " Task. wc=" + wc);
+ }
+ if (!root.mCreatedByOrganizer) {
+ throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: Not created by"
+ + " organizer root=" + root);
+ }
+ if (adjacentRoots.contains(root)) {
+ throw new IllegalArgumentException("setAdjacentRootsHierarchyOp: called with same"
+ + " root twice=" + root);
+ }
+ adjacentRoots.add(root);
+ }
+ final TaskFragment root0 = adjacentRoots.valueAt(0);
+ final TaskFragment.AdjacentSet adjacentSet = new TaskFragment.AdjacentSet(adjacentRoots);
+ if (adjacentSet.equals(root0.getAdjacentTaskFragments())) {
return TRANSACT_EFFECTS_NONE;
}
- root1.setAdjacentTaskFragment(root2);
+ root0.setAdjacentTaskFragments(adjacentSet);
return TRANSACT_EFFECTS_LIFECYCLE;
}
@@ -2225,10 +2269,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
throw new IllegalArgumentException("clearAdjacentRootsHierarchyOp: Not created by"
+ " organizer root=" + root);
}
- if (root.getAdjacentTaskFragment() == null) {
+ if (!root.hasAdjacentTaskFragment()) {
return TRANSACT_EFFECTS_NONE;
}
- root.resetAdjacentTaskFragment();
+ root.removeFromAdjacentTaskFragments();
return TRANSACT_EFFECTS_LIFECYCLE;
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 447d443282bd..cebe790bb1b9 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -5750,10 +5750,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|| mKeyInterceptionInfo.layoutParamsPrivateFlags != getAttrs().privateFlags
|| mKeyInterceptionInfo.layoutParamsType != getAttrs().type
|| mKeyInterceptionInfo.windowTitle != getWindowTag()
- || mKeyInterceptionInfo.windowOwnerUid != getOwningUid()
- || mKeyInterceptionInfo.inputFeaturesFlags != getAttrs().inputFeatures) {
+ || mKeyInterceptionInfo.windowOwnerUid != getOwningUid()) {
mKeyInterceptionInfo = new KeyInterceptionInfo(getAttrs().type, getAttrs().privateFlags,
- getWindowTag().toString(), getOwningUid(), getAttrs().inputFeatures);
+ getWindowTag().toString(), getOwningUid());
}
return mKeyInterceptionInfo;
}
diff --git a/services/core/jni/com_android_server_am_Freezer.cpp b/services/core/jni/com_android_server_am_Freezer.cpp
index 81487281dee7..e9a99f0fab64 100644
--- a/services/core/jni/com_android_server_am_Freezer.cpp
+++ b/services/core/jni/com_android_server_am_Freezer.cpp
@@ -68,7 +68,7 @@ jint getBinderFreezeInfo(JNIEnv *env, jobject, jint pid) {
bool isFreezerSupported(JNIEnv *env, jclass) {
std::string path;
- if (!getAttributePathForTask("FreezerState", getpid(), &path)) {
+ if (!CgroupGetAttributePathForTask("FreezerState", getpid(), &path)) {
ALOGI("No attribute for FreezerState");
return false;
}
diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
index 0c9a89bb0a30..8533eafaf9e0 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
@@ -114,7 +114,7 @@ public class CredentialManagerUi {
/** Creates intent that is ot be invoked to cancel an in-progress UI session. */
public Intent createCancelIntent(IBinder requestId, String packageName) {
return IntentFactory.createCancelUiIntent(mContext, requestId,
- /*shouldShowCancellationUi=*/ true, packageName);
+ /*shouldShowCancellationUi=*/ true, packageName, mUserId);
}
/**
@@ -177,7 +177,7 @@ public class CredentialManagerUi {
IntentCreationResult intentCreationResult = IntentFactory
.createCredentialSelectorIntentForCredMan(mContext, requestInfo, providerDataList,
- new ArrayList<>(disabledProviderDataList), mResultReceiver);
+ new ArrayList<>(disabledProviderDataList), mResultReceiver, mUserId);
requestSessionMetric.collectUiConfigurationResults(
mContext, intentCreationResult, mUserId);
Intent intent = intentCreationResult.getIntent();
@@ -211,7 +211,7 @@ public class CredentialManagerUi {
RequestSessionMetric requestSessionMetric) {
IntentCreationResult intentCreationResult = IntentFactory
.createCredentialSelectorIntentForAutofill(mContext, requestInfo, new ArrayList<>(),
- mResultReceiver);
+ mResultReceiver, mUserId);
requestSessionMetric.collectUiConfigurationResults(
mContext, intentCreationResult, mUserId);
return intentCreationResult.getIntent();
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
index 365cbaed2aac..724f083018f2 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -3708,7 +3708,7 @@ public class DisplayManagerServiceTest {
eq(config));
bs.releaseVirtualDisplay(mMockAppToken);
- verify(mMockVirtualDisplayAdapter).releaseVirtualDisplayLocked(binder, callingUid);
+ verify(mMockVirtualDisplayAdapter).releaseVirtualDisplayLocked(binder);
}
@Test
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
index 91f1aaf603e6..8ca39194de3b 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -2471,6 +2471,26 @@ public final class DisplayPowerControllerTest {
eq(false));
}
+ @Test
+ public void onDisplayChange_canceledAfterStop() {
+ mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID);
+
+ // stop the dpc (turn it down)
+ mHolder.dpc.stop();
+ advanceTime(1);
+
+ // To trigger all the changes that can happen, we will completely change the underlying
+ // display device.
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mock(DisplayDeviceConfig.class), /* isEnabled= */ true);
+
+ // Call onDisplayChange after we stopped DPC and make sure it doesn't crash
+ mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY);
+ advanceTime(1);
+
+ // No crash = success
+ }
+
/**
* Creates a mock and registers it to {@link LocalServices}.
*/
diff --git a/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
index dbd5c65f9ba3..9287b3004279 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
@@ -118,14 +118,13 @@ public class VirtualDisplayAdapterTest {
public void testCreateAndReleaseVirtualDisplay() {
VirtualDisplayConfig config = new VirtualDisplayConfig.Builder("test", /* width= */ 1,
/* height= */ 1, /* densityDpi= */ 1).build();
- int ownerUid = 10;
DisplayDevice result = mAdapter.createVirtualDisplayLocked(mMockCallback,
- /* projection= */ null, ownerUid, /* packageName= */ "testpackage",
+ /* projection= */ null, /* ownerUid= */ 10, /* packageName= */ "testpackage",
/* uniqueId= */ "uniqueId", /* surface= */ null, /* flags= */ 0, config);
assertNotNull(result);
- result = mAdapter.releaseVirtualDisplayLocked(mMockBinder, ownerUid);
+ result = mAdapter.releaseVirtualDisplayLocked(mMockBinder);
assertNotNull(result);
}
@@ -230,7 +229,6 @@ public class VirtualDisplayAdapterTest {
// Displays for the same package
for (int i = 0; i < MAX_DEVICES_PER_PACKAGE * 2; i++) {
- // Same owner UID
IVirtualDisplayCallback callback = createCallback();
DisplayDevice device = mAdapter.createVirtualDisplayLocked(callback,
mMediaProjectionMock, 1234, "test.package", "123",
@@ -240,7 +238,6 @@ public class VirtualDisplayAdapterTest {
// Displays for different packages
for (int i = 0; i < MAX_DEVICES * 2; i++) {
- // Same owner UID
IVirtualDisplayCallback callback = createCallback();
DisplayDevice device = mAdapter.createVirtualDisplayLocked(callback,
mMediaProjectionMock, 1234 + i, "test.package", "123",
@@ -270,8 +267,7 @@ public class VirtualDisplayAdapterTest {
}
// Release one display
- DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder(),
- ownerUid);
+ DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder());
assertNotNull(device);
callbacks.remove(0);
@@ -292,7 +288,7 @@ public class VirtualDisplayAdapterTest {
// Release all the displays
for (IVirtualDisplayCallback cb : callbacks) {
- device = mAdapter.releaseVirtualDisplayLocked(cb.asBinder(), ownerUid);
+ device = mAdapter.releaseVirtualDisplayLocked(cb.asBinder());
assertNotNull(device);
}
callbacks.clear();
@@ -342,8 +338,7 @@ public class VirtualDisplayAdapterTest {
}
// Release one display
- DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder(),
- firstOwnerUid);
+ DisplayDevice device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(0).asBinder());
assertNotNull(device);
callbacks.remove(0);
@@ -363,9 +358,8 @@ public class VirtualDisplayAdapterTest {
assertNull(device);
// Release all the displays
- for (int i = 0; i < callbacks.size(); i++) {
- device = mAdapter.releaseVirtualDisplayLocked(callbacks.get(i).asBinder(),
- firstOwnerUid + i);
+ for (IVirtualDisplayCallback iVirtualDisplayCallback : callbacks) {
+ device = mAdapter.releaseVirtualDisplayLocked(iVirtualDisplayCallback.asBinder());
assertNotNull(device);
}
callbacks.clear();
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/RejectedModesVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/RejectedModesVoteTest.kt
new file mode 100644
index 000000000000..dd3211d0ef83
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/RejectedModesVoteTest.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.mode
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class RejectedModesVoteTest {
+ private val rejectedModes = setOf(1, 2)
+
+ private val otherMode = 2
+
+ private lateinit var rejectedModesVote: RejectedModesVote
+
+ @Before
+ fun setUp() {
+ rejectedModesVote = RejectedModesVote(rejectedModes)
+ }
+
+ @Test
+ fun addsRejectedModeIds_summaryIsEmpty() {
+ val summary = createVotesSummary()
+
+ rejectedModesVote.updateSummary(summary)
+
+ assertThat(summary.rejectedModeIds).containsExactlyElementsIn(rejectedModes)
+ }
+
+ @Test
+ fun addsRejectedModeIds_summaryIsNotEmpty() {
+ val summary = createVotesSummary()
+ summary.rejectedModeIds.add(otherMode)
+
+ rejectedModesVote.updateSummary(summary)
+
+ assertThat(summary.rejectedModeIds).containsExactlyElementsIn(rejectedModes + otherMode)
+ }
+} \ No newline at end of file
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt
index 239e59b69187..958cf21a38a2 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt
@@ -186,6 +186,44 @@ class VoteSummaryTest {
assertThat(result).hasSize(1)
}
+
+ enum class RejectedModesTestCase(
+ internal val summaryRejectedModes: Set<Int>?,
+ val modesToFilter: Array<Display.Mode>,
+ val expectedModeIds: Set<Int>
+ ) {
+ HAS_NO_MATCHING_VOTE(
+ setOf(4, 5),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ setOf(1, 2, 3)
+ ),
+ HAS_SINGLE_MATCHING_VOTE(
+ setOf(1),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ setOf(2, 3)
+ ),
+ HAS_MULTIPLE_MATCHING_VOTES(
+ setOf(1, 2),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ setOf(3)
+ ),
+ }
+
+ @Test
+ fun testFilterModes_rejectedModes(@TestParameter testCase: RejectedModesTestCase) {
+ val summary = createSummary()
+ summary.rejectedModeIds = testCase.summaryRejectedModes
+
+ val result = summary.filterModes(testCase.modesToFilter)
+
+ assertThat(result.map {it.modeId}).containsExactlyElementsIn(testCase.expectedModeIds)
+ }
}
diff --git a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java
index 874e99173c63..495e853370ee 100644
--- a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java
+++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java
@@ -46,7 +46,6 @@ import android.os.RemoteException;
import android.os.test.TestLooper;
import android.service.dreams.IDreamService;
-import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -108,10 +107,8 @@ public class DreamControllerTest {
.thenReturn(Context.ACTIVITY_TASK_SERVICE);
final PowerManager powerManager = new PowerManager(mContext, mPowerManager, null, null);
- when(mContext.getSystemService(Context.POWER_SERVICE))
+ when(mContext.getSystemService(PowerManager.class))
.thenReturn(powerManager);
- when(mContext.getSystemServiceName(PowerManager.class))
- .thenReturn(Context.POWER_SERVICE);
when(mContext.getResources()).thenReturn(mResources);
mToken = new Binder();
@@ -234,8 +231,13 @@ public class DreamControllerTest {
}
@Test
- @FlakyTest(bugId = 293109503)
public void serviceDisconnect_resetsScreenTimeout() throws RemoteException {
+ when(mResources.getBoolean(
+ com.android.internal.R.bool.config_resetScreenTimeoutOnUnexpectedDreamExit))
+ .thenReturn(true);
+ // Recreate DreamManager because the configuration gets retrieved in the constructor
+ mDreamController = new DreamController(mContext, mHandler, mListener);
+
// Start dream.
mDreamController.startDream(mToken, mDreamName, false /*isPreview*/, false /*doze*/,
0 /*userId*/, null /*wakeLock*/, mOverlayName, "test" /*reason*/);
@@ -254,8 +256,13 @@ public class DreamControllerTest {
}
@Test
- @FlakyTest(bugId = 293109503)
public void binderDied_resetsScreenTimeout() throws RemoteException {
+ when(mResources.getBoolean(
+ com.android.internal.R.bool.config_resetScreenTimeoutOnUnexpectedDreamExit))
+ .thenReturn(true);
+ // Recreate DreamManager because the configuration gets retrieved in the constructor
+ mDreamController = new DreamController(mContext, mHandler, mListener);
+
// Start dream.
mDreamController.startDream(mToken, mDreamName, false /*isPreview*/, false /*doze*/,
0 /*userId*/, null /*wakeLock*/, mOverlayName, "test" /*reason*/);
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java
index 0304a74f7654..cd8d415bdfa2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/InstallDependencyHelperTest.java
@@ -21,11 +21,7 @@ import static android.content.pm.Flags.FLAG_SDK_DEPENDENCY_INSTALLER;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.pm.SharedLibraryInfo;
@@ -90,32 +86,15 @@ public class InstallDependencyHelperTest {
}
@Test
- public void testResolveLibraryDependenciesIfNeeded_errorInSharedLibrariesImpl()
- throws Exception {
- doThrow(new PackageManagerException(new Exception("xyz")))
- .when(mSharedLibraries).collectMissingSharedLibraryInfos(any());
-
- PackageLite pkg = getPackageLite(TEST_APP_USING_SDK1_AND_SDK2);
- CallbackHelper callback = new CallbackHelper(/*expectSuccess=*/ false);
- mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(pkg, mComputer,
- 0, mHandler, callback);
- callback.assertFailure();
-
- assertThat(callback.error).hasMessageThat().contains("xyz");
- }
-
- @Test
public void testResolveLibraryDependenciesIfNeeded_failsToBind() throws Exception {
// Return a non-empty list as missing dependency
PackageLite pkg = getPackageLite(TEST_APP_USING_SDK1_AND_SDK2);
List<SharedLibraryInfo> missingDependency = Collections.singletonList(
mock(SharedLibraryInfo.class));
- when(mSharedLibraries.collectMissingSharedLibraryInfos(eq(pkg)))
- .thenReturn(missingDependency);
CallbackHelper callback = new CallbackHelper(/*expectSuccess=*/ false);
- mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(pkg, mComputer,
- 0, mHandler, callback);
+ mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(missingDependency, pkg,
+ mComputer, 0, mHandler, callback);
callback.assertFailure();
assertThat(callback.error).hasMessageThat().contains(
@@ -128,12 +107,10 @@ public class InstallDependencyHelperTest {
// Return an empty list as missing dependency
PackageLite pkg = getPackageLite(TEST_APP_USING_SDK1_AND_SDK2);
List<SharedLibraryInfo> missingDependency = Collections.emptyList();
- when(mSharedLibraries.collectMissingSharedLibraryInfos(eq(pkg)))
- .thenReturn(missingDependency);
CallbackHelper callback = new CallbackHelper(/*expectSuccess=*/ true);
- mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(pkg, mComputer,
- 0, mHandler, callback);
+ mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(missingDependency, pkg,
+ mComputer, 0, mHandler, callback);
callback.assertSuccess();
}
diff --git a/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java
index 7248833d876c..b166514ce0b9 100644
--- a/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java
+++ b/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java
@@ -64,6 +64,7 @@ import android.os.Binder;
import android.os.CpuHeadroomParamsInternal;
import android.os.GpuHeadroomParamsInternal;
import android.os.IBinder;
+import android.os.IHintManager;
import android.os.IHintSession;
import android.os.PerformanceHintManager;
import android.os.Process;
@@ -154,6 +155,8 @@ public class HintManagerServiceTest {
private ActivityManagerInternal mAmInternalMock;
@Mock
private PackageManager mMockPackageManager;
+ @Mock
+ private IHintManager.IHintManagerClient mClientCallback;
@Rule
public final CheckFlagsRule mCheckFlagsRule =
DeviceFlagsValueProvider.createCheckFlagsRule();
@@ -171,6 +174,23 @@ public class HintManagerServiceTest {
};
}
+ private SupportInfo makeDefaultSupportInfo() {
+ mSupportInfo = new SupportInfo();
+ mSupportInfo.usesSessions = true;
+ // By default, mark everything as fully supported
+ mSupportInfo.sessionHints = -1;
+ mSupportInfo.sessionModes = -1;
+ mSupportInfo.modes = -1;
+ mSupportInfo.boosts = -1;
+ mSupportInfo.sessionTags = -1;
+ mSupportInfo.headroom = new SupportInfo.HeadroomSupportInfo();
+ mSupportInfo.headroom.isCpuSupported = true;
+ mSupportInfo.headroom.cpuMinIntervalMillis = 2000;
+ mSupportInfo.headroom.isGpuSupported = true;
+ mSupportInfo.headroom.gpuMinIntervalMillis = 2000;
+ return mSupportInfo;
+ }
+
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
@@ -181,12 +201,7 @@ public class HintManagerServiceTest {
mConfig.eventFlagDescriptor = new MQDescriptor<Byte, Byte>();
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.category = ApplicationInfo.CATEGORY_GAME;
- mSupportInfo = new SupportInfo();
- mSupportInfo.headroom = new SupportInfo.HeadroomSupportInfo();
- mSupportInfo.headroom.isCpuSupported = true;
- mSupportInfo.headroom.cpuMinIntervalMillis = 2000;
- mSupportInfo.headroom.isGpuSupported = true;
- mSupportInfo.headroom.gpuMinIntervalMillis = 2000;
+ mSupportInfo = makeDefaultSupportInfo();
when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
when(mMockPackageManager.getNameForUid(anyInt())).thenReturn(TEST_APP_NAME);
when(mMockPackageManager.getApplicationInfo(eq(TEST_APP_NAME), anyInt()))
@@ -215,6 +230,7 @@ public class HintManagerServiceTest {
when(mIPowerMock.getInterfaceVersion()).thenReturn(6);
when(mIPowerMock.getSupportInfo()).thenReturn(mSupportInfo);
when(mIPowerMock.getSessionChannel(anyInt(), anyInt())).thenReturn(mConfig);
+ when(mIPowerMock.getSupportInfo()).thenReturn(mSupportInfo);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
LocalServices.addService(ActivityManagerInternal.class, mAmInternalMock);
}
@@ -409,8 +425,11 @@ public class HintManagerServiceTest {
HintManagerService service = createService();
IBinder token = new Binder();
- final int threadCount =
- service.getBinderServiceInstance().getMaxGraphicsPipelineThreadsCount();
+ IHintManager.HintManagerClientData data = service.getBinderServiceInstance()
+ .registerClient(mClientCallback);
+
+ final int threadCount = data.maxGraphicsPipelineThreads;
+
long sessionPtr1 = 1111L;
long sessionId1 = 11111L;
CountDownLatch stopLatch1 = new CountDownLatch(1);
@@ -1400,4 +1419,67 @@ public class HintManagerServiceTest {
verify(mIPowerMock, times(1)).getGpuHeadroom(eq(halParams1));
verify(mIPowerMock, times(1)).getGpuHeadroom(eq(halParams2));
}
+
+ @Test
+ public void testRegisteringClient() throws Exception {
+ HintManagerService service = createService();
+ IHintManager.HintManagerClientData data = service.getBinderServiceInstance()
+ .registerClient(mClientCallback);
+ assertNotNull(data);
+ assertEquals(data.supportInfo, mSupportInfo);
+ }
+
+ @Test
+ public void testRegisteringClientOnV4() throws Exception {
+ when(mIPowerMock.getInterfaceVersion()).thenReturn(4);
+ HintManagerService service = createService();
+ IHintManager.HintManagerClientData data = service.getBinderServiceInstance()
+ .registerClient(mClientCallback);
+ assertNotNull(data);
+ assertEquals(data.supportInfo.usesSessions, true);
+ assertEquals(data.supportInfo.boosts, 0);
+ assertEquals(data.supportInfo.modes, 0);
+ assertEquals(data.supportInfo.sessionHints, 31);
+ assertEquals(data.supportInfo.sessionModes, 0);
+ assertEquals(data.supportInfo.sessionTags, 0);
+ assertEquals(data.powerHalVersion, 4);
+ assertEquals(data.preferredRateNanos, DEFAULT_HINT_PREFERRED_RATE);
+ }
+
+ @Test
+ public void testRegisteringClientOnV5() throws Exception {
+ when(mIPowerMock.getInterfaceVersion()).thenReturn(5);
+ HintManagerService service = createService();
+ IHintManager.HintManagerClientData data = service.getBinderServiceInstance()
+ .registerClient(mClientCallback);
+ assertNotNull(data);
+ assertEquals(data.supportInfo.usesSessions, true);
+ assertEquals(data.supportInfo.boosts, 0);
+ assertEquals(data.supportInfo.modes, 0);
+ assertEquals(data.supportInfo.sessionHints, 255);
+ assertEquals(data.supportInfo.sessionModes, 1);
+ assertEquals(data.supportInfo.sessionTags, 31);
+ assertEquals(data.powerHalVersion, 5);
+ assertEquals(data.preferredRateNanos, DEFAULT_HINT_PREFERRED_RATE);
+ }
+
+ @Test
+ public void testSettingUpOldClientWhenUnsupported() throws Exception {
+ when(mIPowerMock.getInterfaceVersion()).thenReturn(5);
+ // Mock unsupported to modify the default support behavior
+ when(mNativeWrapperMock.halGetHintSessionPreferredRate())
+ .thenReturn(-1L);
+ HintManagerService service = createService();
+ IHintManager.HintManagerClientData data = service.getBinderServiceInstance()
+ .registerClient(mClientCallback);
+ assertNotNull(data);
+ assertEquals(data.supportInfo.usesSessions, false);
+ assertEquals(data.supportInfo.boosts, 0);
+ assertEquals(data.supportInfo.modes, 0);
+ assertEquals(data.supportInfo.sessionHints, 0);
+ assertEquals(data.supportInfo.sessionModes, 0);
+ assertEquals(data.supportInfo.sessionTags, 0);
+ assertEquals(data.powerHalVersion, 5);
+ assertEquals(data.preferredRateNanos, -1);
+ }
}
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
index 709f83ba907d..73dcfe77e67f 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
@@ -36,6 +36,7 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.ConditionVariable;
+import android.os.Handler;
import android.os.Parcel;
import android.os.Process;
import android.os.UidBatteryConsumer;
@@ -81,8 +82,9 @@ public class BatteryUsageStatsProviderTest {
.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0);
private MockClock mMockClock = mStatsRule.getMockClock();
- private MonotonicClock mMonotonicClock = new MonotonicClock(666777, mMockClock);
+ private MonotonicClock mMonotonicClock = mStatsRule.getMonotonicClock();
private Context mContext;
+ private PowerStatsStore mPowerStatsStore;
@Before
public void setup() throws IOException {
@@ -93,6 +95,9 @@ public class BatteryUsageStatsProviderTest {
} else {
mContext = InstrumentationRegistry.getContext();
}
+ mPowerStatsStore = spy(new PowerStatsStore(
+ new File(mStatsRule.getHistoryDir(), getClass().getSimpleName()),
+ mStatsRule.getHandler()));
}
@Test
@@ -274,10 +279,7 @@ public class BatteryUsageStatsProviderTest {
powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
true);
- BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
- powerAttributor, mStatsRule.getPowerProfile(),
- mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock,
- mMonotonicClock);
+ BatteryUsageStatsProvider provider = createBatteryUsageStatsProvider(0);
return provider.getBatteryUsageStats(batteryStats, BatteryUsageStatsQuery.DEFAULT);
}
@@ -331,30 +333,30 @@ public class BatteryUsageStatsProviderTest {
BatteryStats.HistoryItem item;
assertThat(item = iterator.next()).isNotNull();
- assertHistoryItem(item,
+ assertHistoryItem(batteryStats, item,
BatteryStats.HistoryItem.CMD_RESET, BatteryStats.HistoryItem.EVENT_NONE,
null, 0, 3_600_000, 90, 1_000_000);
assertThat(item = iterator.next()).isNotNull();
- assertHistoryItem(item,
+ assertHistoryItem(batteryStats, item,
BatteryStats.HistoryItem.CMD_UPDATE, BatteryStats.HistoryItem.EVENT_NONE,
null, 0, 3_600_000, 90, 1_000_000);
assertThat(item.states & BatteryStats.HistoryItem.STATE_CPU_RUNNING_FLAG).isNotEqualTo(0);
assertThat(item = iterator.next()).isNotNull();
- assertHistoryItem(item,
+ assertHistoryItem(batteryStats, item,
BatteryStats.HistoryItem.CMD_UPDATE, BatteryStats.HistoryItem.EVENT_NONE,
null, 0, 3_600_000, 90, 2_000_000);
assertThat(item.states & BatteryStats.HistoryItem.STATE_CPU_RUNNING_FLAG).isEqualTo(0);
assertThat(item = iterator.next()).isNotNull();
- assertHistoryItem(item,
+ assertHistoryItem(batteryStats, item,
BatteryStats.HistoryItem.CMD_UPDATE,
BatteryStats.HistoryItem.EVENT_ALARM | BatteryStats.HistoryItem.EVENT_FLAG_START,
"foo", APP_UID, 3_600_000, 90, 3_000_000);
assertThat(item = iterator.next()).isNotNull();
- assertHistoryItem(item,
+ assertHistoryItem(batteryStats, item,
BatteryStats.HistoryItem.CMD_UPDATE,
BatteryStats.HistoryItem.EVENT_ALARM | BatteryStats.HistoryItem.EVENT_FLAG_FINISH,
"foo", APP_UID, 3_600_000, 90, 3_001_000);
@@ -441,14 +443,15 @@ public class BatteryUsageStatsProviderTest {
assertThat(item.eventTag.string).startsWith(uid + " ");
assertThat(item.batteryChargeUah).isEqualTo(3_600_000);
assertThat(item.batteryLevel).isEqualTo(90);
- assertThat(item.time).isEqualTo((long) 1_000_000);
+ assertThat(item.time).isEqualTo(batteryStats.getMonotonicStartTime() + 1_000_000);
}
assertThat(expectedUid).isEqualTo(200);
}
- private void assertHistoryItem(BatteryStats.HistoryItem item, int command, int eventCode,
- String tag, int uid, int batteryChargeUah, int batteryLevel, long elapsedTimeMs) {
+ private void assertHistoryItem(MockBatteryStatsImpl batteryStats, BatteryStats.HistoryItem item,
+ int command, int eventCode, String tag, int uid, int batteryChargeUah, int batteryLevel,
+ long elapsedTimeMs) {
assertThat(item.cmd).isEqualTo(command);
assertThat(item.eventCode).isEqualTo(eventCode);
if (tag == null) {
@@ -460,7 +463,7 @@ public class BatteryUsageStatsProviderTest {
assertThat(item.batteryChargeUah).isEqualTo(batteryChargeUah);
assertThat(item.batteryLevel).isEqualTo(batteryLevel);
- assertThat(item.time).isEqualTo(elapsedTimeMs);
+ assertThat(item.time).isEqualTo(batteryStats.getMonotonicStartTime() + elapsedTimeMs);
}
@Test
@@ -566,38 +569,66 @@ public class BatteryUsageStatsProviderTest {
assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS);
assertThat(stats.getStatsEndTimestamp()).isEqualTo(55 * MINUTE_IN_MS);
- assertThat(stats.getAggregateBatteryConsumer(
- BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
- .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
- .isWithin(0.0001)
- .of(180.0); // 360 mA * 0.5 hours
- assertThat(stats.getAggregateBatteryConsumer(
- BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
- .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
- .isEqualTo((10 + 20) * MINUTE_IN_MS);
- final UidBatteryConsumer uidBatteryConsumer = stats.getUidBatteryConsumers().stream()
- .filter(uid -> uid.getUid() == APP_UID).findFirst().get();
- assertThat(uidBatteryConsumer
- .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
- .isWithin(0.1)
- .of(180.0);
+ assertBatteryConsumer(stats, 180.0, (10 + 20) * MINUTE_IN_MS);
+ assertBatteryConsumer(stats, APP_UID, 180.0, (10 + 20) * MINUTE_IN_MS);
stats.close();
}
@Test
public void accumulateBatteryUsageStats() throws Throwable {
- accumulateBatteryUsageStats(10000000, 1);
+ MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
+ accumulateBatteryUsageStats(batteryStats, 10000000, 0);
// Accumulate every 200 bytes of battery history
- accumulateBatteryUsageStats(200, 2);
- accumulateBatteryUsageStats(50, 5);
+ accumulateBatteryUsageStats(batteryStats, 200, 2);
+ accumulateBatteryUsageStats(batteryStats, 50, 4);
// Accumulate on every invocation of accumulateBatteryUsageStats
- accumulateBatteryUsageStats(0, 7);
+ accumulateBatteryUsageStats(batteryStats, 0, 7);
}
- private void accumulateBatteryUsageStats(int accumulatedBatteryUsageStatsSpanSize,
- int expectedNumberOfUpdates) throws Throwable {
- BatteryStatsImpl batteryStats = spy(mStatsRule.getBatteryStats());
+ @Test
+ public void getAccumulatedBatteryUsageStats() throws Throwable {
+ MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
+
+ // Only accumulate the first 25 minutes
+ accumulateBatteryUsageStats(batteryStats, 200, 1);
+
+ BatteryUsageStatsProvider batteryUsageStatsProvider = createBatteryUsageStatsProvider(200);
+
+ // At this point the last stored accumulated stats are `115 - 30 = 85` minutes old
+ BatteryUsageStats stats = batteryUsageStatsProvider.getBatteryUsageStats(batteryStats,
+ new BatteryUsageStatsQuery.Builder()
+ .accumulated()
+ .setMaxStatsAgeMs(90 * MINUTE_IN_MS)
+ .build());
+
+ assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS);
+ assertThat(stats.getStatsEndTimestamp()).isEqualTo(30 * MINUTE_IN_MS);
+ assertBatteryConsumer(stats, 60.0, 10 * MINUTE_IN_MS);
+ assertBatteryConsumer(stats, APP_UID, 60.0, 10 * MINUTE_IN_MS);
+
+ stats.close();
+
+ // Now force the usage stats to catch up to the current time
+ stats = batteryUsageStatsProvider.getBatteryUsageStats(batteryStats,
+ new BatteryUsageStatsQuery.Builder()
+ .accumulated()
+ .setMaxStatsAgeMs(5 * MINUTE_IN_MS)
+ .build());
+
+ assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS);
+ assertThat(stats.getStatsEndTimestamp()).isEqualTo(115 * MINUTE_IN_MS);
+ assertBatteryConsumer(stats, 360.0, 60 * MINUTE_IN_MS);
+ assertBatteryConsumer(stats, APP_UID, 360.0, 60 * MINUTE_IN_MS);
+
+ stats.close();
+ }
+
+ private void accumulateBatteryUsageStats(MockBatteryStatsImpl batteryStatsImpl,
+ int accumulatedBatteryUsageStatsSpanSize, int expectedNumberOfUpdates)
+ throws Throwable {
+ Handler handler = mStatsRule.getHandler();
+ MockBatteryStatsImpl batteryStats = spy(batteryStatsImpl);
// Note - these two are in microseconds
when(batteryStats.computeBatteryTimeRemaining(anyLong())).thenReturn(111_000L);
when(batteryStats.computeChargeTimeRemaining(anyLong())).thenReturn(777_000L);
@@ -610,82 +641,76 @@ public class BatteryUsageStatsProviderTest {
batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND);
}
- PowerStatsStore powerStatsStore = spy(new PowerStatsStore(
- new File(mStatsRule.getHistoryDir(), getClass().getSimpleName()),
- mStatsRule.getHandler()));
- powerStatsStore.reset();
+ mPowerStatsStore.reset();
int[] count = new int[1];
doAnswer(inv -> {
count[0]++;
- return null;
- }).when(powerStatsStore).storePowerStatsSpan(any(PowerStatsSpan.class));
+ return inv.callRealMethod();
+ }).when(mPowerStatsStore).storePowerStatsSpan(any(PowerStatsSpan.class));
- MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext,
- powerStatsStore, mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(),
- () -> 3500);
- for (int powerComponentId = 0; powerComponentId < BatteryConsumer.POWER_COMPONENT_COUNT;
- powerComponentId++) {
- powerAttributor.setPowerComponentSupported(powerComponentId, true);
- }
- powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_ANY, true);
-
- BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
- powerAttributor, mStatsRule.getPowerProfile(),
- mStatsRule.getCpuScalingPolicies(), powerStatsStore,
- accumulatedBatteryUsageStatsSpanSize, mMockClock, mMonotonicClock);
+ BatteryUsageStatsProvider batteryUsageStatsProvider = createBatteryUsageStatsProvider(
+ accumulatedBatteryUsageStatsSpanSize);
- provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler());
+ batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler);
+ setTime(10 * MINUTE_IN_MS);
synchronized (batteryStats) {
batteryStats.noteFlashlightOnLocked(APP_UID,
10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS);
}
- provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler());
+ batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler);
+ setTime(20 * MINUTE_IN_MS);
synchronized (batteryStats) {
batteryStats.noteFlashlightOffLocked(APP_UID,
20 * MINUTE_IN_MS, 20 * MINUTE_IN_MS);
}
- provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler());
+ batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler);
+ setTime(30 * MINUTE_IN_MS);
synchronized (batteryStats) {
batteryStats.noteFlashlightOnLocked(APP_UID,
30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS);
}
- provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler());
+ batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler);
+ // Make sure the accumulated stats are computed and saved before generating more history
+ mStatsRule.waitForBackgroundThread();
+
+ setTime(50 * MINUTE_IN_MS);
synchronized (batteryStats) {
batteryStats.noteFlashlightOffLocked(APP_UID,
50 * MINUTE_IN_MS, 50 * MINUTE_IN_MS);
}
setTime(55 * MINUTE_IN_MS);
- provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler());
+ batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler);
// This section has not been saved yet, but should be added to the accumulated totals
+ setTime(80 * MINUTE_IN_MS);
synchronized (batteryStats) {
batteryStats.noteFlashlightOnLocked(APP_UID,
80 * MINUTE_IN_MS, 80 * MINUTE_IN_MS);
}
- provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler());
+ batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler);
+ setTime(110 * MINUTE_IN_MS);
synchronized (batteryStats) {
batteryStats.noteFlashlightOffLocked(APP_UID,
110 * MINUTE_IN_MS, 110 * MINUTE_IN_MS);
}
setTime(115 * MINUTE_IN_MS);
- // Pick up the remainder of battery history that has not yet been accumulated
- provider.accumulateBatteryUsageStats(batteryStats);
+ batteryUsageStatsProvider.accumulateBatteryUsageStatsAsync(batteryStats, handler);
mStatsRule.waitForBackgroundThread();
- BatteryUsageStats stats = provider.getBatteryUsageStats(batteryStats,
+ BatteryUsageStats stats = batteryUsageStatsProvider.getBatteryUsageStats(batteryStats,
new BatteryUsageStatsQuery.Builder().accumulated().build());
assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS);
@@ -696,29 +721,55 @@ public class BatteryUsageStatsProviderTest {
assertThat(stats.getBatteryCapacity()).isEqualTo(4000); // from PowerProfile
// Total: 10 + 20 + 30 = 60
- assertThat(stats.getAggregateBatteryConsumer(
- BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
+ assertBatteryConsumer(stats, 360.0, 60 * MINUTE_IN_MS);
+ assertBatteryConsumer(stats, APP_UID, 360.0, 60 * MINUTE_IN_MS);
+ stats.close();
+
+ mStatsRule.waitForBackgroundThread();
+
+ assertThat(count[0]).isEqualTo(expectedNumberOfUpdates);
+ }
+
+ private BatteryUsageStatsProvider createBatteryUsageStatsProvider(
+ int accumulatedBatteryUsageStatsSpanSize) {
+ MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext,
+ mPowerStatsStore, mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(),
+ () -> 3500);
+ for (int powerComponentId = 0; powerComponentId < BatteryConsumer.POWER_COMPONENT_COUNT;
+ powerComponentId++) {
+ powerAttributor.setPowerComponentSupported(powerComponentId, true);
+ }
+ powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_ANY, true);
+
+ return new BatteryUsageStatsProvider(mContext, powerAttributor,
+ mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), mPowerStatsStore,
+ accumulatedBatteryUsageStatsSpanSize, mMockClock, mMonotonicClock);
+ }
+
+ private static void assertBatteryConsumer(BatteryUsageStats stats, double expectedPowerMah,
+ long expectedDurationMs) {
+ AggregateBatteryConsumer aggregatedConsumer = stats.getAggregateBatteryConsumer(
+ BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
+ assertThat(aggregatedConsumer
.getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
.isWithin(0.0001)
- .of(360.0); // 360 mA * 1.0 hour
- assertThat(stats.getAggregateBatteryConsumer(
- BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
+ .of(expectedPowerMah);
+ assertThat(aggregatedConsumer
.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
- .isEqualTo(60 * MINUTE_IN_MS);
+ .isEqualTo(expectedDurationMs);
+ }
+ private static void assertBatteryConsumer(BatteryUsageStats stats, int uid,
+ double expectedPowerMah, long expectedDurationMs) {
final UidBatteryConsumer uidBatteryConsumer = stats.getUidBatteryConsumers().stream()
- .filter(uid -> uid.getUid() == APP_UID).findFirst().get();
+ .filter(u -> u.getUid() == uid).findFirst().get();
assertThat(uidBatteryConsumer
.getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
.isWithin(0.1)
- .of(360.0);
+ .of(expectedPowerMah);
assertThat(uidBatteryConsumer
.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
- .isEqualTo(60 * MINUTE_IN_MS);
-
- assertThat(count[0]).isEqualTo(expectedNumberOfUpdates);
-
- stats.close();
+ .isEqualTo(expectedDurationMs);
}
private void setTime(long timeMs) {
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java
index a3c7ece386c7..9e7e0b646047 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java
@@ -41,6 +41,7 @@ import android.util.SparseArray;
import android.util.Xml;
import com.android.internal.os.CpuScalingPolicies;
+import com.android.internal.os.MonotonicClock;
import com.android.internal.os.PowerProfile;
import com.android.internal.power.EnergyConsumerStats;
@@ -65,6 +66,7 @@ public class BatteryUsageStatsRule implements TestRule {
private final PowerProfile mPowerProfile;
private final MockClock mMockClock = new MockClock();
+ private final MonotonicClock mMonotonicClock = new MonotonicClock(666777, mMockClock);
private String mTestName;
private boolean mCreateTempDirectory;
private File mHistoryDir;
@@ -118,7 +120,7 @@ public class BatteryUsageStatsRule implements TestRule {
clearDirectory();
}
mBatteryStats = new MockBatteryStatsImpl(mBatteryStatsConfigBuilder.build(),
- mMockClock, mHistoryDir, mHandler, new PowerStatsUidResolver());
+ mMockClock, mMonotonicClock, mHistoryDir, mHandler, new PowerStatsUidResolver());
mBatteryStats.setPowerProfile(mPowerProfile);
mBatteryStats.setCpuScalingPolicies(new CpuScalingPolicies(mCpusByPolicy, mFreqsByPolicy));
synchronized (mBatteryStats) {
@@ -144,6 +146,10 @@ public class BatteryUsageStatsRule implements TestRule {
return mMockClock;
}
+ public MonotonicClock getMonotonicClock() {
+ return mMonotonicClock;
+ }
+
public Handler getHandler() {
return mHandler;
}
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java
index b374a3202fa2..9a38209a7d17 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java
@@ -77,9 +77,15 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
new PowerStatsUidResolver());
}
- MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory,
- Handler handler, PowerStatsUidResolver powerStatsUidResolver) {
- super(config, clock, new MonotonicClock(0, clock), historyDirectory, handler,
+ MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock,
+ File historyDirectory, Handler handler, PowerStatsUidResolver powerStatsUidResolver) {
+ this(config, clock, new MonotonicClock(0, clock), historyDirectory, handler,
+ powerStatsUidResolver);
+ }
+
+ MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, MonotonicClock monotonicClock,
+ File historyDirectory, Handler handler, PowerStatsUidResolver powerStatsUidResolver) {
+ super(config, clock, monotonicClock, historyDirectory, handler,
mock(PlatformIdleStateCallback.class), mock(EnergyStatsRetriever.class),
mock(UserInfoProvider.class), mockPowerProfile(),
new CpuScalingPolicies(new SparseArray<>(), new SparseArray<>()),
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java
index f312bedca82c..3bdbcb50e601 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java
@@ -263,6 +263,34 @@ public class PowerStatsAggregatorTest {
});
}
+ @Test
+ public void emptyHistory() {
+ PowerStats.Descriptor descriptor = new PowerStats.Descriptor(TEST_POWER_COMPONENT,
+ "majorDrain", 1, null, 0, 1, new PersistableBundle());
+ PowerStats powerStats = new PowerStats(descriptor);
+
+ mHistory.forceRecordAllHistory();
+
+ advance(1000);
+
+ long firstItemTimestamp = mMonotonicClock.monotonicTime();
+ powerStats.stats = new long[]{24};
+ mHistory.recordPowerStats(mClock.realtime, mClock.uptime, powerStats);
+
+ advance(1000);
+
+ long secondItemTimestamp = mMonotonicClock.monotonicTime();
+ powerStats.stats = new long[]{42};
+ mHistory.recordPowerStats(mClock.realtime, mClock.uptime, powerStats);
+
+ mAggregator.aggregatePowerStats(mHistory, firstItemTimestamp + 1, secondItemTimestamp,
+ stats -> {
+ mAggregatedStatsCount++;
+ });
+
+ assertThat(mAggregatedStatsCount).isEqualTo(0);
+ }
+
private void advance(long durationMs) {
mClock.realtime += durationMs;
mClock.uptime += durationMs;
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java
index 38fe6134d992..d243f92a139f 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java
@@ -408,7 +408,7 @@ public class PowerStatsExporterTest {
BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(
new String[]{"cu570m"},
/* includeProcessStateData */ true, true, true, /* powerThreshold */ 0);
- exportAggregatedPowerStats(builder, 3700, 6700);
+ exportAggregatedPowerStats(builder, 3700, 7500);
BatteryUsageStats actual = builder.build();
String message = "Actual BatteryUsageStats: " + actual;
diff --git a/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java b/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java
index 9850cb09ae2b..8024915692aa 100644
--- a/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java
@@ -16,12 +16,7 @@
package com.android.server;
-import static android.service.quickaccesswallet.Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP;
-import static android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap;
-
-import static com.android.server.GestureLauncherService.LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER;
-import static com.android.server.GestureLauncherService.LAUNCH_WALLET_ON_DOUBLE_TAP_POWER;
-import static com.android.server.GestureLauncherService.POWER_DOUBLE_TAP_MAX_TIME_MS;
+import static com.android.server.GestureLauncherService.CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -29,27 +24,19 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.app.PendingIntent;
import android.app.StatusBarManager;
-import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.res.Resources;
import android.os.Looper;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
-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 android.service.quickaccesswallet.QuickAccessWalletClient;
import android.telecom.TelecomManager;
import android.test.mock.MockContentResolver;
import android.testing.TestableLooper;
@@ -68,7 +55,6 @@ import com.android.server.statusbar.StatusBarManagerInternal;
import org.junit.Before;
import org.junit.BeforeClass;
-import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -76,8 +62,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
/**
* Unit tests for {@link GestureLauncherService}.
@@ -106,32 +90,9 @@ public class GestureLauncherServiceTest {
private @Mock TelecomManager mTelecomManager;
private @Mock MetricsLogger mMetricsLogger;
@Mock private UiEventLogger mUiEventLogger;
- @Mock private QuickAccessWalletClient mQuickAccessWalletClient;
private MockContentResolver mContentResolver;
private GestureLauncherService mGestureLauncherService;
- private Context mInstrumentationContext =
- InstrumentationRegistry.getInstrumentation().getContext();
-
- private static final String LAUNCH_TEST_WALLET_ACTION = "LAUNCH_TEST_WALLET_ACTION";
- private static final String LAUNCH_FALLBACK_ACTION = "LAUNCH_FALLBACK_ACTION";
- private PendingIntent mGesturePendingIntent =
- PendingIntent.getBroadcast(
- mInstrumentationContext,
- 0,
- new Intent(LAUNCH_TEST_WALLET_ACTION),
- PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
-
- private PendingIntent mFallbackPendingIntent =
- PendingIntent.getBroadcast(
- mInstrumentationContext,
- 0,
- new Intent(LAUNCH_FALLBACK_ACTION),
- PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
-
- @Rule
- public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
-
@BeforeClass
public static void oneTimeInitialization() {
if (Looper.myLooper() == null) {
@@ -154,49 +115,9 @@ public class GestureLauncherServiceTest {
when(mContext.getContentResolver()).thenReturn(mContentResolver);
when(mContext.getSystemService(Context.TELECOM_SERVICE)).thenReturn(mTelecomManager);
when(mTelecomManager.createLaunchEmergencyDialerIntent(null)).thenReturn(new Intent());
- when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
-
- mGestureLauncherService =
- new GestureLauncherService(
- mContext, mMetricsLogger, mQuickAccessWalletClient, mUiEventLogger);
-
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER);
- }
- private WalletLaunchedReceiver registerWalletLaunchedReceiver(String action) {
- IntentFilter filter = new IntentFilter(action);
- WalletLaunchedReceiver receiver = new WalletLaunchedReceiver();
- mInstrumentationContext.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
- return receiver;
- }
-
- /**
- * A simple {@link BroadcastReceiver} implementation that counts down a {@link CountDownLatch}
- * when a matching message is received
- */
- private static final class WalletLaunchedReceiver extends BroadcastReceiver {
- private static final int TIMEOUT_SECONDS = 3;
-
- private final CountDownLatch mLatch;
-
- WalletLaunchedReceiver() {
- mLatch = new CountDownLatch(1);
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- mLatch.countDown();
- context.unregisterReceiver(this);
- }
-
- Boolean waitUntilShown() {
- try {
- return mLatch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- return false;
- }
- }
+ mGestureLauncherService = new GestureLauncherService(mContext, mMetricsLogger,
+ mUiEventLogger);
}
@Test
@@ -213,123 +134,37 @@ public class GestureLauncherServiceTest {
@Test
public void testIsCameraDoubleTapPowerSettingEnabled_configFalseSettingDisabled() {
- if (launchWalletOptionOnPowerDoubleTap()) {
- withDoubleTapPowerEnabledConfigValue(false);
- withDoubleTapPowerGestureEnableSettingValue(false);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER);
- } else {
- withCameraDoubleTapPowerEnableConfigValue(false);
- withCameraDoubleTapPowerDisableSettingValue(1);
- }
+ withCameraDoubleTapPowerEnableConfigValue(false);
+ withCameraDoubleTapPowerDisableSettingValue(1);
assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
mContext, FAKE_USER_ID));
}
@Test
public void testIsCameraDoubleTapPowerSettingEnabled_configFalseSettingEnabled() {
- if (launchWalletOptionOnPowerDoubleTap()) {
- withDoubleTapPowerEnabledConfigValue(false);
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER);
- assertTrue(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
- mContext, FAKE_USER_ID));
- } else {
- withCameraDoubleTapPowerEnableConfigValue(false);
- withCameraDoubleTapPowerDisableSettingValue(0);
- assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
- mContext, FAKE_USER_ID));
- }
+ withCameraDoubleTapPowerEnableConfigValue(false);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
+ mContext, FAKE_USER_ID));
}
@Test
public void testIsCameraDoubleTapPowerSettingEnabled_configTrueSettingDisabled() {
- if (launchWalletOptionOnPowerDoubleTap()) {
- withDoubleTapPowerEnabledConfigValue(true);
- withDoubleTapPowerGestureEnableSettingValue(false);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER);
- } else {
- withCameraDoubleTapPowerEnableConfigValue(true);
- withCameraDoubleTapPowerDisableSettingValue(1);
- }
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(1);
assertFalse(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
mContext, FAKE_USER_ID));
}
@Test
public void testIsCameraDoubleTapPowerSettingEnabled_configTrueSettingEnabled() {
- if (launchWalletOptionOnPowerDoubleTap()) {
- withDoubleTapPowerEnabledConfigValue(true);
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER);
- } else {
- withCameraDoubleTapPowerEnableConfigValue(true);
- withCameraDoubleTapPowerDisableSettingValue(0);
- }
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
assertTrue(mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
mContext, FAKE_USER_ID));
}
@Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testIsCameraDoubleTapPowerSettingEnabled_actionWallet() {
- withDoubleTapPowerEnabledConfigValue(true);
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER);
-
- assertFalse(
- mGestureLauncherService.isCameraDoubleTapPowerSettingEnabled(
- mContext, FAKE_USER_ID));
- }
-
- @Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testIsWalletDoubleTapPowerSettingEnabled() {
- withDoubleTapPowerEnabledConfigValue(true);
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER);
-
- assertTrue(
- mGestureLauncherService.isWalletDoubleTapPowerSettingEnabled(
- mContext, FAKE_USER_ID));
- }
-
- @Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testIsWalletDoubleTapPowerSettingEnabled_configDisabled() {
- withDoubleTapPowerEnabledConfigValue(false);
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER);
-
- assertTrue(
- mGestureLauncherService.isWalletDoubleTapPowerSettingEnabled(
- mContext, FAKE_USER_ID));
- }
-
- @Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testIsWalletDoubleTapPowerSettingEnabled_settingDisabled() {
- withDoubleTapPowerEnabledConfigValue(true);
- withDoubleTapPowerGestureEnableSettingValue(false);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER);
-
- assertFalse(
- mGestureLauncherService.isWalletDoubleTapPowerSettingEnabled(
- mContext, FAKE_USER_ID));
- }
-
- @Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testIsWalletDoubleTapPowerSettingEnabled_actionCamera() {
- withDoubleTapPowerEnabledConfigValue(true);
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER);
-
- assertFalse(
- mGestureLauncherService.isWalletDoubleTapPowerSettingEnabled(
- mContext, FAKE_USER_ID));
- }
-
- @Test
public void testIsEmergencyGestureSettingEnabled_settingDisabled() {
withEmergencyGestureEnabledConfigValue(true);
withEmergencyGestureEnabledSettingValue(false);
@@ -410,9 +245,12 @@ public class GestureLauncherServiceTest {
@Test
public void testInterceptPowerKeyDown_firstPowerDownCameraPowerGestureOnInteractive() {
- enableCameraGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
- long eventTime = INITIAL_EVENT_TIME_MILLIS + POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ long eventTime = INITIAL_EVENT_TIME_MILLIS +
+ CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
boolean interactive = true;
@@ -446,12 +284,8 @@ public class GestureLauncherServiceTest {
@Test
public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOffInteractive() {
- if (launchWalletOptionOnPowerDoubleTap()) {
- withDoubleTapPowerGestureEnableSettingValue(false);
- } else {
- withCameraDoubleTapPowerEnableConfigValue(false);
- withCameraDoubleTapPowerDisableSettingValue(1);
- }
+ withCameraDoubleTapPowerEnableConfigValue(false);
+ withCameraDoubleTapPowerDisableSettingValue(1);
mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
long eventTime = INITIAL_EVENT_TIME_MILLIS;
@@ -464,7 +298,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -495,12 +329,8 @@ public class GestureLauncherServiceTest {
@Test
public void testInterceptPowerKeyDown_intervalMidBoundsCameraPowerGestureOffInteractive() {
- if (launchWalletOptionOnPowerDoubleTap()) {
- withDoubleTapPowerGestureEnableSettingValue(false);
- } else {
- withCameraDoubleTapPowerEnableConfigValue(false);
- withCameraDoubleTapPowerDisableSettingValue(1);
- }
+ withCameraDoubleTapPowerEnableConfigValue(false);
+ withCameraDoubleTapPowerDisableSettingValue(1);
mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
long eventTime = INITIAL_EVENT_TIME_MILLIS;
@@ -513,7 +343,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -592,7 +422,10 @@ public class GestureLauncherServiceTest {
@Test
public void
testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupComplete() {
- enableCameraGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
+ withUserSetupCompleteValue(true);
long eventTime = INITIAL_EVENT_TIME_MILLIS;
KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
@@ -604,7 +437,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -637,145 +470,15 @@ public class GestureLauncherServiceTest {
}
@Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void
- testInterceptPowerKeyDown_fiveInboundPresses_walletAndEmergencyEnabled_bothLaunch() {
- WalletLaunchedReceiver receiver = registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION);
- setUpGetGestureTargetActivityPendingIntent(mGesturePendingIntent);
- enableEmergencyGesture();
- enableWalletGesture();
-
- // First event
- long eventTime = INITIAL_EVENT_TIME_MILLIS;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
-
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true);
-
- assertTrue(receiver.waitUntilShown());
-
- // Presses 3 and 4 should not trigger any gesture
- for (int i = 0; i < 2; i++) {
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, false);
- }
-
- // Fifth button press should trigger the emergency flow
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true);
-
- verify(mUiEventLogger, times(1))
- .log(GestureLauncherService.GestureLauncherEvent.GESTURE_EMERGENCY_TAP_POWER);
- verify(mStatusBarManagerInternal).onEmergencyActionLaunchGestureDetected();
- }
-
- @Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testInterceptPowerKeyDown_intervalInBoundsWalletPowerGesture() {
- WalletLaunchedReceiver receiver = registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION);
- setUpGetGestureTargetActivityPendingIntent(mGesturePendingIntent);
- enableWalletGesture();
- enableEmergencyGesture();
-
- long eventTime = INITIAL_EVENT_TIME_MILLIS;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true);
- assertTrue(receiver.waitUntilShown());
- }
-
- @Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testInterceptPowerKeyDown_walletGestureOn_quickAccessWalletServiceUnavailable() {
- when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
- WalletLaunchedReceiver receiver = registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION);
- setUpGetGestureTargetActivityPendingIntent(mGesturePendingIntent);
- enableWalletGesture();
-
- // First event
- long eventTime = INITIAL_EVENT_TIME_MILLIS;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
-
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, false);
-
- assertFalse(receiver.waitUntilShown());
- }
-
- @Test
- public void testInterceptPowerKeyDown_walletGestureOn_userSetupIncomplete() {
- WalletLaunchedReceiver receiver = registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION);
- setUpGetGestureTargetActivityPendingIntent(mGesturePendingIntent);
- enableWalletGesture();
- withUserSetupCompleteValue(false);
-
- // First event
- long eventTime = INITIAL_EVENT_TIME_MILLIS;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
-
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
-
- assertFalse(receiver.waitUntilShown());
- }
-
- @Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testInterceptPowerKeyDown_walletPowerGesture_nullPendingIntent() {
- WalletLaunchedReceiver gestureReceiver =
- registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION);
- setUpGetGestureTargetActivityPendingIntent(null);
- WalletLaunchedReceiver fallbackReceiver =
- registerWalletLaunchedReceiver(LAUNCH_FALLBACK_ACTION);
- setUpWalletFallbackPendingIntent(mFallbackPendingIntent);
- enableWalletGesture();
- enableEmergencyGesture();
-
- // First event
- long eventTime = INITIAL_EVENT_TIME_MILLIS;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
-
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true);
-
- assertFalse(gestureReceiver.waitUntilShown());
- assertTrue(fallbackReceiver.waitUntilShown());
- }
-
- @Test
- @RequiresFlagsEnabled(FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP)
- public void testInterceptPowerKeyDown_walletPowerGesture_intervalOutOfBounds() {
- WalletLaunchedReceiver gestureReceiver =
- registerWalletLaunchedReceiver(LAUNCH_TEST_WALLET_ACTION);
- setUpGetGestureTargetActivityPendingIntent(null);
- WalletLaunchedReceiver fallbackReceiver =
- registerWalletLaunchedReceiver(LAUNCH_FALLBACK_ACTION);
- setUpWalletFallbackPendingIntent(mFallbackPendingIntent);
- enableWalletGesture();
- enableEmergencyGesture();
-
- // First event
- long eventTime = INITIAL_EVENT_TIME_MILLIS;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
-
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS;
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
-
- assertFalse(gestureReceiver.waitUntilShown());
- assertFalse(fallbackReceiver.waitUntilShown());
- }
-
- @Test
public void
testInterceptPowerKeyDown_fiveInboundPresses_cameraAndEmergencyEnabled_bothLaunch() {
- enableCameraGesture();
- enableEmergencyGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ withEmergencyGestureEnabledConfigValue(true);
+ withEmergencyGestureEnabledSettingValue(true);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
+ mGestureLauncherService.updateEmergencyGestureEnabled();
+ withUserSetupCompleteValue(true);
// First button press does nothing
long eventTime = INITIAL_EVENT_TIME_MILLIS;
@@ -788,7 +491,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
// 2nd button triggers camera
eventTime += interval;
@@ -877,7 +580,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
// 3 more button presses which should not trigger any gesture (camera gesture disabled)
for (int i = 0; i < 3; i++) {
eventTime += interval;
@@ -931,7 +634,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
// 3 more button presses which should not trigger any gesture, but intercepts action.
for (int i = 0; i < 3; i++) {
eventTime += interval;
@@ -1034,7 +737,7 @@ public class GestureLauncherServiceTest {
interactive, outLaunched);
assertTrue(intercepted);
assertFalse(outLaunched.value);
- interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
}
}
@@ -1062,7 +765,7 @@ public class GestureLauncherServiceTest {
interactive, outLaunched);
assertTrue(intercepted);
assertFalse(outLaunched.value);
- interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
}
}
@@ -1213,7 +916,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT, IGNORED_META_STATE, IGNORED_DEVICE_ID, IGNORED_SCANCODE,
@@ -1244,7 +947,9 @@ public class GestureLauncherServiceTest {
@Test
public void
testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnInteractiveSetupIncomplete() {
- enableCameraGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
withUserSetupCompleteValue(false);
long eventTime = INITIAL_EVENT_TIME_MILLIS;
@@ -1257,7 +962,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -1290,7 +995,9 @@ public class GestureLauncherServiceTest {
@Test
public void testInterceptPowerKeyDown_intervalMidBoundsCameraPowerGestureOnInteractive() {
- enableCameraGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
long eventTime = INITIAL_EVENT_TIME_MILLIS;
KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
@@ -1302,7 +1009,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -1335,7 +1042,9 @@ public class GestureLauncherServiceTest {
@Test
public void testInterceptPowerKeyDown_intervalOutOfBoundsCameraPowerGestureOnInteractive() {
- enableCameraGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
long eventTime = INITIAL_EVENT_TIME_MILLIS;
KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
@@ -1378,12 +1087,8 @@ public class GestureLauncherServiceTest {
@Test
public void testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOffNotInteractive() {
- if (launchWalletOptionOnPowerDoubleTap()) {
- withDoubleTapPowerGestureEnableSettingValue(false);
- } else {
- withCameraDoubleTapPowerEnableConfigValue(false);
- withCameraDoubleTapPowerDisableSettingValue(1);
- }
+ withCameraDoubleTapPowerEnableConfigValue(false);
+ withCameraDoubleTapPowerDisableSettingValue(1);
mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
long eventTime = INITIAL_EVENT_TIME_MILLIS;
@@ -1396,7 +1101,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -1441,7 +1146,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -1518,7 +1223,10 @@ public class GestureLauncherServiceTest {
@Test
public void
testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnNotInteractiveSetupComplete() {
- enableCameraGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
+ withUserSetupCompleteValue(true);
long eventTime = INITIAL_EVENT_TIME_MILLIS;
KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
@@ -1530,7 +1238,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -1564,7 +1272,9 @@ public class GestureLauncherServiceTest {
@Test
public void
testInterceptPowerKeyDown_intervalInBoundsCameraPowerGestureOnNotInteractiveSetupIncomplete() {
- enableCameraGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
withUserSetupCompleteValue(false);
long eventTime = INITIAL_EVENT_TIME_MILLIS;
@@ -1577,7 +1287,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -1622,7 +1332,7 @@ public class GestureLauncherServiceTest {
assertFalse(intercepted);
assertFalse(outLaunched.value);
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS;
+ final long interval = CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS;
eventTime += interval;
keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
IGNORED_REPEAT);
@@ -1655,7 +1365,9 @@ public class GestureLauncherServiceTest {
@Test
public void testInterceptPowerKeyDown_intervalOutOfBoundsCameraPowerGestureOnNotInteractive() {
- enableCameraGesture();
+ withCameraDoubleTapPowerEnableConfigValue(true);
+ withCameraDoubleTapPowerDisableSettingValue(0);
+ mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
long eventTime = INITIAL_EVENT_TIME_MILLIS;
KeyEvent keyEvent = new KeyEvent(IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE,
@@ -1697,53 +1409,12 @@ public class GestureLauncherServiceTest {
}
/**
- * If processPowerKeyDown is called instead of interceptPowerKeyDown (meaning the double tap
- * gesture isn't performed), the emergency gesture is still launched.
- */
- @Test
- public void
- testProcessPowerKeyDown_fiveInboundPresses_cameraDoesNotLaunch_emergencyGestureLaunches() {
- enableCameraGesture();
- enableEmergencyGesture();
-
- // First event
- long eventTime = INITIAL_EVENT_TIME_MILLIS;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, false, false);
-
- //Second event; call processPowerKeyDown without calling interceptPowerKeyDown
- final long interval = POWER_DOUBLE_TAP_MAX_TIME_MS - 1;
- eventTime += interval;
- KeyEvent keyEvent =
- new KeyEvent(
- IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT);
- mGestureLauncherService.processPowerKeyDown(keyEvent);
-
- verify(mMetricsLogger, never())
- .action(eq(MetricsEvent.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE), anyInt());
- verify(mUiEventLogger, never()).log(any());
-
- // Presses 3 and 4 should not trigger any gesture
- for (int i = 0; i < 2; i++) {
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, false);
- }
-
- // Fifth button press should still trigger the emergency flow
- eventTime += interval;
- sendPowerKeyDownToGestureLauncherServiceAndAssertValues(eventTime, true, true);
-
- verify(mUiEventLogger, times(1))
- .log(GestureLauncherService.GestureLauncherEvent.GESTURE_EMERGENCY_TAP_POWER);
- verify(mStatusBarManagerInternal).onEmergencyActionLaunchGestureDetected();
- }
-
- /**
* Helper method to trigger emergency gesture by pressing button for 5 times.
*
* @return last event time.
*/
private long triggerEmergencyGesture() {
- return triggerEmergencyGesture(POWER_DOUBLE_TAP_MAX_TIME_MS - 1);
+ return triggerEmergencyGesture(CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS - 1);
}
/**
@@ -1802,27 +1473,6 @@ public class GestureLauncherServiceTest {
.thenReturn(enableConfigValue);
}
- private void withDoubleTapPowerEnabledConfigValue(boolean enable) {
- when(mResources.getBoolean(com.android.internal.R.bool.config_doubleTapPowerGestureEnabled))
- .thenReturn(enable);
- }
-
- private void withDoubleTapPowerGestureEnableSettingValue(boolean enable) {
- Settings.Secure.putIntForUser(
- mContentResolver,
- Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED,
- enable ? 1 : 0,
- UserHandle.USER_CURRENT);
- }
-
- private void withDefaultDoubleTapPowerGestureAction(int action) {
- Settings.Secure.putIntForUser(
- mContentResolver,
- Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE,
- action,
- UserHandle.USER_CURRENT);
- }
-
private void withEmergencyGestureEnabledConfigValue(boolean enableConfigValue) {
when(mResources.getBoolean(
com.android.internal.R.bool.config_emergencyGestureEnabled))
@@ -1860,72 +1510,4 @@ public class GestureLauncherServiceTest {
userSetupCompleteValue,
UserHandle.USER_CURRENT);
}
-
- private void setUpGetGestureTargetActivityPendingIntent(PendingIntent pendingIntent) {
- doAnswer(
- invocation -> {
- QuickAccessWalletClient.GesturePendingIntentCallback callback =
- (QuickAccessWalletClient.GesturePendingIntentCallback)
- invocation.getArguments()[1];
- callback.onGesturePendingIntentRetrieved(pendingIntent);
- return null;
- })
- .when(mQuickAccessWalletClient)
- .getGestureTargetActivityPendingIntent(any(), any());
- }
-
- private void setUpWalletFallbackPendingIntent(PendingIntent pendingIntent) {
- doAnswer(
- invocation -> {
- QuickAccessWalletClient.WalletPendingIntentCallback callback =
- (QuickAccessWalletClient.WalletPendingIntentCallback)
- invocation.getArguments()[1];
- callback.onWalletPendingIntentRetrieved(pendingIntent);
- return null;
- })
- .when(mQuickAccessWalletClient)
- .getWalletPendingIntent(any(), any());
- }
-
- private void enableWalletGesture() {
- withDefaultDoubleTapPowerGestureAction(LAUNCH_WALLET_ON_DOUBLE_TAP_POWER);
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDoubleTapPowerEnabledConfigValue(true);
-
- mGestureLauncherService.updateWalletDoubleTapPowerEnabled();
- withUserSetupCompleteValue(true);
- }
-
- private void enableEmergencyGesture() {
- withEmergencyGestureEnabledConfigValue(true);
- withEmergencyGestureEnabledSettingValue(true);
- mGestureLauncherService.updateEmergencyGestureEnabled();
- withUserSetupCompleteValue(true);
- }
-
- private void enableCameraGesture() {
- if (launchWalletOptionOnPowerDoubleTap()) {
- withDoubleTapPowerEnabledConfigValue(true);
- withDoubleTapPowerGestureEnableSettingValue(true);
- withDefaultDoubleTapPowerGestureAction(LAUNCH_CAMERA_ON_DOUBLE_TAP_POWER);
- } else {
- withCameraDoubleTapPowerEnableConfigValue(true);
- withCameraDoubleTapPowerDisableSettingValue(0);
- }
- mGestureLauncherService.updateCameraDoubleTapPowerEnabled();
- withUserSetupCompleteValue(true);
- }
-
- private void sendPowerKeyDownToGestureLauncherServiceAndAssertValues(
- long eventTime, boolean expectedIntercept, boolean expectedOutLaunchedValue) {
- KeyEvent keyEvent =
- new KeyEvent(
- IGNORED_DOWN_TIME, eventTime, IGNORED_ACTION, IGNORED_CODE, IGNORED_REPEAT);
- boolean interactive = true;
- MutableBoolean outLaunched = new MutableBoolean(true);
- boolean intercepted =
- mGestureLauncherService.interceptPowerKeyDown(keyEvent, interactive, outLaunched);
- assertEquals(intercepted, expectedIntercept);
- assertEquals(outLaunched.value, expectedOutLaunchedValue);
- }
}
diff --git a/services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java b/services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java
index 75258f0aa7e0..d2db999d72ca 100644
--- a/services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java
+++ b/services/tests/servicestests/src/com/android/server/autofill/PresentationEventLoggerTest.java
@@ -15,6 +15,8 @@
*/
package com.android.server.autofill;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED;
import static com.google.common.truth.Truth.assertThat;
@@ -129,4 +131,57 @@ public class PresentationEventLoggerTest {
assertThat(event).isNotNull();
assertThat(event.mDisplayPresentationType).isEqualTo(3);
}
+
+ @Test
+ public void testNoSuggestionsTextFiltered() {
+ PresentationStatsEventLogger pEventLogger =
+ PresentationStatsEventLogger.createPresentationLog(1, 1, 1);
+ AutofillId id = new AutofillId(13);
+ AutofillValue initialValue = AutofillValue.forText("hello");
+ pEventLogger.startNewEvent();
+ pEventLogger.maybeSetFocusedId(id);
+ pEventLogger.maybeSetNoPresentationEventReasonSuggestionsFiltered(initialValue);
+
+ PresentationStatsEventLogger.PresentationStatsEventInternal event =
+ pEventLogger.getInternalEvent().get();
+ assertThat(event).isNotNull();
+ int NO_SUGGESTIONS =
+ AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT;
+ assertThat(event.mNoPresentationReason).isEqualTo(NO_SUGGESTIONS);
+ }
+
+ @Test
+ public void testSuggestionsTextNotFiltered() {
+ PresentationStatsEventLogger pEventLogger =
+ PresentationStatsEventLogger.createPresentationLog(1, 1, 1);
+ AutofillId id = new AutofillId(13);
+ AutofillValue initialValue = null;
+ pEventLogger.startNewEvent();
+ pEventLogger.maybeSetFocusedId(id);
+ pEventLogger.maybeSetNoPresentationEventReasonSuggestionsFiltered(initialValue);
+
+ PresentationStatsEventLogger.PresentationStatsEventInternal event =
+ pEventLogger.getInternalEvent().get();
+ assertThat(event).isNotNull();
+ assertThat(event.mNoPresentationReason).isNotEqualTo(
+ AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT);
+ }
+
+ @Test
+ public void testNotShownReasonNotOverridden() {
+
+ PresentationStatsEventLogger pEventLogger =
+ PresentationStatsEventLogger.createPresentationLog(1, 1, 1);
+
+ pEventLogger.startNewEvent();
+ pEventLogger.maybeSetNoPresentationEventReason(AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED);
+ // Not allowed - no op
+ pEventLogger.maybeSetNoPresentationEventReasonIfNoReasonExists(
+ AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SUGGESTION_FILTER_OUT);
+
+ PresentationStatsEventLogger.PresentationStatsEventInternal event =
+ pEventLogger.getInternalEvent().get();
+ assertThat(event).isNotNull();
+ assertThat(event.mNoPresentationReason).isEqualTo(AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index a0f2395f5203..d70ffd2ec050 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -159,7 +159,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Test for the first launch path, no settings file available.
*/
- public void testFirstInitialize() {
+ public void FirstInitialize() {
assertResetTimes(START_TIME, START_TIME + INTERVAL);
}
@@ -167,7 +167,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
* Test for {@link ShortcutService#getLastResetTimeLocked()} and
* {@link ShortcutService#getNextResetTimeLocked()}.
*/
- public void testUpdateAndGetNextResetTimeLocked() {
+ public void UpdateAndGetNextResetTimeLocked() {
assertResetTimes(START_TIME, START_TIME + INTERVAL);
// Advance clock.
@@ -196,7 +196,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Test for the restoration from saved file.
*/
- public void testInitializeFromSavedFile() {
+ public void InitializeFromSavedFile() {
mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50;
assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
@@ -220,7 +220,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// TODO Add various broken cases.
}
- public void testLoadConfig() {
+ public void LoadConfig() {
mService.updateConfigurationLocked(
ConfigConstants.KEY_RESET_INTERVAL_SEC + "=123,"
+ ConfigConstants.KEY_MAX_SHORTCUTS + "=4,"
@@ -261,22 +261,22 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// === Test for app side APIs ===
/** Test for {@link android.content.pm.ShortcutManager#getMaxShortcutCountForActivity()} */
- public void testGetMaxDynamicShortcutCount() {
+ public void GetMaxDynamicShortcutCount() {
assertEquals(MAX_SHORTCUTS, mManager.getMaxShortcutCountForActivity());
}
/** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */
- public void testGetRemainingCallCount() {
+ public void GetRemainingCallCount() {
assertEquals(MAX_UPDATES_PER_INTERVAL, mManager.getRemainingCallCount());
}
- public void testGetIconMaxDimensions() {
+ public void GetIconMaxDimensions() {
assertEquals(MAX_ICON_DIMENSION, mManager.getIconMaxWidth());
assertEquals(MAX_ICON_DIMENSION, mManager.getIconMaxHeight());
}
/** Test for {@link android.content.pm.ShortcutManager#getRateLimitResetTime()} */
- public void testGetRateLimitResetTime() {
+ public void GetRateLimitResetTime() {
assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50;
@@ -284,7 +284,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertEquals(START_TIME + 5 * INTERVAL, mManager.getRateLimitResetTime());
}
- public void testSetDynamicShortcuts() {
+ public void SetDynamicShortcuts() {
setCaller(CALLING_PACKAGE_1, USER_0);
final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1);
@@ -354,7 +354,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testAddDynamicShortcuts() {
+ public void AddDynamicShortcuts() {
setCaller(CALLING_PACKAGE_1, USER_0);
final ShortcutInfo si1 = makeShortcut("shortcut1");
@@ -402,7 +402,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testPushDynamicShortcut() {
+ public void PushDynamicShortcut() {
// Change the max number of shortcuts.
mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=5,"
+ ShortcutService.ConfigConstants.KEY_SAVE_DELAY_MILLIS + "=1");
@@ -543,7 +543,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
eq(CALLING_PACKAGE_1), eq("s9"), eq(USER_0));
}
- public void testPushDynamicShortcut_CallsToUsageStatsManagerAreThrottled()
+ public void PushDynamicShortcut_CallsToUsageStatsManagerAreThrottled()
throws InterruptedException {
mService.updateConfigurationLocked(
ShortcutService.ConfigConstants.KEY_SAVE_DELAY_MILLIS + "=500");
@@ -594,7 +594,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
eq(CALLING_PACKAGE_2), any(), eq(USER_0));
}
- public void testUnlimitedCalls() {
+ public void UnlimitedCalls() {
setCaller(CALLING_PACKAGE_1, USER_0);
final ShortcutInfo si1 = makeShortcut("shortcut1");
@@ -625,7 +625,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertEquals(3, mManager.getRemainingCallCount());
}
- public void testPublishWithNoActivity() {
+ public void PublishWithNoActivity() {
// If activity is not explicitly set, use the default one.
mRunningUsers.put(USER_10, true);
@@ -731,7 +731,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testPublishWithNoActivity_noMainActivityInPackage() {
+ public void PublishWithNoActivity_noMainActivityInPackage() {
mRunningUsers.put(USER_10, true);
runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
@@ -750,7 +750,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testDeleteDynamicShortcuts() {
+ public void DeleteDynamicShortcuts() {
final ShortcutInfo si1 = makeShortcut("shortcut1");
final ShortcutInfo si2 = makeShortcut("shortcut2");
final ShortcutInfo si3 = makeShortcut("shortcut3");
@@ -791,7 +791,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertEquals(2, mManager.getRemainingCallCount());
}
- public void testDeleteAllDynamicShortcuts() {
+ public void DeleteAllDynamicShortcuts() {
final ShortcutInfo si1 = makeShortcut("shortcut1");
final ShortcutInfo si2 = makeShortcut("shortcut2");
final ShortcutInfo si3 = makeShortcut("shortcut3");
@@ -820,7 +820,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertEquals(1, mManager.getRemainingCallCount());
}
- public void testIcons() throws IOException {
+ public void Icons() throws IOException {
final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
final Icon res512x512 = Icon.createWithResource(getTestContext(), R.drawable.black_512x512);
@@ -1034,7 +1034,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
*/
}
- public void testCleanupDanglingBitmaps() throws Exception {
+ public void CleanupDanglingBitmaps() throws Exception {
assertBitmapDirectories(USER_0, EMPTY_STRINGS);
assertBitmapDirectories(USER_10, EMPTY_STRINGS);
@@ -1203,7 +1203,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
maxSize));
}
- public void testShrinkBitmap() {
+ public void ShrinkBitmap() {
checkShrinkBitmap(32, 32, R.drawable.black_512x512, 32);
checkShrinkBitmap(511, 511, R.drawable.black_512x512, 511);
checkShrinkBitmap(512, 512, R.drawable.black_512x512, 512);
@@ -1226,7 +1226,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
return out.getFile();
}
- public void testOpenIconFileForWrite() throws IOException {
+ public void OpenIconFileForWrite() throws IOException {
mInjectedCurrentTimeMillis = 1000;
final File p10_1_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
@@ -1300,7 +1300,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertFalse(p11_1_3.getName().contains("_"));
}
- public void testUpdateShortcuts() {
+ public void UpdateShortcuts() {
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
makeShortcut("s1"),
@@ -1431,7 +1431,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testUpdateShortcuts_icons() {
+ public void UpdateShortcuts_icons() {
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
makeShortcut("s1")
@@ -1525,7 +1525,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testShortcutManagerGetShortcuts_shortcutTypes() {
+ public void ShortcutManagerGetShortcuts_shortcutTypes() {
// Create 3 manifest and 3 dynamic shortcuts
addManifestShortcutResource(
@@ -1616,7 +1616,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), "s1", "s2");
}
- public void testCachedShortcuts() {
+ public void CachedShortcuts() {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"),
makeLongLivedShortcut("s2"), makeLongLivedShortcut("s3"),
@@ -1700,7 +1700,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
"s2");
}
- public void testCachedShortcuts_accessShortcutsPermission() {
+ public void CachedShortcuts_accessShortcutsPermission() {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"),
makeLongLivedShortcut("s2"), makeLongLivedShortcut("s3"),
@@ -1742,7 +1742,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), "s3");
}
- public void testCachedShortcuts_canPassShortcutLimit() {
+ public void CachedShortcuts_canPassShortcutLimit() {
// Change the max number of shortcuts.
mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=4");
@@ -1780,7 +1780,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// === Test for launcher side APIs ===
- public void testGetShortcuts() {
+ public void GetShortcuts() {
// Set up shortcuts.
@@ -1997,7 +1997,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
"s1", "s3");
}
- public void testGetShortcuts_shortcutKinds() throws Exception {
+ public void GetShortcuts_shortcutKinds() throws Exception {
// Create 3 manifest and 3 dynamic shortcuts
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
@@ -2108,7 +2108,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testGetShortcuts_resolveStrings() throws Exception {
+ public void GetShortcuts_resolveStrings() throws Exception {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
ShortcutInfo si = new ShortcutInfo.Builder(mClientContext)
.setId("id")
@@ -2156,7 +2156,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testGetShortcuts_personsFlag() {
+ public void GetShortcuts_personsFlag() {
ShortcutInfo s = new ShortcutInfo.Builder(mClientContext, "id")
.setShortLabel("label")
.setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
@@ -2204,7 +2204,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
// TODO resource
- public void testGetShortcutInfo() {
+ public void GetShortcutInfo() {
// Create shortcuts.
setCaller(CALLING_PACKAGE_1);
final ShortcutInfo s1_1 = makeShortcut(
@@ -2279,7 +2279,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertEquals("ABC", findById(list, "s1").getTitle());
}
- public void testPinShortcutAndGetPinnedShortcuts() {
+ public void PinShortcutAndGetPinnedShortcuts() {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000);
final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000);
@@ -2360,7 +2360,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
* This is similar to the above test, except it used "disable" instead of "remove". It also
* does "enable".
*/
- public void testDisableAndEnableShortcuts() {
+ public void DisableAndEnableShortcuts() {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000);
final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000);
@@ -2485,7 +2485,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testDisableShortcuts_thenRepublish() {
+ public void DisableShortcuts_thenRepublish() {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
@@ -2555,7 +2555,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testPinShortcutAndGetPinnedShortcuts_multi() {
+ public void PinShortcutAndGetPinnedShortcuts_multi() {
// Create some shortcuts.
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
@@ -2831,7 +2831,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testPinShortcutAndGetPinnedShortcuts_assistant() {
+ public void PinShortcutAndGetPinnedShortcuts_assistant() {
// Create some shortcuts.
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
@@ -2887,7 +2887,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testPinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() {
+ public void PinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() {
// Create some shortcuts.
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
@@ -3476,7 +3476,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testStartShortcut() {
+ public void StartShortcut() {
// Create some shortcuts.
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
final ShortcutInfo s1_1 = makeShortcut(
@@ -3611,7 +3611,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// TODO Check extra, etc
}
- public void testLauncherCallback() throws Throwable {
+ public void LauncherCallback() throws Throwable {
// Disable throttling for this test.
mService.updateConfigurationLocked(
ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "=99999999,"
@@ -3777,7 +3777,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
.isEmpty();
}
- public void testLauncherCallback_crossProfile() throws Throwable {
+ public void LauncherCallback_crossProfile() throws Throwable {
prepareCrossProfileDataSet();
final Handler h = new Handler(Looper.getMainLooper());
@@ -3900,7 +3900,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// === Test for persisting ===
- public void testSaveAndLoadUser_empty() {
+ public void SaveAndLoadUser_empty() {
assertTrue(mManager.setDynamicShortcuts(list()));
Log.i(TAG, "Saved state");
@@ -3917,7 +3917,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Try save and load, also stop/start the user.
*/
- public void testSaveAndLoadUser() {
+ public void SaveAndLoadUser() {
// First, create some shortcuts and save.
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16);
@@ -4058,7 +4058,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// TODO Check all other fields
}
- public void testLoadCorruptedShortcuts() throws Exception {
+ public void LoadCorruptedShortcuts() throws Exception {
initService();
addPackage("com.android.chrome", 0, 0);
@@ -4072,7 +4072,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertNull(ShortcutPackage.loadFromFile(mService, user, corruptedShortcutPackage, false));
}
- public void testSaveCorruptAndLoadUser() throws Exception {
+ public void SaveCorruptAndLoadUser() throws Exception {
// First, create some shortcuts and save.
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16);
@@ -4228,7 +4228,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// TODO Check all other fields
}
- public void testCleanupPackage() {
+ public void CleanupPackage() {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
makeShortcut("s0_1"))));
@@ -4505,7 +4505,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
mService.saveDirtyInfo();
}
- public void testCleanupPackage_republishManifests() {
+ public void CleanupPackage_republishManifests() {
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
R.xml.shortcut_2);
@@ -4573,7 +4573,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testHandleGonePackage_crossProfile() {
+ public void HandleGonePackage_crossProfile() {
// Create some shortcuts.
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
@@ -4845,7 +4845,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertEquals(expected, spi.canRestoreTo(mService, pi, true));
}
- public void testCanRestoreTo() {
+ public void CanRestoreTo() {
addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sig1");
addPackage(CALLING_PACKAGE_2, CALLING_UID_2, 10, "sig1", "sig2");
addPackage(CALLING_PACKAGE_3, CALLING_UID_3, 10, "sig1");
@@ -4908,7 +4908,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
checkCanRestoreTo(DISABLED_REASON_BACKUP_NOT_SUPPORTED, spi3, true, 10, true, "sig1");
}
- public void testHandlePackageDelete() {
+ public void HandlePackageDelete() {
checkHandlePackageDeleteInner((userId, packageName) -> {
uninstallPackage(userId, packageName);
mService.mPackageMonitor.onReceive(getTestContext(),
@@ -4916,7 +4916,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testHandlePackageDisable() {
+ public void HandlePackageDisable() {
checkHandlePackageDeleteInner((userId, packageName) -> {
disablePackage(userId, packageName);
mService.mPackageMonitor.onReceive(getTestContext(),
@@ -5048,7 +5048,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
/** Almost ame as testHandlePackageDelete, except it doesn't uninstall packages. */
- public void testHandlePackageClearData() {
+ public void HandlePackageClearData() {
final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
getTestContext().getResources(), R.drawable.black_32x32));
setCaller(CALLING_PACKAGE_1, USER_0);
@@ -5124,7 +5124,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
}
- public void testHandlePackageClearData_manifestRepublished() {
+ public void HandlePackageClearData_manifestRepublished() {
mRunningUsers.put(USER_10, true);
@@ -5166,7 +5166,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testHandlePackageUpdate() throws Throwable {
+ public void HandlePackageUpdate() throws Throwable {
// Set up shortcuts and launchers.
final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
@@ -5340,7 +5340,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Test the case where an updated app has resource IDs changed.
*/
- public void testHandlePackageUpdate_resIdChanged() throws Exception {
+ public void HandlePackageUpdate_resIdChanged() throws Exception {
final Icon icon1 = Icon.createWithResource(getTestContext(), /* res ID */ 1000);
final Icon icon2 = Icon.createWithResource(getTestContext(), /* res ID */ 1001);
@@ -5415,7 +5415,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testHandlePackageUpdate_systemAppUpdate() {
+ public void HandlePackageUpdate_systemAppUpdate() {
// Package1 is a system app. Package 2 is not a system app, so it's not scanned
// in this test at all.
@@ -5521,7 +5521,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint());
}
- public void testHandlePackageChanged() {
+ public void HandlePackageChanged() {
final ComponentName ACTIVITY1 = new ComponentName(CALLING_PACKAGE_1, "act1");
final ComponentName ACTIVITY2 = new ComponentName(CALLING_PACKAGE_1, "act2");
@@ -5651,7 +5651,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testHandlePackageUpdate_activityNoLongerMain() throws Throwable {
+ public void HandlePackageUpdate_activityNoLongerMain() throws Throwable {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
makeShortcutWithActivity("s1a",
@@ -5737,7 +5737,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
* - Unpinned dynamic shortcuts
* - Bitmaps
*/
- public void testBackupAndRestore() {
+ public void BackupAndRestore() {
assertFileNotExists("user-0/shortcut_dump/restore-0-start.txt");
assertFileNotExists("user-0/shortcut_dump/restore-1-payload.xml");
@@ -5758,7 +5758,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
checkBackupAndRestore_success(/*firstRestore=*/ true);
}
- public void testBackupAndRestore_backupRestoreTwice() {
+ public void BackupAndRestore_backupRestoreTwice() {
prepareForBackupTest();
checkBackupAndRestore_success(/*firstRestore=*/ true);
@@ -5774,7 +5774,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
checkBackupAndRestore_success(/*firstRestore=*/ false);
}
- public void testBackupAndRestore_restoreToNewVersion() {
+ public void BackupAndRestore_restoreToNewVersion() {
prepareForBackupTest();
addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 2);
@@ -5783,7 +5783,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
checkBackupAndRestore_success(/*firstRestore=*/ true);
}
- public void testBackupAndRestore_restoreToSuperSetSignatures() {
+ public void BackupAndRestore_restoreToSuperSetSignatures() {
prepareForBackupTest();
// Change package signatures.
@@ -5980,7 +5980,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testBackupAndRestore_publisherWrongSignature() {
+ public void BackupAndRestore_publisherWrongSignature() {
prepareForBackupTest();
addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sigx"); // different signature
@@ -5988,7 +5988,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
checkBackupAndRestore_publisherNotRestored(ShortcutInfo.DISABLED_REASON_SIGNATURE_MISMATCH);
}
- public void testBackupAndRestore_publisherNoLongerBackupTarget() {
+ public void BackupAndRestore_publisherNoLongerBackupTarget() {
prepareForBackupTest();
updatePackageInfo(CALLING_PACKAGE_1,
@@ -6117,7 +6117,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testBackupAndRestore_launcherLowerVersion() {
+ public void BackupAndRestore_launcherLowerVersion() {
prepareForBackupTest();
addPackage(LAUNCHER_1, LAUNCHER_UID_1, 0); // Lower version
@@ -6126,7 +6126,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
checkBackupAndRestore_success(/*firstRestore=*/ true);
}
- public void testBackupAndRestore_launcherWrongSignature() {
+ public void BackupAndRestore_launcherWrongSignature() {
prepareForBackupTest();
addPackage(LAUNCHER_1, LAUNCHER_UID_1, 10, "sigx"); // different signature
@@ -6134,7 +6134,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
checkBackupAndRestore_launcherNotRestored(true);
}
- public void testBackupAndRestore_launcherNoLongerBackupTarget() {
+ public void BackupAndRestore_launcherNoLongerBackupTarget() {
prepareForBackupTest();
updatePackageInfo(LAUNCHER_1,
@@ -6239,7 +6239,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testBackupAndRestore_launcherAndPackageNoLongerBackupTarget() {
+ public void BackupAndRestore_launcherAndPackageNoLongerBackupTarget() {
prepareForBackupTest();
updatePackageInfo(CALLING_PACKAGE_1,
@@ -6337,7 +6337,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testBackupAndRestore_disabled() {
+ public void BackupAndRestore_disabled() {
prepareCrossProfileDataSet();
// Before doing backup & restore, disable s1.
@@ -6402,7 +6402,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
- public void testBackupAndRestore_manifestRePublished() {
+ public void BackupAndRestore_manifestRePublished() {
// Publish two manifest shortcuts.
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
@@ -6493,7 +6493,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
* logcat.
* - if it has allowBackup=false, we don't touch any of the existing shortcuts.
*/
- public void testBackupAndRestore_appAlreadyInstalledWhenRestored() {
+ public void BackupAndRestore_appAlreadyInstalledWhenRestored() {
// Pre-backup. Same as testBackupAndRestore_manifestRePublished().
// Publish two manifest shortcuts.
@@ -6618,7 +6618,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Test for restoring the pre-P backup format.
*/
- public void testBackupAndRestore_api27format() throws Exception {
+ public void BackupAndRestore_api27format() throws Exception {
final byte[] payload = readTestAsset("shortcut/shortcut_api27_backup.xml").getBytes();
addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "22222");
@@ -6656,7 +6656,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
- public void testSaveAndLoad_crossProfile() {
+ public void SaveAndLoad_crossProfile() {
prepareCrossProfileDataSet();
dumpsysOnLogcat("Before save & load");
@@ -6859,7 +6859,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
.getPackageUserId());
}
- public void testOnApplicationActive_permission() {
+ public void OnApplicationActive_permission() {
assertExpectException(SecurityException.class, "Missing permission", () ->
mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0));
@@ -6868,7 +6868,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0);
}
- public void testGetShareTargets_permission() {
+ public void GetShareTargets_permission() {
addPackage(CHOOSER_ACTIVITY_PACKAGE, CHOOSER_ACTIVITY_UID, 10, "sig1");
mInjectedChooserActivity =
ComponentName.createRelative(CHOOSER_ACTIVITY_PACKAGE, ".ChooserActivity");
@@ -6887,7 +6887,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testHasShareTargets_permission() {
+ public void HasShareTargets_permission() {
assertExpectException(SecurityException.class, "Missing permission", () ->
mManager.hasShareTargets(CALLING_PACKAGE_1));
@@ -6896,7 +6896,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
mManager.hasShareTargets(CALLING_PACKAGE_1);
}
- public void testisSharingShortcut_permission() throws IntentFilter.MalformedMimeTypeException {
+ public void isSharingShortcut_permission() throws IntentFilter.MalformedMimeTypeException {
setCaller(LAUNCHER_1, USER_0);
IntentFilter filter_any = new IntentFilter();
@@ -6911,18 +6911,18 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
mManager.hasShareTargets(CALLING_PACKAGE_1);
}
- public void testDumpsys_crossProfile() {
+ public void Dumpsys_crossProfile() {
prepareCrossProfileDataSet();
dumpsysOnLogcat("test1", /* force= */ true);
}
- public void testDumpsys_withIcons() throws IOException {
- testIcons();
+ public void Dumpsys_withIcons() throws IOException {
+ Icons();
// Dump after having some icons.
dumpsysOnLogcat("test1", /* force= */ true);
}
- public void testManifestShortcut_publishOnUnlockUser() {
+ public void ManifestShortcut_publishOnUnlockUser() {
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
R.xml.shortcut_1);
@@ -7136,7 +7136,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertNull(mService.getPackageShortcutForTest(LAUNCHER_1, USER_0));
}
- public void testManifestShortcut_publishOnBroadcast() {
+ public void ManifestShortcut_publishOnBroadcast() {
// First, no packages are installed.
uninstallPackage(USER_0, CALLING_PACKAGE_1);
uninstallPackage(USER_0, CALLING_PACKAGE_2);
@@ -7392,7 +7392,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testManifestShortcuts_missingMandatoryFields() {
+ public void ManifestShortcuts_missingMandatoryFields() {
// Start with no apps installed.
uninstallPackage(USER_0, CALLING_PACKAGE_1);
uninstallPackage(USER_0, CALLING_PACKAGE_2);
@@ -7461,7 +7461,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testManifestShortcuts_intentDefinitions() {
+ public void ManifestShortcuts_intentDefinitions() {
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
R.xml.shortcut_error_4);
@@ -7603,7 +7603,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testManifestShortcuts_checkAllFields() {
+ public void ManifestShortcuts_checkAllFields() {
mService.handleUnlockUser(USER_0);
// Package 1 updated, which has one valid manifest shortcut and one invalid.
@@ -7708,7 +7708,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testManifestShortcuts_localeChange() throws InterruptedException {
+ public void ManifestShortcuts_localeChange() throws InterruptedException {
mService.handleUnlockUser(USER_0);
// Package 1 updated, which has one valid manifest shortcut and one invalid.
@@ -7812,7 +7812,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testManifestShortcuts_updateAndDisabled_notPinned() {
+ public void ManifestShortcuts_updateAndDisabled_notPinned() {
mService.handleUnlockUser(USER_0);
// First, just publish a manifest shortcut.
@@ -7852,7 +7852,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testManifestShortcuts_updateAndDisabled_pinned() {
+ public void ManifestShortcuts_updateAndDisabled_pinned() {
mService.handleUnlockUser(USER_0);
// First, just publish a manifest shortcut.
@@ -7908,7 +7908,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testManifestShortcuts_duplicateInSingleActivity() {
+ public void ManifestShortcuts_duplicateInSingleActivity() {
mService.handleUnlockUser(USER_0);
// The XML has two shortcuts with the same ID.
@@ -7933,7 +7933,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testManifestShortcuts_duplicateInTwoActivities() {
+ public void ManifestShortcuts_duplicateInTwoActivities() {
mService.handleUnlockUser(USER_0);
// ShortcutActivity has shortcut ms1
@@ -7985,7 +7985,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Manifest shortcuts cannot override shortcuts that were published via the APIs.
*/
- public void testManifestShortcuts_cannotOverrideNonManifest() {
+ public void ManifestShortcuts_cannotOverrideNonManifest() {
mService.handleUnlockUser(USER_0);
// Create a non-pinned dynamic shortcut and a non-dynamic pinned shortcut.
@@ -8058,7 +8058,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Make sure the APIs won't work on manifest shortcuts.
*/
- public void testManifestShortcuts_immutable() {
+ public void ManifestShortcuts_immutable() {
mService.handleUnlockUser(USER_0);
// Create a non-pinned manifest shortcut, a pinned shortcut that was originally
@@ -8151,7 +8151,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Make sure the APIs won't work on manifest shortcuts.
*/
- public void testManifestShortcuts_tooMany() {
+ public void ManifestShortcuts_tooMany() {
// Change the max number of shortcuts.
mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
@@ -8170,7 +8170,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testMaxShortcutCount_set() {
+ public void MaxShortcutCount_set() {
// Change the max number of shortcuts.
mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
@@ -8251,7 +8251,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testMaxShortcutCount_add() {
+ public void MaxShortcutCount_add() {
// Change the max number of shortcuts.
mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
@@ -8378,7 +8378,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testMaxShortcutCount_update() {
+ public void MaxShortcutCount_update() {
// Change the max number of shortcuts.
mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
@@ -8469,7 +8469,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testShortcutsPushedOutByManifest() {
+ public void ShortcutsPushedOutByManifest() {
// Change the max number of shortcuts.
mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
@@ -8577,7 +8577,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testReturnedByServer() {
+ public void ReturnedByServer() {
// Package 1 updated, with manifest shortcuts.
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
@@ -8623,7 +8623,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testIsForegroundDefaultLauncher_true() {
+ public void IsForegroundDefaultLauncher_true() {
final int uid = 1024;
setDefaultLauncher(UserHandle.USER_SYSTEM, "default");
@@ -8633,7 +8633,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
- public void testIsForegroundDefaultLauncher_defaultButNotForeground() {
+ public void IsForegroundDefaultLauncher_defaultButNotForeground() {
final int uid = 1024;
setDefaultLauncher(UserHandle.USER_SYSTEM, "default");
@@ -8642,7 +8642,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertFalse(mInternal.isForegroundDefaultLauncher("default", uid));
}
- public void testIsForegroundDefaultLauncher_foregroundButNotDefault() {
+ public void IsForegroundDefaultLauncher_foregroundButNotDefault() {
final int uid = 1024;
setDefaultLauncher(UserHandle.USER_SYSTEM, "default");
@@ -8651,7 +8651,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
assertFalse(mInternal.isForegroundDefaultLauncher("another", uid));
}
- public void testParseShareTargetsFromManifest() {
+ public void ParseShareTargetsFromManifest() {
// These values must exactly match the content of shortcuts_share_targets.xml resource
List<ShareTargetInfo> expectedValues = new ArrayList<>();
expectedValues.add(new ShareTargetInfo(
@@ -8703,7 +8703,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
}
- public void testShareTargetInfo_saveToXml() throws IOException, XmlPullParserException {
+ public void ShareTargetInfo_saveToXml() throws IOException, XmlPullParserException {
List<ShareTargetInfo> expectedValues = new ArrayList<>();
expectedValues.add(new ShareTargetInfo(
new ShareTargetInfo.TargetData[]{new ShareTargetInfo.TargetData(
@@ -8769,7 +8769,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
}
- public void testIsSharingShortcut() throws IntentFilter.MalformedMimeTypeException {
+ public void IsSharingShortcut() throws IntentFilter.MalformedMimeTypeException {
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
R.xml.shortcut_share_targets);
@@ -8819,7 +8819,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
filter_any));
}
- public void testIsSharingShortcut_PinnedAndCachedOnlyShortcuts()
+ public void IsSharingShortcut_PinnedAndCachedOnlyShortcuts()
throws IntentFilter.MalformedMimeTypeException {
addManifestShortcutResource(
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
@@ -8876,7 +8876,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
filter_any));
}
- public void testAddingShortcuts_ExcludesHiddenFromLauncherShortcuts() {
+ public void AddingShortcuts_ExcludesHiddenFromLauncherShortcuts() {
final ShortcutInfo s1 = makeShortcutExcludedFromLauncher("s1");
final ShortcutInfo s2 = makeShortcutExcludedFromLauncher("s2");
final ShortcutInfo s3 = makeShortcutExcludedFromLauncher("s3");
@@ -8897,7 +8897,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testUpdateShortcuts_ExcludesHiddenFromLauncherShortcuts() {
+ public void UpdateShortcuts_ExcludesHiddenFromLauncherShortcuts() {
final ShortcutInfo s1 = makeShortcut("s1");
final ShortcutInfo s2 = makeShortcut("s2");
final ShortcutInfo s3 = makeShortcut("s3");
@@ -8910,7 +8910,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testPinHiddenShortcuts_ThrowsException() {
+ public void PinHiddenShortcuts_ThrowsException() {
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertThrown(IllegalArgumentException.class, () -> {
mManager.requestPinShortcut(makeShortcutExcludedFromLauncher("s1"), null);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
index 65ed7b6e622d..934c33b7f1f1 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
@@ -19,6 +19,8 @@ import static com.google.common.truth.Truth.assertThat;
import static java.util.concurrent.TimeUnit.HOURS;
+import android.service.notification.RateEstimator;
+
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
diff --git a/services/tests/wmtests/res/xml/bookmarks.xml b/services/tests/wmtests/res/xml/bookmarks.xml
index 3fc7c7692abc..cbbbc731753d 100644
--- a/services/tests/wmtests/res/xml/bookmarks.xml
+++ b/services/tests/wmtests/res/xml/bookmarks.xml
@@ -48,7 +48,7 @@
<bookmark
category="android.intent.category.APP_CONTACTS"
- androidprv:keycode="KEYCODE_C"
+ androidprv:keycode="KEYCODE_P"
androidprv:modifierState="META|SHIFT" />
<bookmark
diff --git a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
index 1cc4db91b1d3..05a1482b9be6 100644
--- a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
@@ -18,22 +18,15 @@ package com.android.server.policy;
import static android.view.KeyEvent.KEYCODE_POWER;
import static android.view.KeyEvent.KEYCODE_VOLUME_UP;
-import static com.android.hardware.input.Flags.FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW;
import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_ASSISTANT;
import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_GLOBAL_ACTIONS;
-import static com.android.server.policy.PhoneWindowManager.POWER_MULTI_PRESS_TIMEOUT_MILLIS;
import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_DREAM_OR_SLEEP;
import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_GO_TO_SLEEP;
-import static org.junit.Assert.assertEquals;
-
-import android.platform.test.annotations.EnableFlags;
-import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.Display;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
/**
@@ -46,12 +39,8 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
@Before
public void setUp() {
setUpPhoneWindowManager();
- mPhoneWindowManager.overrideStatusBarManagerInternal();
}
- @Rule
- public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
-
/**
* Power single press to turn screen on/off.
*/
@@ -61,8 +50,6 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
sendKey(KEYCODE_POWER);
mPhoneWindowManager.assertPowerSleep();
- mPhoneWindowManager.moveTimeForward(POWER_MULTI_PRESS_TIMEOUT_MILLIS);
-
// turn screen on when begin from non-interactive.
mPhoneWindowManager.overrideDisplayState(Display.STATE_OFF);
sendKey(KEYCODE_POWER);
@@ -103,7 +90,7 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
mPhoneWindowManager.overrideCanStartDreaming(false);
sendKey(KEYCODE_POWER);
sendKey(KEYCODE_POWER);
- mPhoneWindowManager.assertDoublePowerLaunch();
+ mPhoneWindowManager.assertCameraLaunch();
mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished();
}
@@ -114,7 +101,7 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
public void testPowerDoublePress() {
sendKey(KEYCODE_POWER);
sendKey(KEYCODE_POWER);
- mPhoneWindowManager.assertDoublePowerLaunch();
+ mPhoneWindowManager.assertCameraLaunch();
}
/**
@@ -124,14 +111,12 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
public void testPowerLongPress() {
// Show assistant.
mPhoneWindowManager.overrideLongPressOnPower(LONG_PRESS_POWER_ASSISTANT);
- sendKey(KEYCODE_POWER, SingleKeyGestureDetector.sDefaultLongPressTimeout);
+ sendKey(KEYCODE_POWER, true);
mPhoneWindowManager.assertSearchManagerLaunchAssist();
- mPhoneWindowManager.moveTimeForward(POWER_MULTI_PRESS_TIMEOUT_MILLIS);
-
// Show global actions.
mPhoneWindowManager.overrideLongPressOnPower(LONG_PRESS_POWER_GLOBAL_ACTIONS);
- sendKey(KEYCODE_POWER, SingleKeyGestureDetector.sDefaultLongPressTimeout);
+ sendKey(KEYCODE_POWER, true);
mPhoneWindowManager.assertShowGlobalActionsCalled();
}
@@ -156,139 +141,4 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
sendKey(KEYCODE_POWER);
mPhoneWindowManager.assertNoPowerSleep();
}
-
- /**
- * Double press of power when the window handles the power key events. The
- * system double power gesture launch should not be performed.
- */
- @Test
- @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW)
- public void testPowerDoublePress_windowHasOverridePermissionAndKeysHandled() {
- mPhoneWindowManager.overrideCanWindowOverridePowerKey(true);
- setDispatchedKeyHandler(keyEvent -> true);
-
- sendKey(KEYCODE_POWER);
- sendKey(KEYCODE_POWER);
-
- mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished();
-
- mPhoneWindowManager.assertNoDoublePowerLaunch();
- }
-
- /**
- * Double press of power when the window doesn't handle the power key events.
- * The system default gesture launch should be performed and the app should receive both events.
- */
- @Test
- @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW)
- public void testPowerDoublePress_windowHasOverridePermissionAndKeysUnHandled() {
- mPhoneWindowManager.overrideCanWindowOverridePowerKey(true);
- setDispatchedKeyHandler(keyEvent -> false);
-
- sendKey(KEYCODE_POWER);
- sendKey(KEYCODE_POWER);
-
- mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished();
- mPhoneWindowManager.assertDoublePowerLaunch();
- assertEquals(getDownKeysDispatched(), 2);
- assertEquals(getUpKeysDispatched(), 2);
- }
-
- /**
- * Triple press of power when the window handles the power key double press gesture.
- * The system default gesture launch should not be performed, and the app only receives the
- * first two presses.
- */
- @Test
- @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW)
- public void testPowerTriplePress_windowHasOverridePermissionAndKeysHandled() {
- mPhoneWindowManager.overrideCanWindowOverridePowerKey(true);
- setDispatchedKeyHandler(keyEvent -> true);
-
- sendKey(KEYCODE_POWER);
- sendKey(KEYCODE_POWER);
- sendKey(KEYCODE_POWER);
-
- mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished();
- mPhoneWindowManager.assertNoDoublePowerLaunch();
- assertEquals(getDownKeysDispatched(), 2);
- assertEquals(getUpKeysDispatched(), 2);
- }
-
- /**
- * Tests a single press, followed by a double press when the window can handle the power key.
- * The app should receive all 3 events.
- */
- @Test
- @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW)
- public void testPowerTriplePressWithDelay_windowHasOverridePermissionAndKeysHandled() {
- mPhoneWindowManager.overrideCanWindowOverridePowerKey(true);
- setDispatchedKeyHandler(keyEvent -> true);
-
- sendKey(KEYCODE_POWER);
- mPhoneWindowManager.moveTimeForward(POWER_MULTI_PRESS_TIMEOUT_MILLIS);
- sendKey(KEYCODE_POWER);
- sendKey(KEYCODE_POWER);
-
- mPhoneWindowManager.assertNoDoublePowerLaunch();
- assertEquals(getDownKeysDispatched(), 3);
- assertEquals(getUpKeysDispatched(), 3);
- }
-
- /**
- * Tests single press when window doesn't handle the power key. Phone should go to sleep.
- */
- @Test
- @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW)
- public void testPowerSinglePress_windowHasOverridePermissionAndKeyUnhandledByApp() {
- mPhoneWindowManager.overrideCanWindowOverridePowerKey(true);
- setDispatchedKeyHandler(keyEvent -> false);
- mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_GO_TO_SLEEP);
-
- sendKey(KEYCODE_POWER);
-
- mPhoneWindowManager.assertPowerSleep();
- }
-
- /**
- * Tests single press when the window handles the power key. Phone should go to sleep after a
- * delay of {POWER_MULTI_PRESS_TIMEOUT_MILLIS}
- */
- @Test
- @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW)
- public void testPowerSinglePress_windowHasOverridePermissionAndKeyHandledByApp() {
- mPhoneWindowManager.overrideCanWindowOverridePowerKey(true);
- setDispatchedKeyHandler(keyEvent -> true);
- mPhoneWindowManager.overrideDisplayState(Display.STATE_ON);
- mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_GO_TO_SLEEP);
-
- sendKey(KEYCODE_POWER);
-
- mPhoneWindowManager.moveTimeForward(POWER_MULTI_PRESS_TIMEOUT_MILLIS);
-
- mPhoneWindowManager.assertPowerSleep();
- }
-
-
- /**
- * Tests 5x press when the window handles the power key. Emergency gesture should still be
- * launched.
- */
- @Test
- @EnableFlags(FLAG_OVERRIDE_POWER_KEY_BEHAVIOR_IN_FOCUSED_WINDOW)
- public void testPowerFiveTimesPress_windowHasOverridePermissionAndKeyHandledByApp() {
- mPhoneWindowManager.overrideCanWindowOverridePowerKey(true);
- setDispatchedKeyHandler(keyEvent -> true);
- mPhoneWindowManager.overrideDisplayState(Display.STATE_ON);
- mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_GO_TO_SLEEP);
-
- for (int i = 0; i < 5; ++i) {
- sendKey(KEYCODE_POWER);
- mPhoneWindowManager.moveTimeForward(100);
- }
-
- mPhoneWindowManager.assertEmergencyLaunch();
- assertEquals(getDownKeysDispatched(), 2);
- assertEquals(getUpKeysDispatched(), 2);
- }
}
diff --git a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java
index 2329a0728baf..9e47a008592c 100644
--- a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java
+++ b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java
@@ -85,11 +85,7 @@ class ShortcutKeyTestBase {
private Resources mResources;
private PackageManager mPackageManager;
TestPhoneWindowManager mPhoneWindowManager;
-
- DispatchedKeyHandler mDispatchedKeyHandler;
- private int mDownKeysDispatched;
- private int mUpKeysDispatched;
-
+ DispatchedKeyHandler mDispatchedKeyHandler = event -> false;
Context mContext;
/** Modifier key to meta state */
@@ -120,9 +116,6 @@ class ShortcutKeyTestBase {
XmlResourceParser testBookmarks = mResources.getXml(
com.android.frameworks.wmtests.R.xml.bookmarks);
doReturn(testBookmarks).when(mResources).getXml(com.android.internal.R.xml.bookmarks);
- mDispatchedKeyHandler = event -> false;
- mDownKeysDispatched = 0;
- mUpKeysDispatched = 0;
try {
// Keep packageName / className in sync with
@@ -236,10 +229,6 @@ class ShortcutKeyTestBase {
sendKeyCombination(new int[]{keyCode}, 0 /*durationMillis*/, longPress, DEFAULT_DISPLAY);
}
- void sendKey(int keyCode, long durationMillis) {
- sendKeyCombination(new int[]{keyCode}, durationMillis, false, DEFAULT_DISPLAY);
- }
-
boolean sendKeyGestureEventStart(int gestureType) {
return mPhoneWindowManager.sendKeyGestureEvent(
new KeyGestureEvent.Builder().setKeyGestureType(gestureType).setAction(
@@ -289,14 +278,6 @@ class ShortcutKeyTestBase {
doReturn(expectedBehavior).when(mResources).getInteger(eq(resId));
}
- int getDownKeysDispatched() {
- return mDownKeysDispatched;
- }
-
- int getUpKeysDispatched() {
- return mUpKeysDispatched;
- }
-
private void interceptKey(KeyEvent keyEvent) {
int actions = mPhoneWindowManager.interceptKeyBeforeQueueing(keyEvent);
if ((actions & ACTION_PASS_TO_USER) != 0) {
@@ -304,11 +285,6 @@ class ShortcutKeyTestBase {
if (!mDispatchedKeyHandler.onKeyDispatched(keyEvent)) {
mPhoneWindowManager.interceptUnhandledKey(keyEvent);
}
- if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
- ++mDownKeysDispatched;
- } else {
- ++mUpKeysDispatched;
- }
}
}
mPhoneWindowManager.dispatchAllPendingEvents();
diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
index f06b45e94f77..9db76d47fed7 100644
--- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
+++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
@@ -22,7 +22,6 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.STATE_ON;
import static android.view.WindowManagerPolicyConstants.FLAG_INTERACTIVE;
-import static com.android.hardware.input.Flags.overridePowerKeyBehaviorInFocusedWindow;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyLong;
@@ -46,14 +45,10 @@ import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_SHUT
import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM;
import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAVIOR_MUTE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.CALLS_REAL_METHODS;
import static org.mockito.Mockito.after;
-import static org.mockito.Mockito.atLeast;
-import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.description;
import static org.mockito.Mockito.mockingDetails;
import static org.mockito.Mockito.timeout;
@@ -90,9 +85,7 @@ import android.os.VibratorInfo;
import android.os.test.TestLooper;
import android.provider.Settings;
import android.service.dreams.DreamManagerInternal;
-import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.telecom.TelecomManager;
-import android.util.MutableBoolean;
import android.view.Display;
import android.view.InputEvent;
import android.view.KeyCharacterMap;
@@ -102,12 +95,9 @@ import android.view.autofill.AutofillManagerInternal;
import com.android.dx.mockito.inline.extended.StaticMockitoSession;
import com.android.internal.accessibility.AccessibilityShortcutController;
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.UiEventLogger;
import com.android.internal.policy.KeyInterceptionInfo;
import com.android.server.GestureLauncherService;
import com.android.server.LocalServices;
-import com.android.server.SystemService;
import com.android.server.input.InputManagerInternal;
import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.pm.UserManagerInternal;
@@ -130,7 +120,6 @@ import org.mockito.MockSettings;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.quality.Strictness;
-import org.mockito.stubbing.Answer;
import java.util.List;
import java.util.function.Supplier;
@@ -143,8 +132,6 @@ class TestPhoneWindowManager {
private PhoneWindowManager mPhoneWindowManager;
private Context mContext;
- private GestureLauncherService mGestureLauncherService;
-
@Mock private WindowManagerInternal mWindowManagerInternal;
@Mock private ActivityManagerInternal mActivityManagerInternal;
@@ -176,9 +163,7 @@ class TestPhoneWindowManager {
@Mock private DisplayRotation mDisplayRotation;
@Mock private DisplayPolicy mDisplayPolicy;
@Mock private WindowManagerPolicy.ScreenOnListener mScreenOnListener;
- @Mock private QuickAccessWalletClient mQuickAccessWalletClient;
- @Mock private MetricsLogger mMetricsLogger;
- @Mock private UiEventLogger mUiEventLogger;
+ @Mock private GestureLauncherService mGestureLauncherService;
@Mock private GlobalActions mGlobalActions;
@Mock private AccessibilityShortcutController mAccessibilityShortcutController;
@@ -207,8 +192,6 @@ class TestPhoneWindowManager {
private int mKeyEventPolicyFlags = FLAG_INTERACTIVE;
- private int mProcessPowerKeyDownCount = 0;
-
private class TestTalkbackShortcutController extends TalkbackShortcutController {
TestTalkbackShortcutController(Context context) {
super(context);
@@ -277,8 +260,6 @@ class TestPhoneWindowManager {
MockitoAnnotations.initMocks(this);
mHandler = new Handler(mTestLooper.getLooper());
mContext = mockingDetails(context).isSpy() ? context : spy(context);
- mGestureLauncherService = spy(new GestureLauncherService(mContext, mMetricsLogger,
- mQuickAccessWalletClient, mUiEventLogger));
setUp(supportSettingsUpdate);
mTestLooper.dispatchAll();
}
@@ -291,7 +272,6 @@ class TestPhoneWindowManager {
mMockitoSession = mockitoSession()
.mockStatic(LocalServices.class, spyStubOnly)
.mockStatic(KeyCharacterMap.class)
- .mockStatic(GestureLauncherService.class)
.strictness(Strictness.LENIENT)
.startMocking();
@@ -314,16 +294,6 @@ class TestPhoneWindowManager {
() -> LocalServices.getService(eq(PowerManagerInternal.class)));
doReturn(mDisplayManagerInternal).when(
() -> LocalServices.getService(eq(DisplayManagerInternal.class)));
- doReturn(true).when(
- () -> GestureLauncherService.isCameraDoubleTapPowerSettingEnabled(any(), anyInt())
- );
- doReturn(true).when(
- () -> GestureLauncherService.isEmergencyGestureSettingEnabled(any(), anyInt())
- );
- doReturn(true).when(
- () -> GestureLauncherService.isGestureLauncherEnabled(any())
- );
- mGestureLauncherService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
doReturn(mGestureLauncherService).when(
() -> LocalServices.getService(eq(GestureLauncherService.class)));
doReturn(mUserManagerInternal).when(
@@ -405,8 +375,7 @@ class TestPhoneWindowManager {
doNothing().when(mContext).startActivityAsUser(any(), any());
doNothing().when(mContext).startActivityAsUser(any(), any(), any());
- KeyInterceptionInfo interceptionInfo = new KeyInterceptionInfo(0, 0, null, 0,
- /* inputFeatureFlags = */ 0);
+ KeyInterceptionInfo interceptionInfo = new KeyInterceptionInfo(0, 0, null, 0);
doReturn(interceptionInfo)
.when(mWindowManagerInternal).getKeyInterceptionInfoFromToken(any());
@@ -424,8 +393,6 @@ class TestPhoneWindowManager {
eq(TEST_BROWSER_ROLE_PACKAGE_NAME));
doReturn(mSmsIntent).when(mPackageManager).getLaunchIntentForPackage(
eq(TEST_SMS_ROLE_PACKAGE_NAME));
- mProcessPowerKeyDownCount = 0;
- captureProcessPowerKeyDownCount();
Mockito.reset(mContext);
}
@@ -671,12 +638,6 @@ class TestPhoneWindowManager {
.when(mButtonOverridePermissionChecker).canAppOverrideSystemKey(any(), anyInt());
}
- void overrideCanWindowOverridePowerKey(boolean granted) {
- doReturn(granted)
- .when(mButtonOverridePermissionChecker).canWindowOverridePowerKey(any(), anyInt(),
- anyInt());
- }
-
void overrideKeyEventPolicyFlags(int flags) {
mKeyEventPolicyFlags = flags;
}
@@ -752,59 +713,13 @@ class TestPhoneWindowManager {
verify(mPowerManager, never()).goToSleep(anyLong(), anyInt(), anyInt());
}
- void assertDoublePowerLaunch() {
- ArgumentCaptor<MutableBoolean> valueCaptor = ArgumentCaptor.forClass(MutableBoolean.class);
-
+ void assertCameraLaunch() {
mTestLooper.dispatchAll();
- verify(mGestureLauncherService, atLeast(2))
- .interceptPowerKeyDown(any(), anyBoolean(), valueCaptor.capture());
- verify(mGestureLauncherService, atMost(4))
- .interceptPowerKeyDown(any(), anyBoolean(), valueCaptor.capture());
-
- if (overridePowerKeyBehaviorInFocusedWindow()) {
- assertTrue(mProcessPowerKeyDownCount >= 2 && mProcessPowerKeyDownCount <= 4);
- }
-
- List<Boolean> capturedValues = valueCaptor.getAllValues().stream()
- .map(mutableBoolean -> mutableBoolean.value)
- .toList();
-
- assertTrue(capturedValues.contains(true));
+ // GestureLauncherService should receive interceptPowerKeyDown twice.
+ verify(mGestureLauncherService, times(2))
+ .interceptPowerKeyDown(any(), anyBoolean(), any());
}
- void assertNoDoublePowerLaunch() {
- ArgumentCaptor<MutableBoolean> valueCaptor = ArgumentCaptor.forClass(MutableBoolean.class);
-
- mTestLooper.dispatchAll();
- verify(mGestureLauncherService, atLeast(0))
- .interceptPowerKeyDown(any(), anyBoolean(), valueCaptor.capture());
-
- List<Boolean> capturedValues = valueCaptor.getAllValues().stream()
- .map(mutableBoolean -> mutableBoolean.value)
- .toList();
-
- assertTrue(capturedValues.stream().noneMatch(value -> value));
- }
-
- void assertEmergencyLaunch() {
- ArgumentCaptor<MutableBoolean> valueCaptor = ArgumentCaptor.forClass(MutableBoolean.class);
-
- mTestLooper.dispatchAll();
- verify(mGestureLauncherService, atLeast(1))
- .interceptPowerKeyDown(any(), anyBoolean(), valueCaptor.capture());
-
- if (overridePowerKeyBehaviorInFocusedWindow()) {
- assertEquals(mProcessPowerKeyDownCount, 5);
- }
-
- List<Boolean> capturedValues = valueCaptor.getAllValues().stream()
- .map(mutableBoolean -> mutableBoolean.value)
- .toList();
-
- assertTrue(capturedValues.getLast());
- }
-
-
void assertSearchManagerLaunchAssist() {
mTestLooper.dispatchAll();
verify(mSearchManager).launchAssist(any());
@@ -1014,12 +929,4 @@ class TestPhoneWindowManager {
verify(mInputManagerInternal)
.handleKeyGestureInKeyGestureController(anyInt(), any(), anyInt(), eq(gestureType));
}
-
- private void captureProcessPowerKeyDownCount() {
- doAnswer((Answer<Void>) invocation -> {
- invocation.callRealMethod();
- mProcessPowerKeyDownCount++;
- return null;
- }).when(mGestureLauncherService).processPowerKeyDown(any());
- }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index d4a921c5f00a..1b0d9dc3b170 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -554,6 +554,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void testSetRequestedOrientationUpdatesConfiguration() throws Exception {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final ActivityRecord activity = new ActivityBuilder(mAtm)
.setCreateTask(true)
.setConfigChanges(ORIENTATION_CONFIG_CHANGES)
@@ -641,6 +642,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void ignoreRequestedOrientationForResizableInSplitWindows() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final ActivityRecord activity = createActivityWith2LevelTask();
final Task task = activity.getTask();
final Task rootTask = activity.getRootTask();
@@ -685,6 +687,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void respectRequestedOrientationForNonResizableInSplitWindows() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea();
spyOn(tda);
doReturn(true).when(tda).supportsNonResizableMultiWindow();
@@ -1906,6 +1909,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void testActivityOnCancelFixedRotationTransform() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final ActivityRecord activity = createActivityWithTask();
final DisplayRotation displayRotation = activity.mDisplayContent.getDisplayRotation();
final RemoteDisplayChangeController remoteDisplayChangeController = activity
@@ -2054,6 +2058,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void testFixedRotationSnapshotStartingWindow() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final ActivityRecord activity = createActivityWithTask();
// TaskSnapshotSurface requires a fullscreen opaque window.
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
@@ -2278,6 +2283,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void testSupportsFreeform() {
final ActivityRecord activity = new ActivityBuilder(mAtm)
+ .setComponent(getUniqueComponentName(mContext.getPackageName()))
.setCreateTask(true)
.setResizeMode(ActivityInfo.RESIZE_MODE_UNRESIZEABLE)
.setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)
@@ -2410,6 +2416,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void testOrientationForScreenOrientationBehind() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final Task task = createTask(mDisplayContent);
// Activity below
new ActivityBuilder(mAtm)
@@ -2507,6 +2514,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@SetupWindows(addWindows = W_ACTIVITY)
@Test
public void testLandscapeSeascapeRotationByApp() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final Task task = new TaskBuilder(mSupervisor)
.setDisplay(mDisplayContent).setCreateActivity(true).build();
final ActivityRecord activity = task.getTopNonFinishingActivity();
@@ -2572,6 +2580,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
@Presubmit
public void testGetOrientation() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
// ActivityBuilder will resume top activities and cause the activity been added into
// opening apps list. Since this test is focus on the effect of visible on getting
// orientation, we skip app transition to avoid interference.
@@ -2663,8 +2672,8 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void testSetOrientation_restrictedByTargetSdk() {
mSetFlagsRule.enableFlags(Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT);
- mDisplayContent.setIgnoreOrientationRequest(true);
makeDisplayLargeScreen(mDisplayContent);
+ assertTrue(mDisplayContent.getIgnoreOrientationRequest());
assertSetOrientation(Build.VERSION_CODES.CUR_DEVELOPMENT, CATEGORY_SOCIAL, false);
assertSetOrientation(Build.VERSION_CODES.CUR_DEVELOPMENT, CATEGORY_GAME, true);
@@ -2702,6 +2711,7 @@ public class ActivityRecordTests extends WindowTestsBase {
@Test
public void testRespectTopFullscreenOrientation() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build();
final Configuration displayConfig = activity.mDisplayContent.getConfiguration();
final Configuration activityConfig = activity.getConfiguration();
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
index e0b29c937381..1cb1e3cae413 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
@@ -511,6 +511,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
@Test
public void testSupportsMultiWindow_nonResizable() {
final ActivityRecord activity = new ActivityBuilder(mAtm)
+ .setComponent(getUniqueComponentName(mContext.getPackageName()))
.setCreateTask(true)
.setResizeMode(RESIZE_MODE_UNRESIZEABLE)
.build();
diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
index 40da9ea2d718..579ed6659976 100644
--- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
@@ -365,8 +365,8 @@ public class BackNavigationControllerTests extends WindowTestsBase {
assertTrue(outPrevActivities.isEmpty());
assertTrue(predictable);
// reset
- tf1.setAdjacentTaskFragment(null);
- tf2.setAdjacentTaskFragment(null);
+ tf1.clearAdjacentTaskFragments();
+ tf2.clearAdjacentTaskFragments();
tf1.setCompanionTaskFragment(null);
tf2.setCompanionTaskFragment(null);
@@ -398,8 +398,8 @@ public class BackNavigationControllerTests extends WindowTestsBase {
assertTrue(predictable);
// reset
outPrevActivities.clear();
- tf2.setAdjacentTaskFragment(null);
- tf3.setAdjacentTaskFragment(null);
+ tf2.clearAdjacentTaskFragments();
+ tf3.clearAdjacentTaskFragments();
final TaskFragment tf4 = createTaskFragmentWithActivity(task);
// Stacked + next companion to top => predict for previous activity below companion.
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java
index 87dbca51e24e..060b379c1281 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaGroupTest.java
@@ -84,6 +84,7 @@ public class DisplayAreaGroupTest extends WindowTestsBase {
@Test
public void testGetRequestedOrientationForDisplay() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final Task task = new TaskBuilder(mSupervisor)
.setTaskDisplayArea(mTaskDisplayArea).setCreateActivity(true).build();
final ActivityRecord activity = task.getTopNonFinishingActivity();
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
index 7b2cd63b4afb..0a7df5a305bc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
@@ -491,6 +491,7 @@ public class DisplayAreaTest extends WindowTestsBase {
@Test
public void testSetIgnoreOrientationRequest_callSuperOnDescendantOrientationChangedNoSensor() {
final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea();
+ mDisplayContent.setIgnoreOrientationRequest(false);
final Task stack =
new TaskBuilder(mSupervisor).setOnTop(!ON_TOP).setCreateActivity(true).build();
final ActivityRecord activity = stack.getTopNonFinishingActivity();
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 9cbea2e2f0ad..db71f2bf039d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -898,6 +898,7 @@ public class DisplayContentTests extends WindowTestsBase {
public void testOrientationDefinedByKeyguard() {
final DisplayContent dc = mDisplayContent;
dc.getDisplayPolicy().setAwake(true);
+ dc.setIgnoreOrientationRequest(false);
// Create a window that requests landscape orientation. It will define device orientation
// by default.
@@ -925,6 +926,7 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testOrientationForAspectRatio() {
final DisplayContent dc = createNewDisplay();
+ dc.setIgnoreOrientationRequest(false);
// When display content is created its configuration is not yet initialized, which could
// cause unnecessary configuration propagation, so initialize it here.
@@ -1034,6 +1036,7 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testAllowsTopmostFullscreenOrientation() {
final DisplayContent dc = createNewDisplay();
+ dc.setIgnoreOrientationRequest(false);
assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, dc.getOrientation());
dc.getDisplayRotation().setFixedToUserRotation(
IWindowManager.FIXED_TO_USER_ROTATION_DISABLED);
@@ -1112,6 +1115,7 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testOnDescendantOrientationRequestChanged() {
final DisplayContent dc = createNewDisplay();
+ dc.setIgnoreOrientationRequest(false);
dc.getDisplayRotation().setFixedToUserRotation(
IWindowManager.FIXED_TO_USER_ROTATION_DISABLED);
dc.getDefaultTaskDisplayArea().setWindowingMode(WINDOWING_MODE_FULLSCREEN);
@@ -1130,6 +1134,7 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testOnDescendantOrientationRequestChanged_FrozenToUserRotation() {
final DisplayContent dc = createNewDisplay();
+ dc.setIgnoreOrientationRequest(false);
dc.getDisplayRotation().setFixedToUserRotation(
IWindowManager.FIXED_TO_USER_ROTATION_ENABLED);
dc.getDisplayRotation().setUserRotation(
@@ -1152,6 +1157,7 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testOrientationBehind() {
assertNull(mDisplayContent.getLastOrientationSource());
+ mDisplayContent.setIgnoreOrientationRequest(false);
final ActivityRecord prev = new ActivityBuilder(mAtm).setCreateTask(true)
.setScreenOrientation(getRotatedOrientation(mDisplayContent)).build();
prev.setVisibleRequested(false);
@@ -1172,6 +1178,7 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testFixedToUserRotationChanged() {
final DisplayContent dc = createNewDisplay();
+ dc.setIgnoreOrientationRequest(false);
dc.getDisplayRotation().setFixedToUserRotation(
IWindowManager.FIXED_TO_USER_ROTATION_ENABLED);
dc.getDisplayRotation().setUserRotation(
@@ -1589,6 +1596,7 @@ public class DisplayContentTests extends WindowTestsBase {
W_INPUT_METHOD, W_NOTIFICATION_SHADE })
@Test
public void testApplyTopFixedRotationTransform() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
spyOn(displayPolicy);
// Only non-movable (gesture) navigation bar will be animated by fixed rotation animation.
@@ -1742,6 +1750,7 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testFixedRotationWithPip() {
final DisplayContent displayContent = mDefaultDisplay;
+ displayContent.setIgnoreOrientationRequest(false);
unblockDisplayRotation(displayContent);
// Unblock the condition in PinnedTaskController#continueOrientationChangeIfNeeded.
doNothing().when(displayContent).prepareAppTransition(anyInt());
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java
index 63973345b5fb..6527af1ec704 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationImmersiveAppCompatPolicyTests.java
@@ -77,7 +77,7 @@ public class DisplayRotationImmersiveAppCompatPolicyTests extends WindowTestsBas
when(mMockActivityRecord.findMainWindow()).thenReturn(mMockWindowState);
doReturn(mMockActivityRecord).when(mDisplayContent).topRunningActivity();
- when(mDisplayContent.getIgnoreOrientationRequest()).thenReturn(true);
+ mDisplayContent.setIgnoreOrientationRequest(true);
mMockAppCompatConfiguration = mock(AppCompatConfiguration.class);
when(mMockAppCompatConfiguration.isDisplayRotationImmersiveAppCompatPolicyEnabled())
@@ -195,7 +195,7 @@ public class DisplayRotationImmersiveAppCompatPolicyTests extends WindowTestsBas
@Test
public void testIsRotationLockEnforced_ignoreOrientationRequestDisabled_lockNotEnforced() {
- when(mDisplayContent.getIgnoreOrientationRequest()).thenReturn(false);
+ mDisplayContent.setIgnoreOrientationRequest(false);
assertIsRotationLockEnforcedReturnsFalseForAllRotations();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
index 708d6860abc2..bd15bc42e811 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
@@ -106,6 +106,8 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase {
// Display: 1920x1200 (landscape). First and second display are both 860x1200 (portrait).
mDisplay = new DualDisplayContent.Builder(mAtm, 1920, 1200).build();
+ // The test verifies that the display area can affect display's getLastOrientation().
+ mDisplay.setIgnoreOrientationRequest(false);
mFirstRoot = mDisplay.mFirstRoot;
mSecondRoot = mDisplay.mSecondRoot;
mFirstTda = mDisplay.getTaskDisplayArea(FEATURE_FIRST_TASK_CONTAINER);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java b/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java
index 7cb62c5a6769..d96512588c7c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java
@@ -132,6 +132,7 @@ public class RootTaskTests extends WindowTestsBase {
@Test
public void testClosingAppDifferentTaskOrientation() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
activity1.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
@@ -146,6 +147,7 @@ public class RootTaskTests extends WindowTestsBase {
@Test
public void testMoveTaskToBackDifferentTaskOrientation() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
activity1.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 7e8bd38fb6a9..699ed0263756 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -41,6 +41,7 @@ import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP;
import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS_AND_RESTORE;
import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
@@ -63,6 +64,7 @@ import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
import android.app.ActivityOptions;
import android.app.WindowConfiguration;
@@ -77,12 +79,14 @@ import android.graphics.Rect;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.util.Pair;
import androidx.test.filters.MediumTest;
import com.android.internal.app.ResolverActivity;
+import com.android.window.flags.Flags;
import org.junit.Before;
import org.junit.Test;
@@ -693,6 +697,7 @@ public class RootWindowContainerTests extends WindowTestsBase {
@Test
public void testAwakeFromSleepingWithAppConfiguration() {
final DisplayContent display = mRootWindowContainer.getDefaultDisplay();
+ display.setIgnoreOrientationRequest(false);
final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build();
activity.moveFocusableActivityToTop("test");
assertTrue(activity.getRootTask().isFocusedRootTaskOnDisplay());
@@ -1331,6 +1336,38 @@ public class RootWindowContainerTests extends WindowTestsBase {
assertEquals(taskDisplayArea.getTopRootTask(), taskDisplayArea.getRootHomeTask());
}
+ @EnableFlags(Flags.FLAG_ENABLE_TOP_VISIBLE_ROOT_TASK_PER_USER_TRACKING)
+ @Test
+ public void testSwitchUser_withVisibleRootTasks_storesAllVisibleRootTasksForCurrentUser() {
+ // Set up root tasks
+ final Task rootTask1 = mRootWindowContainer.getDefaultTaskDisplayArea().createRootTask(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final Task rootTask2 = mRootWindowContainer.getDefaultTaskDisplayArea().createRootTask(
+ WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final Task rootTask3 = mRootWindowContainer.getDefaultTaskDisplayArea().createRootTask(
+ WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ doReturn(rootTask3).when(mRootWindowContainer).getTopDisplayFocusedRootTask();
+
+ // Set up user ids and visibility
+ rootTask1.mUserId = mRootWindowContainer.mCurrentUser;
+ rootTask2.mUserId = mRootWindowContainer.mCurrentUser;
+ rootTask3.mUserId = mRootWindowContainer.mCurrentUser;
+ rootTask1.mVisibleRequested = false;
+ rootTask2.mVisibleRequested = true;
+ rootTask3.mVisibleRequested = true;
+
+ // Switch to a different user
+ int currentUser = mRootWindowContainer.mCurrentUser;
+ int otherUser = currentUser + 1;
+ mRootWindowContainer.switchUser(otherUser, null);
+
+ // Verify that the previous user persists it's previous visible root tasks
+ assertArrayEquals(
+ new int[]{rootTask2.mTaskId, rootTask3.mTaskId},
+ mRootWindowContainer.mUserVisibleRootTasks.get(currentUser).toArray()
+ );
+ }
+
@Test
public void testLockAllProfileTasks() {
final int profileUid = UserHandle.PER_USER_RANGE + UserHandle.MIN_SECONDARY_USER_ID;
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index bf96f0eb03b8..201ff51f1495 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -107,6 +107,8 @@ import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig.Properties;
+import android.view.DisplayCutout;
+import android.view.DisplayInfo;
import android.view.InsetsFrameProvider;
import android.view.InsetsSource;
import android.view.InsetsState;
@@ -210,6 +212,37 @@ public class SizeCompatTests extends WindowTestsBase {
return setUpApp(builder.build(), appBuilder);
}
+ private void setUpLargeScreenDisplayWithApp(int dw, int dh) {
+ final DisplayContent display = mDisplayContent;
+ final DisplayInfo displayInfo = display.getDisplayInfo();
+ displayInfo.logicalWidth = dw;
+ displayInfo.logicalHeight = dh;
+ // Prevent legacy sdk from being affected by INSETS_DECOUPLED_CONFIGURATION_ENFORCED.
+ display.mInitialDisplayCutout = displayInfo.displayCutout = DisplayCutout.NO_CUTOUT;
+ // Smallest screen width=747dp according to 1400/(300/160).
+ display.mBaseDisplayDensity = displayInfo.logicalDensityDpi =
+ TestDisplayContent.DEFAULT_LOGICAL_DISPLAY_DENSITY;
+ doNothing().when(display).updateDisplayInfo(any());
+ resizeDisplay(display, displayInfo.logicalWidth, displayInfo.logicalHeight);
+ assertTrue(display.isLargeScreen());
+ if (com.android.window.flags.Flags.universalResizableByDefault()) {
+ assertTrue("Large screen must ignore orientation request",
+ display.getIgnoreOrientationRequest());
+ } else {
+ display.setIgnoreOrientationRequest(true);
+ }
+ setUpApp(display, null /* appBuilder */);
+ spyOn(display.getDisplayRotation());
+ }
+
+ private void setUpLandscapeLargeScreenDisplayWithApp() {
+ setUpLargeScreenDisplayWithApp(/* dw */ 2800, /* dh */ 1400);
+ }
+
+ private void setUpPortraitLargeScreenDisplayWithApp() {
+ setUpLargeScreenDisplayWithApp(/* dw */ 1400, /* dh */ 2800);
+ }
+
@Test
public void testHorizontalReachabilityEnabledForTranslucentActivities() {
testReachabilityEnabledForTranslucentActivity(/* dw */ 2500, /* dh */1000,
@@ -658,9 +691,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testIsLetterboxed_activityFromBubble_returnsFalse() {
- setUpDisplaySizeWithApp(1000, 2500);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
- spyOn(mActivity);
+ setUpPortraitLargeScreenDisplayWithApp();
doReturn(true).when(mActivity).getLaunchedFromBubble();
prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE);
@@ -1694,10 +1725,9 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testGetLetterboxInnerBounds_noScalingApplied() {
// Set up a display in portrait and ignoring orientation request.
- final int dw = 1400;
- final int dh = 2800;
- setUpDisplaySizeWithApp(dw, dh);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpPortraitLargeScreenDisplayWithApp();
+ final int dw = mDisplayContent.mBaseDisplayWidth;
+ final int dh = mDisplayContent.mBaseDisplayHeight;
// Rotate display to landscape.
rotateDisplay(mActivity.mDisplayContent, ROTATION_90);
@@ -1823,8 +1853,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_fixedOrientationAppLaunchedLetterbox() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
// Portrait fixed app without max aspect.
prepareUnresizable(mActivity, /* maxAspect= */ 0, SCREEN_ORIENTATION_PORTRAIT);
@@ -1852,8 +1881,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_fixedOrientationAppRespectMinAspectRatio() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
// Portrait fixed app with min aspect ratio higher that aspect ratio override for fixed
// orientation letterbox.
@@ -1884,8 +1912,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_fixedOrientationAppRespectMaxAspectRatio() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
// Portrait fixed app with max aspect ratio lower that aspect ratio override for fixed
// orientation letterbox.
@@ -1915,8 +1942,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_fixedOrientationAppWithAspectRatioOverride() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
final float fixedOrientationLetterboxAspectRatio = 1.1f;
mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(
@@ -2011,8 +2037,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_unresizableWithCorrespondingMinAspectRatio() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
final float fixedOrientationLetterboxAspectRatio = 1.1f;
mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(
@@ -2045,13 +2070,10 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testComputeConfigResourceOverrides_unresizableApp() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
- final Rect activityBounds = new Rect(mActivity.getBounds());
-
int originalScreenWidthDp = mActivity.getConfiguration().screenWidthDp;
int originalScreenHeighthDp = mActivity.getConfiguration().screenHeightDp;
@@ -2068,7 +2090,7 @@ public class SizeCompatTests extends WindowTestsBase {
// After we rotate, the activity should go in the size-compat mode and report the same
// configuration values.
- assertDownScaled();
+ assertThat(mActivity.inSizeCompatMode()).isTrue();
assertEquals(originalScreenWidthDp, mActivity.getConfiguration().smallestScreenWidthDp);
assertEquals(originalScreenWidthDp, mActivity.getConfiguration().screenWidthDp);
assertEquals(originalScreenHeighthDp, mActivity.getConfiguration().screenHeightDp);
@@ -2087,14 +2109,11 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testComputeConfigResourceOverrides_resizableFixedOrientationActivity() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
// Portrait fixed app without max aspect.
prepareLimitedBounds(mActivity, SCREEN_ORIENTATION_PORTRAIT, false /* isUnresizable */);
- final Rect activityBounds = new Rect(mActivity.getBounds());
-
int originalScreenWidthDp = mActivity.getConfiguration().screenWidthDp;
int originalScreenHeighthDp = mActivity.getConfiguration().screenHeightDp;
@@ -2206,10 +2225,10 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testSystemFullscreenOverrideForLandscapeDisplay() {
- final int displayWidth = 1600;
- final int displayHeight = 1400;
- setUpDisplaySizeWithApp(displayWidth, displayHeight);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
+ final int displayWidth = mDisplayContent.mBaseDisplayWidth;
+ final int displayHeight = mDisplayContent.mBaseDisplayHeight;
+
spyOn(mActivity.mAppCompatController.getAppCompatAspectRatioOverrides());
doReturn(true).when(
mActivity.mAppCompatController.getAppCompatAspectRatioOverrides())
@@ -2226,10 +2245,10 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testSystemFullscreenOverrideForPortraitDisplay() {
- final int displayWidth = 1400;
- final int displayHeight = 1600;
- setUpDisplaySizeWithApp(displayWidth, displayHeight);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpPortraitLargeScreenDisplayWithApp();
+ final int displayWidth = mDisplayContent.mBaseDisplayWidth;
+ final int displayHeight = mDisplayContent.mBaseDisplayHeight;
+
spyOn(mActivity.mAppCompatController.getAppCompatAspectRatioOverrides());
doReturn(true).when(
mActivity.mAppCompatController.getAppCompatAspectRatioOverrides())
@@ -2619,7 +2638,7 @@ public class SizeCompatTests extends WindowTestsBase {
@EnableCompatChanges({ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION})
public void testOverrideRespectRequestedOrientationIsEnabled_orientationIsRespected() {
// Set up a display in landscape
- setUpDisplaySizeWithApp(2800, 1400);
+ setUpDisplaySizeWithApp(1000, 500);
final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */ false,
RESIZE_MODE_UNRESIZEABLE, SCREEN_ORIENTATION_PORTRAIT);
@@ -2636,7 +2655,7 @@ public class SizeCompatTests extends WindowTestsBase {
@EnableCompatChanges({ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION})
public void testOverrideRespectRequestedOrientationIsEnabled_multiWindow_orientationIgnored() {
// Set up a display in landscape
- setUpDisplaySizeWithApp(2800, 1400);
+ setUpDisplaySizeWithApp(1000, 500);
final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */ false,
RESIZE_MODE_UNRESIZEABLE, SCREEN_ORIENTATION_PORTRAIT);
@@ -2655,10 +2674,9 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testSplitAspectRatioForUnresizableLandscapeApps() {
// Set up a display in portrait and ignoring orientation request.
- int screenWidth = 1400;
- int screenHeight = 1600;
- setUpDisplaySizeWithApp(screenWidth, screenHeight);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLargeScreenDisplayWithApp(1400, 2400);
+ final int screenWidth = mDisplayContent.mBaseDisplayWidth;
+ final int screenHeight = mDisplayContent.mBaseDisplayHeight;
mActivity.mWmService.mAppCompatConfiguration
.setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true);
@@ -2692,10 +2710,9 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayAspectRatioForResizablePortraitApps() {
// Set up a display in portrait and ignoring orientation request.
- int displayWidth = 1400;
- int displayHeight = 1600;
- setUpDisplaySizeWithApp(displayWidth, displayHeight);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLargeScreenDisplayWithApp(1400, 2400);
+ final int displayWidth = mDisplayContent.mBaseDisplayWidth;
+ final int displayHeight = mDisplayContent.mBaseDisplayHeight;
mWm.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(2f);
// Enable display aspect ratio to take precedence before
@@ -2728,10 +2745,9 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayAspectRatioForResizableLandscapeApps() {
// Set up a display in landscape and ignoring orientation request.
- int displayWidth = 1600;
- int displayHeight = 1400;
- setUpDisplaySizeWithApp(displayWidth, displayHeight);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
+ final int displayWidth = mDisplayContent.mBaseDisplayWidth;
+ final int displayHeight = mDisplayContent.mBaseDisplayHeight;
mWm.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(2f);
// Enable display aspect ratio to take precedence before
@@ -2764,10 +2780,9 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayAspectRatioForUnresizableLandscapeApps() {
// Set up a display in portrait and ignoring orientation request.
- int displayWidth = 1400;
- int displayHeight = 1600;
- setUpDisplaySizeWithApp(displayWidth, displayHeight);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpPortraitLargeScreenDisplayWithApp();
+ final int displayWidth = mDisplayContent.mBaseDisplayWidth;
+ final int displayHeight = mDisplayContent.mBaseDisplayHeight;
mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(1.1f);
// Enable display aspect ratio to take precedence before
@@ -2791,10 +2806,9 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayAspectRatioForUnresizablePortraitApps() {
// Set up a display in landscape and ignoring orientation request.
- int displayWidth = 1600;
- int displayHeight = 1400;
- setUpDisplaySizeWithApp(displayWidth, displayHeight);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
+ final int displayWidth = mDisplayContent.mBaseDisplayWidth;
+ final int displayHeight = mDisplayContent.mBaseDisplayHeight;
mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(1.1f);
// Enable display aspect ratio to take precedence before
@@ -2819,8 +2833,7 @@ public class SizeCompatTests extends WindowTestsBase {
public void
testDisplayIgnoreOrientationRequest_orientationLetterboxBecameSizeCompatAfterRotate() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
// Portrait fixed app without max aspect.
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
@@ -2837,7 +2850,7 @@ public class SizeCompatTests extends WindowTestsBase {
// App should be in size compat.
assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy()
.isLetterboxedForFixedOrientationAndAspectRatio());
- assertDownScaled();
+ assertThat(mActivity.inSizeCompatMode()).isTrue();
assertEquals(activityBounds.width(), newActivityBounds.width());
assertEquals(activityBounds.height(), newActivityBounds.height());
assertActivityMaxBoundsSandboxed();
@@ -2846,8 +2859,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_sizeCompatAfterRotate() {
// Set up a display in portrait and ignoring orientation request.
- setUpDisplaySizeWithApp(1400, 2800);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpPortraitLargeScreenDisplayWithApp();
// Portrait fixed app without max aspect.
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
@@ -2882,9 +2894,8 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_newLaunchedOrientationAppInLetterbox() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
+ setUpLandscapeLargeScreenDisplayWithApp();
final DisplayContent display = mActivity.mDisplayContent;
- display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
// Portrait fixed app without max aspect.
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
@@ -2928,9 +2939,7 @@ public class SizeCompatTests extends WindowTestsBase {
@EnableCompatChanges({ActivityInfo.OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION})
public void testDisplayIgnoreOrientationRequest_orientationChangedToUnspecified() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- final DisplayContent display = mActivity.mDisplayContent;
- display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
// Portrait fixed app without max aspect.
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
@@ -2950,9 +2959,8 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_newLaunchedMaxAspectApp() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
+ setUpLandscapeLargeScreenDisplayWithApp();
final DisplayContent display = mActivity.mDisplayContent;
- display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
// Portrait fixed app without max aspect.
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
@@ -3001,9 +3009,7 @@ public class SizeCompatTests extends WindowTestsBase {
@SuppressWarnings("GuardedBy")
public void testDisplayIgnoreOrientationRequest_pausedAppNotLostSizeCompat() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- final DisplayContent display = mActivity.mDisplayContent;
- display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
// Portrait fixed app.
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
@@ -3019,7 +3025,6 @@ public class SizeCompatTests extends WindowTestsBase {
// App should be in size compat.
assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy()
.isLetterboxedForFixedOrientationAndAspectRatio());
- assertDownScaled();
assertThat(mActivity.inSizeCompatMode()).isTrue();
// Activity max bounds are sandboxed due to size compat mode.
assertActivityMaxBoundsSandboxed();
@@ -3035,7 +3040,7 @@ public class SizeCompatTests extends WindowTestsBase {
verify(scmPolicy, never()).clearSizeCompatMode();
assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy()
.isLetterboxedForFixedOrientationAndAspectRatio());
- assertDownScaled();
+ assertThat(mActivity.inSizeCompatMode()).isTrue();
assertEquals(activityBounds, mActivity.getBounds());
// Activity max bounds are sandboxed due to size compat.
assertActivityMaxBoundsSandboxed();
@@ -3044,9 +3049,8 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testDisplayIgnoreOrientationRequest_rotated180_notInSizeCompat() {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
+ setUpLandscapeLargeScreenDisplayWithApp();
final DisplayContent display = mActivity.mDisplayContent;
- display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
// Portrait fixed app.
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
@@ -3063,7 +3067,7 @@ public class SizeCompatTests extends WindowTestsBase {
// App should be in size compat.
assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy()
.isLetterboxedForFixedOrientationAndAspectRatio());
- assertDownScaled();
+ assertThat(mActivity.inSizeCompatMode()).isTrue();
assertActivityMaxBoundsSandboxed();
// Rotate display to landscape.
@@ -3246,8 +3250,9 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testTaskDisplayAreaNotFillDisplay() {
- setUpDisplaySizeWithApp(1400, 2800);
+ setUpPortraitLargeScreenDisplayWithApp();
final DisplayContent display = mActivity.mDisplayContent;
+ display.setIgnoreOrientationRequest(false);
final TaskDisplayArea taskDisplayArea = mActivity.getDisplayArea();
taskDisplayArea.setBounds(0, 0, 1000, 2400);
@@ -3430,8 +3435,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testIsHorizontalReachabilityEnabled_splitScreen_false() {
mAtm.mDevEnableNonResizableMultiWindow = true;
- setUpDisplaySizeWithApp(2800, 1000);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
mWm.mAppCompatConfiguration.setIsHorizontalReachabilityEnabled(true);
setUpAllowThinLetterboxed(/* thinLetterboxAllowed */ true);
final TestSplitOrganizer organizer =
@@ -3518,8 +3522,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testIsHorizontalReachabilityEnabled_emptyBounds_true() {
- setUpDisplaySizeWithApp(/* dw */ 2800, /* dh */ 1000);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
mWm.mAppCompatConfiguration.setIsHorizontalReachabilityEnabled(true);
setUpAllowThinLetterboxed(/* thinLetterboxAllowed */ true);
@@ -3566,8 +3569,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testIsHorizontalReachabilityEnabled_doesNotMatchParentHeight_false() {
- setUpDisplaySizeWithApp(2800, 1000);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
mWm.mAppCompatConfiguration.setIsHorizontalReachabilityEnabled(true);
setUpAllowThinLetterboxed(/* thinLetterboxAllowed */ true);
@@ -3787,12 +3789,10 @@ public class SizeCompatTests extends WindowTestsBase {
}
private void assertLandscapeActivityAlignedToBottomWithNavbar(boolean immersive) {
- final int screenHeight = 2800;
- final int screenWidth = 1400;
+ setUpPortraitLargeScreenDisplayWithApp();
+ final int screenHeight = mDisplayContent.mBaseDisplayHeight;
+ final int screenWidth = mDisplayContent.mBaseDisplayWidth;
final int taskbarHeight = 200;
- setUpDisplaySizeWithApp(screenWidth, screenHeight);
-
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true);
mActivity.mWmService.mAppCompatConfiguration.setLetterboxVerticalPositionMultiplier(1.0f);
final InsetsSource navSource = new InsetsSource(
@@ -3972,8 +3972,7 @@ public class SizeCompatTests extends WindowTestsBase {
float letterboxHorizontalPositionMultiplier, Rect fixedOrientationLetterbox,
Rect sizeCompatUnscaled, Rect sizeCompatScaled) {
// Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
mActivity.mWmService.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier(
letterboxHorizontalPositionMultiplier);
@@ -4177,13 +4176,28 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testUpdateResolvedBoundsHorizontalPosition_activityFillParentWidth() {
+ // Set up a display in landscape and ignoring orientation request.
+ setUpLandscapeLargeScreenDisplayWithApp();
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE);
+
+ final Consumer<Float> assertHorizontalPosition = letterboxHorizontalPositionMultiplier -> {
+ mActivity.mWmService.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier(
+ letterboxHorizontalPositionMultiplier);
+ mActivity.recomputeConfiguration();
+ assertFitted();
+ // Rotate to put activity in size compat mode.
+ rotateDisplay(mActivity.mDisplayContent, ROTATION_90);
+ assertTrue(mActivity.inSizeCompatMode());
+ // Activity is in size compat mode but not scaled.
+ assertEquals(new Rect(0, 0, 1400, 700), mActivity.getBounds());
+ if (letterboxHorizontalPositionMultiplier < 1f) {
+ rotateDisplay(mActivity.mDisplayContent, ROTATION_0);
+ }
+ };
// When activity width equals parent width, multiplier shouldn't have any effect.
- assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity(
- /* letterboxHorizontalPositionMultiplier */ 0.0f);
- assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity(
- /* letterboxHorizontalPositionMultiplier */ 0.5f);
- assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity(
- /* letterboxHorizontalPositionMultiplier */ 1.0f);
+ assertHorizontalPosition.accept(0.0f);
+ assertHorizontalPosition.accept(0.5f);
+ assertHorizontalPosition.accept(1.0f);
}
@Test
@@ -4354,8 +4368,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testUpdateResolvedBoundsHorizontalPosition_bookModeEnabled() {
// Set up a display in landscape with a fixed-orientation PORTRAIT app
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
mWm.mAppCompatConfiguration.setIsAutomaticReachabilityInBookModeEnabled(true);
mWm.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier(
1.0f /*letterboxHorizontalPositionMultiplier*/);
@@ -4380,8 +4393,7 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testUpdateResolvedBoundsHorizontalPosition_bookModeDisabled_centered() {
// Set up a display in landscape with a fixed-orientation PORTRAIT app
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpLandscapeLargeScreenDisplayWithApp();
mWm.mAppCompatConfiguration.setIsAutomaticReachabilityInBookModeEnabled(false);
mWm.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier(0.5f);
prepareUnresizable(mActivity, 1.75f, SCREEN_ORIENTATION_PORTRAIT);
@@ -4462,8 +4474,7 @@ public class SizeCompatTests extends WindowTestsBase {
float letterboxVerticalPositionMultiplier, Rect fixedOrientationLetterbox,
Rect sizeCompatUnscaled, Rect sizeCompatScaled) {
// Set up a display in portrait and ignoring orientation request.
- setUpDisplaySizeWithApp(1400, 2800);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ setUpPortraitLargeScreenDisplayWithApp();
mActivity.mWmService.mAppCompatConfiguration.setLetterboxVerticalPositionMultiplier(
letterboxVerticalPositionMultiplier);
@@ -5036,23 +5047,6 @@ public class SizeCompatTests extends WindowTestsBase {
return (dimensionToSplit - (dividerWindowWidth - dividerInsets * 2)) / 2;
}
- private void assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity(
- float letterboxHorizontalPositionMultiplier) {
- // Set up a display in landscape and ignoring orientation request.
- setUpDisplaySizeWithApp(2800, 1400);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
-
- mActivity.mWmService.mAppCompatConfiguration.setLetterboxHorizontalPositionMultiplier(
- letterboxHorizontalPositionMultiplier);
- prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE);
- assertFitted();
- // Rotate to put activity in size compat mode.
- rotateDisplay(mActivity.mDisplayContent, ROTATION_90);
- assertTrue(mActivity.inSizeCompatMode());
- // Activity is in size compat mode but not scaled.
- assertEquals(new Rect(0, 0, 1400, 700), mActivity.getBounds());
- }
-
private void assertVerticalPositionForDifferentDisplayConfigsForPortraitActivity(
float letterboxVerticalPositionMultiplier) {
// Set up a display in portrait and ignoring orientation request.
diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
index 08622e68629a..921228ff2a5b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
@@ -78,6 +78,8 @@ import android.view.SurfaceControl;
import com.android.dx.mockito.inline.extended.StaticMockitoSession;
import com.android.internal.os.BackgroundThread;
+import com.android.internal.protolog.ProtoLog;
+import com.android.internal.protolog.WmProtoLogGroups;
import com.android.server.AnimationThread;
import com.android.server.DisplayThread;
import com.android.server.LocalServices;
@@ -183,6 +185,8 @@ public class SystemServicesTestRule implements TestRule {
}
private void setUp() {
+ ProtoLog.init(WmProtoLogGroups.values());
+
if (mOnBeforeServicesCreated != null) {
mOnBeforeServicesCreated.run();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
index 65a6a69fc45e..dafa96f91812 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
@@ -51,6 +51,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.clearInvocations;
@@ -62,6 +63,7 @@ import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Binder;
+import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.view.SurfaceControl;
import android.view.View;
@@ -1066,6 +1068,98 @@ public class TaskFragmentTest extends WindowTestsBase {
Math.min(outConfig.screenWidthDp, outConfig.screenHeightDp));
}
+ @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS)
+ @Test
+ public void testSetAdjacentTaskFragments() {
+ final Task task = createTask(mDisplayContent);
+ final TaskFragment tf0 = createTaskFragmentWithActivity(task);
+ final TaskFragment tf1 = createTaskFragmentWithActivity(task);
+ final TaskFragment tf2 = createTaskFragmentWithActivity(task);
+ final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2);
+ assertFalse(tf0.hasAdjacentTaskFragment());
+
+ tf0.setAdjacentTaskFragments(adjacentTfs);
+
+ assertSame(adjacentTfs, tf0.getAdjacentTaskFragments());
+ assertSame(adjacentTfs, tf1.getAdjacentTaskFragments());
+ assertSame(adjacentTfs, tf2.getAdjacentTaskFragments());
+ assertTrue(tf0.hasAdjacentTaskFragment());
+ assertTrue(tf1.hasAdjacentTaskFragment());
+ assertTrue(tf2.hasAdjacentTaskFragment());
+
+ final TaskFragment.AdjacentSet adjacentTfs2 = new TaskFragment.AdjacentSet(tf0, tf1);
+ tf0.setAdjacentTaskFragments(adjacentTfs2);
+
+ assertSame(adjacentTfs2, tf0.getAdjacentTaskFragments());
+ assertSame(adjacentTfs2, tf1.getAdjacentTaskFragments());
+ assertNull(tf2.getAdjacentTaskFragments());
+ assertTrue(tf0.hasAdjacentTaskFragment());
+ assertTrue(tf1.hasAdjacentTaskFragment());
+ assertFalse(tf2.hasAdjacentTaskFragment());
+ }
+
+ @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS)
+ @Test
+ public void testClearAdjacentTaskFragments() {
+ final Task task = createTask(mDisplayContent);
+ final TaskFragment tf0 = createTaskFragmentWithActivity(task);
+ final TaskFragment tf1 = createTaskFragmentWithActivity(task);
+ final TaskFragment tf2 = createTaskFragmentWithActivity(task);
+ final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2);
+ tf0.setAdjacentTaskFragments(adjacentTfs);
+
+ tf0.clearAdjacentTaskFragments();
+
+ assertNull(tf0.getAdjacentTaskFragments());
+ assertNull(tf1.getAdjacentTaskFragments());
+ assertNull(tf2.getAdjacentTaskFragments());
+ assertFalse(tf0.hasAdjacentTaskFragment());
+ assertFalse(tf1.hasAdjacentTaskFragment());
+ assertFalse(tf2.hasAdjacentTaskFragment());
+ }
+
+ @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS)
+ @Test
+ public void testRemoveFromAdjacentTaskFragments() {
+ final Task task = createTask(mDisplayContent);
+ final TaskFragment tf0 = createTaskFragmentWithActivity(task);
+ final TaskFragment tf1 = createTaskFragmentWithActivity(task);
+ final TaskFragment tf2 = createTaskFragmentWithActivity(task);
+ final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2);
+ tf0.setAdjacentTaskFragments(adjacentTfs);
+
+ tf0.removeFromAdjacentTaskFragments();
+
+ assertNull(tf0.getAdjacentTaskFragments());
+ assertSame(adjacentTfs, tf1.getAdjacentTaskFragments());
+ assertSame(adjacentTfs, tf2.getAdjacentTaskFragments());
+ assertFalse(adjacentTfs.contains(tf0));
+ assertTrue(tf1.isAdjacentTo(tf2));
+ assertTrue(tf2.isAdjacentTo(tf1));
+ assertFalse(tf1.isAdjacentTo(tf0));
+ assertFalse(tf0.isAdjacentTo(tf1));
+ assertFalse(tf0.isAdjacentTo(tf0));
+ assertFalse(tf1.isAdjacentTo(tf1));
+ }
+
+ @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS)
+ @Test
+ public void testRemoveFromAdjacentTaskFragmentsWhenRemove() {
+ final Task task = createTask(mDisplayContent);
+ final TaskFragment tf0 = createTaskFragmentWithActivity(task);
+ final TaskFragment tf1 = createTaskFragmentWithActivity(task);
+ final TaskFragment tf2 = createTaskFragmentWithActivity(task);
+ final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2);
+ tf0.setAdjacentTaskFragments(adjacentTfs);
+
+ tf0.removeImmediately();
+
+ assertNull(tf0.getAdjacentTaskFragments());
+ assertSame(adjacentTfs, tf1.getAdjacentTaskFragments());
+ assertSame(adjacentTfs, tf2.getAdjacentTaskFragments());
+ assertFalse(adjacentTfs.contains(tf0));
+ }
+
private WindowState createAppWindow(ActivityRecord app, String name) {
final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, app, name,
0 /* ownerId */, false /* ownerCanAddInternalSystemWindow */, new TestIWindow());
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
index e4512c31069a..1febc9fb4742 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
@@ -527,6 +527,7 @@ public class TaskTests extends WindowTestsBase {
@Test
public void testHandlesOrientationChangeFromDescendant() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final Task rootTask = createTask(mDisplayContent,
WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
final Task leafTask1 = createTaskInRootTask(rootTask, 0 /* userId */);
@@ -1570,6 +1571,7 @@ public class TaskTests extends WindowTestsBase {
@Test
public void testNotSpecifyOrientationByFloatingTask() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final Task task = new TaskBuilder(mSupervisor)
.setCreateActivity(true).setCreateParentTask(true).build();
final ActivityRecord activity = task.getTopMostActivity();
@@ -1589,6 +1591,7 @@ public class TaskTests extends WindowTestsBase {
@Test
public void testNotSpecifyOrientation_taskDisplayAreaNotFocused() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final TaskDisplayArea firstTaskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea();
final TaskDisplayArea secondTaskDisplayArea = createTaskDisplayArea(
mDisplayContent, mRootWindowContainer.mWmService, "TestTaskDisplayArea",
@@ -1625,6 +1628,7 @@ public class TaskTests extends WindowTestsBase {
@Test
public void testTaskOrientationOnDisplayWindowingModeChange() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
// Skip unnecessary operations to speed up the test.
mAtm.deferWindowLayout();
final Task task = getTestTask();
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index 039a3ddd3e4f..78f32c1a4f88 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -1333,6 +1333,7 @@ public class TransitionTests extends WindowTestsBase {
@Test
public void testDeferRotationForTransientLaunch() {
+ mDisplayContent.setIgnoreOrientationRequest(false);
final TestTransitionPlayer player = registerTestTransitionPlayer();
assumeFalse(mDisplayContent.mTransitionController.useShellTransitionsRotation());
final ActivityRecord app = new ActivityBuilder(mAtm).setCreateTask(true).build();
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java
index 42752c326615..f1180ff93edb 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java
@@ -314,6 +314,7 @@ public class TransparentPolicyTest extends WindowTestsBase {
runTestScenario((robot) -> {
robot.transparentActivity((ta) -> {
ta.applyOnActivity((a) -> {
+ a.setIgnoreOrientationRequest(false);
a.applyToTopActivity((topActivity) -> {
topActivity.mWmService.mAppCompatConfiguration
.setLetterboxHorizontalPositionMultiplier(1.0f);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
index 410fa2879600..da4c522834a6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -777,6 +777,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
@Test
public void testSetIgnoreOrientationRequest_taskDisplayArea() {
removeGlobalMinSizeRestriction();
+ mDisplayContent.setIgnoreOrientationRequest(false);
final TaskDisplayArea taskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea();
final Task rootTask = taskDisplayArea.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */);
@@ -815,6 +816,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
@Test
public void testSetIgnoreOrientationRequest_displayContent() {
removeGlobalMinSizeRestriction();
+ mDisplayContent.setIgnoreOrientationRequest(false);
final TaskDisplayArea taskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea();
final Task rootTask = taskDisplayArea.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */);
@@ -924,6 +926,49 @@ public class WindowOrganizerTests extends WindowTestsBase {
assertEquals(dc.getDefaultTaskDisplayArea().mLaunchAdjacentFlagRootTask, null);
}
+ @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS)
+ @Test
+ public void testSetAdjacentLaunchRootSet() {
+ final DisplayContent dc = mWm.mRoot.getDisplayContent(Display.DEFAULT_DISPLAY);
+
+ final Task task1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+ dc, WINDOWING_MODE_MULTI_WINDOW, null);
+ final RunningTaskInfo info1 = task1.getTaskInfo();
+ final Task task2 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+ dc, WINDOWING_MODE_MULTI_WINDOW, null);
+ final RunningTaskInfo info2 = task2.getTaskInfo();
+ final Task task3 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+ dc, WINDOWING_MODE_MULTI_WINDOW, null);
+ final RunningTaskInfo info3 = task3.getTaskInfo();
+
+ WindowContainerTransaction wct = new WindowContainerTransaction();
+ wct.setAdjacentRootSet(info1.token, info2.token, info3.token);
+ mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+ assertTrue(task1.hasAdjacentTaskFragment());
+ assertTrue(task2.hasAdjacentTaskFragment());
+ assertTrue(task3.hasAdjacentTaskFragment());
+ assertTrue(task1.isAdjacentTo(task2));
+ assertTrue(task1.isAdjacentTo(task3));
+ assertTrue(task2.isAdjacentTo(task3));
+
+ wct = new WindowContainerTransaction();
+ wct.clearAdjacentRoots(info1.token);
+ mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+ assertFalse(task1.hasAdjacentTaskFragment());
+ assertTrue(task2.hasAdjacentTaskFragment());
+ assertTrue(task3.hasAdjacentTaskFragment());
+ assertFalse(task1.isAdjacentTo(task2));
+ assertFalse(task1.isAdjacentTo(task3));
+ assertTrue(task2.isAdjacentTo(task3));
+
+ wct = new WindowContainerTransaction();
+ wct.clearAdjacentRoots(info2.token);
+ mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+ assertFalse(task2.hasAdjacentTaskFragment());
+ assertFalse(task3.hasAdjacentTaskFragment());
+ assertFalse(task2.isAdjacentTo(task3));
+ }
+
@Test
public void testTileAddRemoveChild() {
final StubOrganizer listener = new StubOrganizer();
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index 3a97cc621e0d..b27025c34d6b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -201,14 +201,10 @@ public class WindowTestsBase extends SystemServiceTestsBase {
* {@link WindowTestsBase#setUpBase()}.
*/
private static boolean sGlobalOverridesChecked;
+
/**
* Whether device-specific overrides have already been checked in
- * {@link WindowTestsBase#setUpBase()} when the default display is used.
- */
- private static boolean sOverridesCheckedDefaultDisplay;
- /**
- * Whether device-specific overrides have already been checked in
- * {@link WindowTestsBase#setUpBase()} when a {@link TestDisplayContent} is used.
+ * {@link WindowTestsBase#setUpBase()}.
*/
private static boolean sOverridesCheckedTestDisplay;
@@ -332,17 +328,14 @@ public class WindowTestsBase extends SystemServiceTestsBase {
private void checkDeviceSpecificOverridesNotApplied() {
// Check global overrides
if (!sGlobalOverridesChecked) {
+ sGlobalOverridesChecked = true;
assertEquals(0, mWm.mAppCompatConfiguration.getFixedOrientationLetterboxAspectRatio(),
0 /* delta */);
- sGlobalOverridesChecked = true;
}
// Check display-specific overrides
- if (!sOverridesCheckedDefaultDisplay && mDisplayContent == mDefaultDisplay) {
- assertFalse(mDisplayContent.getIgnoreOrientationRequest());
- sOverridesCheckedDefaultDisplay = true;
- } else if (!sOverridesCheckedTestDisplay && mDisplayContent instanceof TestDisplayContent) {
- assertFalse(mDisplayContent.getIgnoreOrientationRequest());
+ if (!sOverridesCheckedTestDisplay) {
sOverridesCheckedTestDisplay = true;
+ assertFalse(mDisplayContent.mHasSetIgnoreOrientationRequest);
}
}
@@ -1121,7 +1114,7 @@ public class WindowTestsBase extends SystemServiceTestsBase {
displayContent.getDisplayRotation().configure(width, height);
final Configuration c = new Configuration();
displayContent.computeScreenConfiguration(c);
- displayContent.onRequestedOverrideConfigurationChanged(c);
+ displayContent.performDisplayOverrideConfigUpdate(c);
}
static void makeDisplayLargeScreen(DisplayContent displayContent) {
diff --git a/telephony/java/android/telephony/Annotation.java b/telephony/java/android/telephony/Annotation.java
index 09b18b65be4a..8fe107cc1ad3 100644
--- a/telephony/java/android/telephony/Annotation.java
+++ b/telephony/java/android/telephony/Annotation.java
@@ -109,7 +109,6 @@ public class Annotation {
//TelephonyManager.NETWORK_TYPE_LTE_CA,
TelephonyManager.NETWORK_TYPE_NR,
- TelephonyManager.NETWORK_TYPE_NB_IOT_NTN,
})
@Retention(RetentionPolicy.SOURCE)
public @interface NetworkType {
diff --git a/telephony/java/android/telephony/CellIdentityCdma.java b/telephony/java/android/telephony/CellIdentityCdma.java
index 4e5a246ef773..4cb622b3eb9e 100644
--- a/telephony/java/android/telephony/CellIdentityCdma.java
+++ b/telephony/java/android/telephony/CellIdentityCdma.java
@@ -105,20 +105,30 @@ public final class CellIdentityCdma extends CellIdentity {
*/
public CellIdentityCdma(int nid, int sid, int bid, int lon, int lat,
@Nullable String alphal, @Nullable String alphas) {
- super(TAG, CellInfo.TYPE_CDMA, null, null, alphal, alphas);
- mNetworkId = inRangeOrUnavailable(nid, 0, NETWORK_ID_MAX);
- mSystemId = inRangeOrUnavailable(sid, 0, SYSTEM_ID_MAX);
- mBasestationId = inRangeOrUnavailable(bid, 0, BASESTATION_ID_MAX);
- lat = inRangeOrUnavailable(lat, LATITUDE_MIN, LATITUDE_MAX);
- lon = inRangeOrUnavailable(lon, LONGITUDE_MIN, LONGITUDE_MAX);
-
- if (!isNullIsland(lat, lon)) {
- mLongitude = lon;
- mLatitude = lat;
+ super(TAG, CellInfo.TYPE_CDMA, null, null, Flags.cleanupCdma() ? null : alphal,
+ Flags.cleanupCdma() ? null : alphas);
+ if (Flags.cleanupCdma()) {
+ mNetworkId = CellInfo.UNAVAILABLE;
+ mSystemId = CellInfo.UNAVAILABLE;
+ mBasestationId = CellInfo.UNAVAILABLE;
+ mLongitude = CellInfo.UNAVAILABLE;
+ mLatitude = CellInfo.UNAVAILABLE;
+ mGlobalCellId = null;
} else {
- mLongitude = mLatitude = CellInfo.UNAVAILABLE;
+ mNetworkId = inRangeOrUnavailable(nid, 0, NETWORK_ID_MAX);
+ mSystemId = inRangeOrUnavailable(sid, 0, SYSTEM_ID_MAX);
+ mBasestationId = inRangeOrUnavailable(bid, 0, BASESTATION_ID_MAX);
+ lat = inRangeOrUnavailable(lat, LATITUDE_MIN, LATITUDE_MAX);
+ lon = inRangeOrUnavailable(lon, LONGITUDE_MIN, LONGITUDE_MAX);
+
+ if (!isNullIsland(lat, lon)) {
+ mLongitude = lon;
+ mLatitude = lat;
+ } else {
+ mLongitude = mLatitude = CellInfo.UNAVAILABLE;
+ }
+ updateGlobalCellId();
}
- updateGlobalCellId();
}
private CellIdentityCdma(@NonNull CellIdentityCdma cid) {
@@ -300,14 +310,34 @@ public final class CellIdentityCdma extends CellIdentity {
/** Construct from Parcel, type has already been processed */
private CellIdentityCdma(Parcel in) {
super(TAG, CellInfo.TYPE_CDMA, in);
- mNetworkId = in.readInt();
- mSystemId = in.readInt();
- mBasestationId = in.readInt();
- mLongitude = in.readInt();
- mLatitude = in.readInt();
-
- updateGlobalCellId();
- if (DBG) log(toString());
+
+ if (Flags.cleanupCdma()) {
+ in.readInt();
+ mNetworkId = CellInfo.UNAVAILABLE;
+
+ in.readInt();
+ mSystemId = CellInfo.UNAVAILABLE;
+
+ in.readInt();
+ mBasestationId = CellInfo.UNAVAILABLE;
+
+ in.readInt();
+ mLongitude = CellInfo.UNAVAILABLE;
+
+ in.readInt();
+ mLatitude = CellInfo.UNAVAILABLE;
+
+ mGlobalCellId = null;
+ } else {
+ mNetworkId = in.readInt();
+ mSystemId = in.readInt();
+ mBasestationId = in.readInt();
+ mLongitude = in.readInt();
+ mLatitude = in.readInt();
+
+ updateGlobalCellId();
+ if (DBG) log(toString());
+ }
}
/**
diff --git a/telephony/java/android/telephony/CellSignalStrengthCdma.java b/telephony/java/android/telephony/CellSignalStrengthCdma.java
index 5298e67bdf80..12a7294c42de 100644
--- a/telephony/java/android/telephony/CellSignalStrengthCdma.java
+++ b/telephony/java/android/telephony/CellSignalStrengthCdma.java
@@ -21,6 +21,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
+import com.android.internal.telephony.flags.Flags;
import com.android.telephony.Rlog;
import java.util.Objects;
@@ -68,13 +69,17 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
*/
public CellSignalStrengthCdma(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio,
int evdoSnr) {
- mCdmaDbm = inRangeOrUnavailable(cdmaDbm, -120, 0);
- mCdmaEcio = inRangeOrUnavailable(cdmaEcio, -160, 0);
- mEvdoDbm = inRangeOrUnavailable(evdoDbm, -120, 0);
- mEvdoEcio = inRangeOrUnavailable(evdoEcio, -160, 0);
- mEvdoSnr = inRangeOrUnavailable(evdoSnr, 0, 8);
+ if (Flags.cleanupCdma()) {
+ setDefaultValues();
+ } else {
+ mCdmaDbm = inRangeOrUnavailable(cdmaDbm, -120, 0);
+ mCdmaEcio = inRangeOrUnavailable(cdmaEcio, -160, 0);
+ mEvdoDbm = inRangeOrUnavailable(evdoDbm, -120, 0);
+ mEvdoEcio = inRangeOrUnavailable(evdoEcio, -160, 0);
+ mEvdoSnr = inRangeOrUnavailable(evdoSnr, 0, 8);
- updateLevel(null, null);
+ updateLevel(null, null);
+ }
}
/** @hide */
@@ -84,6 +89,10 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
/** @hide */
protected void copyFrom(CellSignalStrengthCdma s) {
+ if (Flags.cleanupCdma()) {
+ setDefaultValues();
+ return;
+ }
mCdmaDbm = s.mCdmaDbm;
mCdmaEcio = s.mCdmaEcio;
mEvdoDbm = s.mEvdoDbm;
@@ -389,6 +398,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
/** @hide */
@Override
public boolean isValid() {
+ if (Flags.cleanupCdma()) return false;
return !this.equals(sInvalid);
}
@@ -446,7 +456,12 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
mEvdoEcio = in.readInt();
mEvdoSnr = in.readInt();
mLevel = in.readInt();
- if (DBG) log("CellSignalStrengthCdma(Parcel): " + toString());
+
+ if (Flags.cleanupCdma()) {
+ setDefaultValues();
+ } else {
+ if (DBG) log("CellSignalStrengthCdma(Parcel): " + toString());
+ }
}
/** Implement the Parcelable interface */
diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java
index 8b52f07102b8..90d6f89553b7 100644
--- a/telephony/java/android/telephony/RadioAccessFamily.java
+++ b/telephony/java/android/telephony/RadioAccessFamily.java
@@ -66,9 +66,6 @@ public class RadioAccessFamily implements Parcelable {
// 5G
public static final int RAF_NR = (int) TelephonyManager.NETWORK_TYPE_BITMASK_NR;
- /** NB-IOT (Narrowband Internet of Things) over Non-Terrestrial-Networks technology. */
- public static final int RAF_NB_IOT_NTN = (int) TelephonyManager.NETWORK_TYPE_BITMASK_NB_IOT_NTN;
-
// Grouping of RAFs
// 2G
private static final int GSM = RAF_GSM | RAF_GPRS | RAF_EDGE;
@@ -83,9 +80,6 @@ public class RadioAccessFamily implements Parcelable {
// 5G
private static final int NR = RAF_NR;
- /** Non-Terrestrial Network. */
- private static final int NB_IOT_NTN = RAF_NB_IOT_NTN;
-
/* Phone ID of phone */
private int mPhoneId;
@@ -264,7 +258,7 @@ public class RadioAccessFamily implements Parcelable {
raf = ((EVDO & raf) > 0) ? (EVDO | raf) : raf;
raf = ((LTE & raf) > 0) ? (LTE | raf) : raf;
raf = ((NR & raf) > 0) ? (NR | raf) : raf;
- raf = ((NB_IOT_NTN & raf) > 0) ? (NB_IOT_NTN | raf) : raf;
+
return raf;
}
@@ -370,7 +364,6 @@ public class RadioAccessFamily implements Parcelable {
case "WCDMA": return WCDMA;
case "LTE_CA": return RAF_LTE_CA;
case "NR": return RAF_NR;
- case "NB_IOT_NTN": return RAF_NB_IOT_NTN;
default: return RAF_UNKNOWN;
}
}
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index f8c3287fec36..127bbff01575 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -233,12 +233,6 @@ public class ServiceState implements Parcelable {
public static final int RIL_RADIO_TECHNOLOGY_NR = 20;
/**
- * 3GPP NB-IOT (Narrowband Internet of Things) over Non-Terrestrial-Networks technology.
- * @hide
- */
- public static final int RIL_RADIO_TECHNOLOGY_NB_IOT_NTN = 21;
-
- /**
* RIL Radio Annotation
* @hide
*/
@@ -264,16 +258,14 @@ public class ServiceState implements Parcelable {
ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA,
ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN,
ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA,
- ServiceState.RIL_RADIO_TECHNOLOGY_NR,
- ServiceState.RIL_RADIO_TECHNOLOGY_NB_IOT_NTN
- })
+ ServiceState.RIL_RADIO_TECHNOLOGY_NR})
public @interface RilRadioTechnology {}
/**
* The number of the radio technologies.
*/
- private static final int NEXT_RIL_RADIO_TECHNOLOGY = 22;
+ private static final int NEXT_RIL_RADIO_TECHNOLOGY = 21;
/** @hide */
public static final int RIL_RADIO_CDMA_TECHNOLOGY_BITMASK =
@@ -1133,9 +1125,6 @@ public class ServiceState implements Parcelable {
case RIL_RADIO_TECHNOLOGY_NR:
rtString = "NR_SA";
break;
- case RIL_RADIO_TECHNOLOGY_NB_IOT_NTN:
- rtString = "NB_IOT_NTN";
- break;
default:
rtString = "Unexpected";
Rlog.w(LOG_TAG, "Unexpected radioTechnology=" + rt);
@@ -1679,8 +1668,6 @@ public class ServiceState implements Parcelable {
return TelephonyManager.NETWORK_TYPE_LTE_CA;
case RIL_RADIO_TECHNOLOGY_NR:
return TelephonyManager.NETWORK_TYPE_NR;
- case RIL_RADIO_TECHNOLOGY_NB_IOT_NTN:
- return TelephonyManager.NETWORK_TYPE_NB_IOT_NTN;
default:
return TelephonyManager.NETWORK_TYPE_UNKNOWN;
}
@@ -1710,7 +1697,6 @@ public class ServiceState implements Parcelable {
return AccessNetworkType.CDMA2000;
case RIL_RADIO_TECHNOLOGY_LTE:
case RIL_RADIO_TECHNOLOGY_LTE_CA:
- case RIL_RADIO_TECHNOLOGY_NB_IOT_NTN:
return AccessNetworkType.EUTRAN;
case RIL_RADIO_TECHNOLOGY_NR:
return AccessNetworkType.NGRAN;
@@ -1771,8 +1757,6 @@ public class ServiceState implements Parcelable {
return RIL_RADIO_TECHNOLOGY_LTE_CA;
case TelephonyManager.NETWORK_TYPE_NR:
return RIL_RADIO_TECHNOLOGY_NR;
- case TelephonyManager.NETWORK_TYPE_NB_IOT_NTN:
- return RIL_RADIO_TECHNOLOGY_NB_IOT_NTN;
default:
return RIL_RADIO_TECHNOLOGY_UNKNOWN;
}
@@ -1882,8 +1866,7 @@ public class ServiceState implements Parcelable {
|| radioTechnology == RIL_RADIO_TECHNOLOGY_TD_SCDMA
|| radioTechnology == RIL_RADIO_TECHNOLOGY_IWLAN
|| radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA
- || radioTechnology == RIL_RADIO_TECHNOLOGY_NR
- || radioTechnology == RIL_RADIO_TECHNOLOGY_NB_IOT_NTN;
+ || radioTechnology == RIL_RADIO_TECHNOLOGY_NR;
}
@@ -1903,8 +1886,7 @@ public class ServiceState implements Parcelable {
public static boolean isPsOnlyTech(int radioTechnology) {
return radioTechnology == RIL_RADIO_TECHNOLOGY_LTE
|| radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA
- || radioTechnology == RIL_RADIO_TECHNOLOGY_NR
- || radioTechnology == RIL_RADIO_TECHNOLOGY_NB_IOT_NTN;
+ || radioTechnology == RIL_RADIO_TECHNOLOGY_NR;
}
/** @hide */
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 3f8e0669ba7b..24fb8c5da2d7 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -3197,12 +3197,6 @@ public class TelephonyManager {
* For 5G NSA, the network type will be {@link #NETWORK_TYPE_LTE}.
*/
public static final int NETWORK_TYPE_NR = TelephonyProtoEnums.NETWORK_TYPE_NR; // 20.
- /**
- * 3GPP NB-IOT (Narrowband Internet of Things) over Non-Terrestrial-Networks technology.
- */
- @FlaggedApi(Flags.FLAG_SATELLITE_SYSTEM_APIS)
- public static final int NETWORK_TYPE_NB_IOT_NTN =
- TelephonyProtoEnums.NETWORK_TYPE_NB_IOT_NTN; // 21
private static final @NetworkType int[] NETWORK_TYPES = {
NETWORK_TYPE_GPRS,
@@ -3279,7 +3273,6 @@ public class TelephonyManager {
* @see #NETWORK_TYPE_EHRPD
* @see #NETWORK_TYPE_HSPAP
* @see #NETWORK_TYPE_NR
- * @see #NETWORK_TYPE_NB_IOT_NTN
*
* @hide
*/
@@ -3340,7 +3333,6 @@ public class TelephonyManager {
* @see #NETWORK_TYPE_EHRPD
* @see #NETWORK_TYPE_HSPAP
* @see #NETWORK_TYPE_NR
- * @see #NETWORK_TYPE_NB_IOT_NTN
*
* @throws UnsupportedOperationException If the device does not have
* {@link PackageManager#FEATURE_TELEPHONY_RADIO_ACCESS}.
@@ -3491,8 +3483,6 @@ public class TelephonyManager {
return "LTE_CA";
case NETWORK_TYPE_NR:
return "NR";
- case NETWORK_TYPE_NB_IOT_NTN:
- return "NB_IOT_NTN";
case NETWORK_TYPE_UNKNOWN:
return "UNKNOWN";
default:
@@ -3543,8 +3533,6 @@ public class TelephonyManager {
return NETWORK_TYPE_BITMASK_LTE;
case NETWORK_TYPE_NR:
return NETWORK_TYPE_BITMASK_NR;
- case NETWORK_TYPE_NB_IOT_NTN:
- return NETWORK_TYPE_BITMASK_NB_IOT_NTN;
case NETWORK_TYPE_IWLAN:
return NETWORK_TYPE_BITMASK_IWLAN;
case NETWORK_TYPE_IDEN:
@@ -6387,6 +6375,7 @@ public class TelephonyManager {
* @deprecated use {@link #getImsPrivateUserIdentity()}
*/
@UnsupportedAppUsage
+ @Deprecated
public String getIsimImpi() {
try {
IPhoneSubInfo info = getSubscriberInfoService();
@@ -6476,6 +6465,7 @@ public class TelephonyManager {
* @deprecated use {@link #getImsPublicUserIdentities()}
*/
@UnsupportedAppUsage
+ @Deprecated
@Nullable
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String[] getIsimImpu() {
@@ -8510,7 +8500,9 @@ public class TelephonyManager {
if (telephony == null) {
throw new IllegalStateException("telephony service is null.");
}
- telephony.rebootModem(getSlotIndex());
+ if (!telephony.rebootModem(getSlotIndex())) {
+ throw new RuntimeException("Couldn't reboot modem (it may be not supported)");
+ }
} catch (RemoteException ex) {
Rlog.e(TAG, "rebootRadio RemoteException", ex);
throw ex.rethrowAsRuntimeException();
@@ -10335,9 +10327,6 @@ public class TelephonyManager {
* This API will result in allowing an intersection of allowed network types for all reasons,
* including the configuration done through other reasons.
*
- * If device supports satellite service, then
- * {@link #NETWORK_TYPE_NB_IOT_NTN} is added to allowed network types for reason by default.
- *
* @param reason the reason the allowed network type change is taking place
* @param allowedNetworkTypes The bitmask of allowed network type
* @throws IllegalStateException if the Telephony process is not currently available.
@@ -10387,10 +10376,6 @@ public class TelephonyManager {
* <p>Requires permission: android.Manifest.READ_PRIVILEGED_PHONE_STATE or
* that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
*
- * If device supports satellite service, then
- * {@link #NETWORK_TYPE_NB_IOT_NTN} is added to allowed network types for reason by
- * default.
- *
* @param reason the reason the allowed network type change is taking place
* @return the allowed network type bitmask
* @throws IllegalStateException if the Telephony process is not currently available.
@@ -10457,7 +10442,7 @@ public class TelephonyManager {
*/
public static String convertNetworkTypeBitmaskToString(
@NetworkTypeBitMask long networkTypeBitmask) {
- String networkTypeName = IntStream.rangeClosed(NETWORK_TYPE_GPRS, NETWORK_TYPE_NB_IOT_NTN)
+ String networkTypeName = IntStream.rangeClosed(NETWORK_TYPE_GPRS, NETWORK_TYPE_NR)
.filter(x -> {
return (networkTypeBitmask & getBitMaskForNetworkType(x))
== getBitMaskForNetworkType(x);
@@ -14051,6 +14036,7 @@ public class TelephonyManager {
* @hide
*/
@SystemApi
+ @Deprecated
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_CARRIERLOCK)
public int setAllowedCarriers(int slotIndex, List<CarrierIdentifier> carriers) {
@@ -15138,8 +15124,7 @@ public class TelephonyManager {
NETWORK_TYPE_BITMASK_LTE_CA,
NETWORK_TYPE_BITMASK_NR,
NETWORK_TYPE_BITMASK_IWLAN,
- NETWORK_TYPE_BITMASK_IDEN,
- NETWORK_TYPE_BITMASK_NB_IOT_NTN
+ NETWORK_TYPE_BITMASK_IDEN
})
public @interface NetworkTypeBitMask {}
@@ -15246,12 +15231,6 @@ public class TelephonyManager {
*/
public static final long NETWORK_TYPE_BITMASK_IWLAN = (1 << (NETWORK_TYPE_IWLAN -1));
- /**
- * network type bitmask indicating the support of readio tech NB IOT NTN.
- */
- @FlaggedApi(Flags.FLAG_SATELLITE_SYSTEM_APIS)
- public static final long NETWORK_TYPE_BITMASK_NB_IOT_NTN = (1 << (NETWORK_TYPE_NB_IOT_NTN - 1));
-
/** @hide */
public static final long NETWORK_CLASS_BITMASK_2G = NETWORK_TYPE_BITMASK_GSM
| NETWORK_TYPE_BITMASK_GPRS
@@ -15280,9 +15259,6 @@ public class TelephonyManager {
public static final long NETWORK_CLASS_BITMASK_5G = NETWORK_TYPE_BITMASK_NR;
/** @hide */
- public static final long NETWORK_CLASS_BITMASK_NTN = NETWORK_TYPE_BITMASK_NB_IOT_NTN;
-
- /** @hide */
public static final long NETWORK_STANDARDS_FAMILY_BITMASK_3GPP = NETWORK_TYPE_BITMASK_GSM
| NETWORK_TYPE_BITMASK_GPRS
| NETWORK_TYPE_BITMASK_EDGE
@@ -15294,8 +15270,7 @@ public class TelephonyManager {
| NETWORK_TYPE_BITMASK_TD_SCDMA
| NETWORK_TYPE_BITMASK_LTE
| NETWORK_TYPE_BITMASK_LTE_CA
- | NETWORK_TYPE_BITMASK_NR
- | NETWORK_TYPE_BITMASK_NB_IOT_NTN;
+ | NETWORK_TYPE_BITMASK_NR;
/** @hide
* @deprecated Legacy CDMA is unsupported.
@@ -18336,7 +18311,7 @@ public class TelephonyManager {
*/
public static boolean isNetworkTypeValid(@NetworkType int networkType) {
return networkType >= TelephonyManager.NETWORK_TYPE_UNKNOWN &&
- networkType <= TelephonyManager.NETWORK_TYPE_NB_IOT_NTN;
+ networkType <= TelephonyManager.NETWORK_TYPE_NR;
}
/**
diff --git a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
index eaeed2a0a9fa..b1a5b1bebc59 100644
--- a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
+++ b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
@@ -17,6 +17,7 @@
package android.telephony.satellite.stub;
import android.annotation.NonNull;
+import android.hardware.radio.network.IRadioNetwork;
import android.os.IBinder;
import android.os.RemoteException;
import android.telephony.IBooleanConsumer;
@@ -586,7 +587,11 @@ public class SatelliteImplBase extends SatelliteService {
* SatelliteResult:SATELLITE_RESULT_NO_RESOURCES
* SatelliteResult:SATELLITE_RESULT_RADIO_NOT_AVAILABLE
* SatelliteResult:SATELLITE_RESULT_REQUEST_NOT_SUPPORTED
+ *
+ * @deprecated Use
+ * {@link IRadioNetwork#setSatellitePlmn(int, int, String[], String[])}.
*/
+ @Deprecated
public void setSatellitePlmn(@NonNull int simLogicalSlotIndex,
@NonNull List<String> carrierPlmnList, @NonNull List<String> allSatellitePlmnList,
@NonNull IIntegerConsumer resultCallback) {
@@ -608,7 +613,11 @@ public class SatelliteImplBase extends SatelliteService {
* SatelliteResult:SATELLITE_RESULT_MODEM_ERROR
* SatelliteResult:SATELLITE_RESULT_RADIO_NOT_AVAILABLE
* SatelliteResult:SATELLITE_RESULT_REQUEST_NOT_SUPPORTED
+ *
+ * @deprecated Use
+ * {@link IRadioNetwork#setSatelliteEnabledForCarrier(int, int, boolean)}.
*/
+ @Deprecated
public void setSatelliteEnabledForCarrier(@NonNull int simLogicalSlotIndex,
@NonNull boolean satelliteEnabled, @NonNull IIntegerConsumer callback) {
// stub implementation
@@ -629,7 +638,11 @@ public class SatelliteImplBase extends SatelliteService {
* SatelliteResult:SATELLITE_RESULT_MODEM_ERROR
* SatelliteResult:SATELLITE_RESULT_RADIO_NOT_AVAILABLE
* SatelliteResult:SATELLITE_RESULT_REQUEST_NOT_SUPPORTED
+ *
+ * @deprecated Use
+ * {@link IRadioNetwork#isSatelliteEnabledForCarrier(int, int)}.
*/
+ @Deprecated
public void requestIsSatelliteEnabledForCarrier(@NonNull int simLogicalSlotIndex,
@NonNull IIntegerConsumer resultCallback, @NonNull IBooleanConsumer callback) {
// stub implementation
diff --git a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
index 038c6d7754b5..43844f6514e8 100644
--- a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
+++ b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
@@ -541,8 +541,7 @@ class InputManagerServiceTests {
0
},
"title",
- /* uid = */0,
- /* inputFeatureFlags = */ 0
+ /* uid = */0
)
whenever(windowManagerInternal.getKeyInterceptionInfoFromToken(any())).thenReturn(info)
}