summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp42
-rw-r--r--core/api/current.txt4
-rw-r--r--core/api/system-current.txt1
-rw-r--r--core/api/test-current.txt1
-rw-r--r--core/java/Android.bp39
-rw-r--r--core/java/android/annotation/AnimRes.java37
-rw-r--r--core/java/android/annotation/AnimatorRes.java37
-rw-r--r--core/java/android/annotation/AnyRes.java39
-rw-r--r--core/java/android/annotation/AnyThread.java51
-rw-r--r--core/java/android/annotation/AppIdInt.java36
-rw-r--r--core/java/android/annotation/ArrayRes.java37
-rw-r--r--core/java/android/annotation/AttrRes.java37
-rw-r--r--core/java/android/annotation/BinderThread.java43
-rw-r--r--core/java/android/annotation/BoolRes.java37
-rw-r--r--core/java/android/annotation/BroadcastBehavior.java61
-rw-r--r--core/java/android/annotation/BytesLong.java36
-rw-r--r--core/java/android/annotation/CallSuper.java43
-rw-r--r--core/java/android/annotation/CallbackExecutor.java39
-rw-r--r--core/java/android/annotation/CheckResult.java58
-rw-r--r--core/java/android/annotation/ColorInt.java42
-rw-r--r--core/java/android/annotation/ColorLong.java48
-rw-r--r--core/java/android/annotation/ColorRes.java37
-rw-r--r--core/java/android/annotation/Condemned.java44
-rw-r--r--core/java/android/annotation/CurrentTimeMillisLong.java39
-rw-r--r--core/java/android/annotation/CurrentTimeSecondsLong.java39
-rw-r--r--core/java/android/annotation/DimenRes.java37
-rw-r--r--core/java/android/annotation/Dimension.java50
-rw-r--r--core/java/android/annotation/DisplayContext.java60
-rw-r--r--core/java/android/annotation/DrawableRes.java37
-rw-r--r--core/java/android/annotation/DurationMillisLong.java36
-rw-r--r--core/java/android/annotation/ElapsedRealtimeLong.java41
-rw-r--r--core/java/android/annotation/FloatRange.java55
-rw-r--r--core/java/android/annotation/FontRes.java37
-rw-r--r--core/java/android/annotation/FractionRes.java37
-rw-r--r--core/java/android/annotation/HalfFloat.java48
-rw-r--r--core/java/android/annotation/Hide.java41
-rw-r--r--core/java/android/annotation/IdRes.java37
-rw-r--r--core/java/android/annotation/IntDef.java64
-rw-r--r--core/java/android/annotation/IntRange.java48
-rw-r--r--core/java/android/annotation/IntegerRes.java37
-rw-r--r--core/java/android/annotation/InterpolatorRes.java37
-rw-r--r--core/java/android/annotation/LayoutRes.java37
-rw-r--r--core/java/android/annotation/LongDef.java62
-rw-r--r--core/java/android/annotation/MainThread.java47
-rw-r--r--core/java/android/annotation/MenuRes.java37
-rw-r--r--core/java/android/annotation/NavigationRes.java37
-rw-r--r--core/java/android/annotation/NonNull.java38
-rw-r--r--core/java/android/annotation/NonUiContext.java49
-rw-r--r--core/java/android/annotation/Nullable.java45
-rw-r--r--core/java/android/annotation/OWNERS3
-rw-r--r--core/java/android/annotation/PluralsRes.java37
-rw-r--r--core/java/android/annotation/Px.java42
-rw-r--r--core/java/android/annotation/RawRes.java37
-rw-r--r--core/java/android/annotation/RequiresFeature.java52
-rw-r--r--core/java/android/annotation/RequiresNoPermission.java48
-rw-r--r--core/java/android/annotation/RequiresPermission.java137
-rw-r--r--core/java/android/annotation/SdkConstant.java36
-rw-r--r--core/java/android/annotation/Size.java52
-rw-r--r--core/java/android/annotation/StringDef.java56
-rw-r--r--core/java/android/annotation/StringRes.java37
-rw-r--r--core/java/android/annotation/StyleRes.java37
-rw-r--r--core/java/android/annotation/StyleableRes.java37
-rw-r--r--core/java/android/annotation/SuppressAutoDoc.java39
-rw-r--r--core/java/android/annotation/SuppressLint.java38
-rw-r--r--core/java/android/annotation/SystemApi.java80
-rw-r--r--core/java/android/annotation/SystemService.java42
-rw-r--r--core/java/android/annotation/TargetApi.java36
-rw-r--r--core/java/android/annotation/TestApi.java42
-rw-r--r--core/java/android/annotation/TransitionRes.java37
-rw-r--r--core/java/android/annotation/UiContext.java58
-rw-r--r--core/java/android/annotation/UiThread.java51
-rw-r--r--core/java/android/annotation/UptimeMillisLong.java41
-rw-r--r--core/java/android/annotation/UserHandleAware.java49
-rw-r--r--core/java/android/annotation/UserIdInt.java36
-rw-r--r--core/java/android/annotation/Widget.java37
-rw-r--r--core/java/android/annotation/WorkerThread.java48
-rw-r--r--core/java/android/annotation/XmlRes.java37
-rw-r--r--core/java/android/app/ApplicationPackageManager.java2
-rw-r--r--core/java/android/content/ContentProvider.java37
-rw-r--r--core/java/android/content/ContentResolver.java86
-rw-r--r--core/java/android/content/pm/ApkChecksum.java6
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java59
-rw-r--r--core/java/android/content/pm/Checksum.java21
-rw-r--r--core/java/android/content/pm/PackageManager.java2
-rw-r--r--core/java/android/os/FileUtils.java2
-rw-r--r--core/java/android/os/ParcelFileDescriptor.java58
-rw-r--r--core/java/android/os/VintfObject.java10
-rw-r--r--core/java/com/android/internal/annotations/CompositeRWLock.java47
-rw-r--r--core/java/com/android/internal/annotations/GuardedBy.java58
-rw-r--r--core/java/com/android/internal/annotations/Immutable.java30
-rw-r--r--core/java/com/android/internal/annotations/VisibleForNative.java28
-rw-r--r--core/java/com/android/internal/annotations/VisibleForTesting.java50
-rw-r--r--core/jni/android_media_AudioAttributes.cpp6
-rw-r--r--core/jni/android_os_VintfObject.cpp41
-rw-r--r--core/res/res/values-as/strings.xml6
-rw-r--r--core/res/res/values-bn/strings.xml6
-rw-r--r--core/res/res/values-de/strings.xml6
-rw-r--r--core/res/res/values-gu/strings.xml6
-rw-r--r--core/res/res/values-iw/strings.xml6
-rw-r--r--core/res/res/values-ne/strings.xml2
-rw-r--r--core/res/res/values-or/strings.xml6
-rw-r--r--core/res/res/values-pa/strings.xml6
-rw-r--r--core/res/res/values-te/strings.xml6
-rw-r--r--core/res/res/values-ur/strings.xml6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java17
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java11
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java62
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java14
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java27
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java3
-rw-r--r--packages/SystemUI/Android.bp7
-rw-r--r--packages/SystemUI/AndroidManifest.xml10
-rw-r--r--packages/SystemUI/animation/Android.bp1
-rw-r--r--packages/SystemUI/plugin/Android.bp1
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java12
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml2
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml2
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml28
-rw-r--r--packages/SystemUI/res/drawable/qs_media_button_background.xml1
-rw-r--r--packages/SystemUI/res/layout/media_carousel.xml4
-rw-r--r--packages/SystemUI/res/layout/media_smartspace_recommendations.xml44
-rw-r--r--packages/SystemUI/res/layout/media_view.xml51
-rw-r--r--packages/SystemUI/res/layout/notification_conversation_info.xml1
-rw-r--r--packages/SystemUI/res/layout/priority_onboarding_half_shell.xml166
-rw-r--r--packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml2
-rw-r--r--packages/SystemUI/res/values-af/strings.xml6
-rw-r--r--packages/SystemUI/res/values-am/strings.xml6
-rw-r--r--packages/SystemUI/res/values-as/strings.xml15
-rw-r--r--packages/SystemUI/res/values-az/strings.xml6
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml6
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml6
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml9
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml6
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml6
-rw-r--r--packages/SystemUI/res/values-da/strings.xml6
-rw-r--r--packages/SystemUI/res/values-de/strings.xml9
-rw-r--r--packages/SystemUI/res/values-el/strings.xml6
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml6
-rw-r--r--packages/SystemUI/res/values-es/strings.xml6
-rw-r--r--packages/SystemUI/res/values-et/strings.xml6
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml24
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml8
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml6
-rw-r--r--packages/SystemUI/res/values-is/strings.xml6
-rw-r--r--packages/SystemUI/res/values-it/strings.xml6
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml6
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml6
-rw-r--r--packages/SystemUI/res/values-km/strings.xml6
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml15
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml6
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml6
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml15
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-or/strings.xml15
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml9
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml6
-rw-r--r--packages/SystemUI/res/values-si/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml6
-rw-r--r--packages/SystemUI/res/values-te/strings.xml9
-rw-r--r--packages/SystemUI/res/values-th/strings.xml6
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml24
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml6
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml6
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml6
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml6
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml6
-rw-r--r--packages/SystemUI/res/values/strings.xml26
-rw-r--r--packages/SystemUI/res/values/styles.xml47
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/Prefs.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt15
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java42
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java80
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt291
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java122
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt83
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java17
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java236
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java77
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java5
-rw-r--r--services/Android.bp6
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java11
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java3
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java5
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java5
-rw-r--r--services/api/Android.bp4
-rw-r--r--services/api/current.txt53
-rw-r--r--services/api/lint-baseline.txt4
-rw-r--r--services/api/non-updatable-current.txt71
-rw-r--r--services/api/non-updatable-lint-baseline.txt9
-rw-r--r--services/api/non-updatable-removed.txt1
-rw-r--r--services/core/java/android/content/pm/PackageManagerInternal.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java2
-rw-r--r--services/core/java/com/android/server/app/GameManagerService.java368
-rw-r--r--services/core/java/com/android/server/appop/DiscreteRegistry.java39
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java100
-rw-r--r--services/core/java/com/android/server/pm/ApkChecksums.java16
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java39
-rw-r--r--services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java2
-rw-r--r--services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java15
-rw-r--r--services/core/java/com/android/server/timezonedetector/TimeZoneCanonicalizer.java35
-rw-r--r--services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java3
-rw-r--r--services/net/Android.bp6
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java326
-rw-r--r--services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java38
-rw-r--r--services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneCanonicalizerTest.java54
-rw-r--r--services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java3
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java7
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java136
-rw-r--r--test-mock/Android.bp1
-rw-r--r--tests/UpdatableSystemFontTest/Android.bp14
-rw-r--r--tests/UpdatableSystemFontTest/AndroidManifest.xml30
-rw-r--r--tests/UpdatableSystemFontTest/AndroidTest.xml5
-rw-r--r--tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java315
-rw-r--r--tools/aapt/Android.bp3
-rw-r--r--tools/aapt2/dump/DumpManifest.cpp21
271 files changed, 2111 insertions, 5748 deletions
diff --git a/Android.bp b/Android.bp
index 685c69df6823..acf86a0cfa2d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -67,6 +67,7 @@ filegroup {
name: "framework-non-updatable-sources",
srcs: [
// Java/AIDL sources under frameworks/base
+ ":framework-annotations",
":framework-blobstore-sources",
":framework-core-sources",
":framework-drm-sources",
@@ -388,47 +389,6 @@ platform_compat_config {
}
filegroup {
- name: "framework-annotations",
- srcs: [
- "core/java/android/annotation/AnyThread.java",
- "core/java/android/annotation/AppIdInt.java",
- "core/java/android/annotation/BytesLong.java",
- "core/java/android/annotation/CallbackExecutor.java",
- "core/java/android/annotation/CallSuper.java",
- "core/java/android/annotation/CheckResult.java",
- "core/java/android/annotation/CurrentTimeMillisLong.java",
- "core/java/android/annotation/CurrentTimeSecondsLong.java",
- "core/java/android/annotation/DrawableRes.java",
- "core/java/android/annotation/DurationMillisLong.java",
- "core/java/android/annotation/Hide.java",
- "core/java/android/annotation/IntDef.java",
- "core/java/android/annotation/IntRange.java",
- "core/java/android/annotation/LongDef.java",
- "core/java/android/annotation/MainThread.java",
- "core/java/android/annotation/NonNull.java",
- "core/java/android/annotation/Nullable.java",
- "core/java/android/annotation/RequiresNoPermission.java",
- "core/java/android/annotation/RequiresPermission.java",
- "core/java/android/annotation/SdkConstant.java",
- "core/java/android/annotation/StringDef.java",
- "core/java/android/annotation/SystemApi.java",
- "core/java/android/annotation/SystemService.java",
- "core/java/android/annotation/TestApi.java",
- "core/java/android/annotation/UserIdInt.java",
- "core/java/android/annotation/WorkerThread.java",
- "core/java/com/android/internal/annotations/GuardedBy.java",
- "core/java/com/android/internal/annotations/Immutable.java",
- "core/java/com/android/internal/annotations/VisibleForTesting.java",
- ],
-}
-
-java_library {
- name: "framework-annotations-lib",
- srcs: [":framework-annotations"],
- sdk_version: "core_current",
-}
-
-filegroup {
name: "framework-ike-shared-srcs",
visibility: ["//packages/modules/IPsec"],
srcs: [
diff --git a/core/api/current.txt b/core/api/current.txt
index b257f5eea9d7..989ca3427453 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -11920,6 +11920,7 @@ package android.content.pm {
method public int getGwpAsanMode();
method public int getMemtagMode();
method public int getNativeHeapZeroInitialized();
+ method public int getRequestRawExternalStorageAccess();
method public boolean isProfileable();
method public boolean isProfileableByShell();
method public boolean isResourceOverlay();
@@ -11975,6 +11976,9 @@ package android.content.pm {
field public static final int MEMTAG_DEFAULT = -1; // 0xffffffff
field public static final int MEMTAG_OFF = 0; // 0x0
field public static final int MEMTAG_SYNC = 2; // 0x2
+ field public static final int RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT = 0; // 0x0
+ field public static final int RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED = 2; // 0x2
+ field public static final int RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED = 1; // 0x1
field public static final int ZEROINIT_DEFAULT = -1; // 0xffffffff
field public static final int ZEROINIT_DISABLED = 0; // 0x0
field public static final int ZEROINIT_ENABLED = 1; // 0x1
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index c7960dd406ed..990f43de5ec5 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -2520,7 +2520,6 @@ package android.content.om {
package android.content.pm {
public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
- method @Nullable public Boolean hasRequestRawExternalStorageAccess();
method public boolean isEncryptionAware();
method public boolean isInstantApp();
method public boolean isOem();
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 35767b3acb8c..1330234f6521 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1810,6 +1810,7 @@ package android.os {
public class VintfObject {
method public static String[] getHalNamesAndVersions();
+ method @NonNull public static String getPlatformSepolicyVersion();
method public static String getSepolicyVersion();
method public static Long getTargetFrameworkCompatibilityMatrixVersion();
method public static java.util.Map<java.lang.String,java.lang.String[]> getVndkSnapshots();
diff --git a/core/java/Android.bp b/core/java/Android.bp
index c8a8d36a1b20..793d0ef164fa 100644
--- a/core/java/Android.bp
+++ b/core/java/Android.bp
@@ -46,44 +46,6 @@ filegroup {
"android/accounts/AccountsException.java",
"android/accounts/AuthenticatorException.java",
"android/accounts/OperationCanceledException.java",
- "android/annotation/AnimatorRes.java",
- "android/annotation/AnimRes.java",
- "android/annotation/AnyRes.java",
- "android/annotation/ArrayRes.java",
- "android/annotation/AttrRes.java",
- "android/annotation/BoolRes.java",
- "android/annotation/BroadcastBehavior.java",
- "android/annotation/CallbackExecutor.java",
- "android/annotation/CallSuper.java",
- "android/annotation/CheckResult.java",
- "android/annotation/ColorInt.java",
- "android/annotation/ColorRes.java",
- "android/annotation/DimenRes.java",
- "android/annotation/DrawableRes.java",
- "android/annotation/FontRes.java",
- "android/annotation/FractionRes.java",
- "android/annotation/IntDef.java",
- "android/annotation/IntegerRes.java",
- "android/annotation/IntRange.java",
- "android/annotation/LayoutRes.java",
- "android/annotation/NonNull.java",
- "android/annotation/Nullable.java",
- "android/annotation/PluralsRes.java",
- "android/annotation/RawRes.java",
- "android/annotation/RequiresNoPermission.java",
- "android/annotation/RequiresPermission.java",
- "android/annotation/SdkConstant.java",
- "android/annotation/Size.java",
- "android/annotation/StringDef.java",
- "android/annotation/StringRes.java",
- "android/annotation/StyleableRes.java",
- "android/annotation/StyleRes.java",
- "android/annotation/SuppressLint.java",
- "android/annotation/SystemApi.java",
- "android/annotation/SystemService.java",
- "android/annotation/TestApi.java",
- "android/annotation/UserIdInt.java",
- "android/annotation/XmlRes.java",
"android/app/Application.java",
"android/app/IApplicationThread.aidl",
"android/app/IServiceConnection.aidl",
@@ -124,7 +86,6 @@ filegroup {
"android/util/AndroidException.java",
"android/view/DisplayAdjustments.java",
"android/view/ViewDebug.java",
- "com/android/internal/annotations/VisibleForTesting.java",
],
visibility: ["//frameworks/base/test-mock"],
}
diff --git a/core/java/android/annotation/AnimRes.java b/core/java/android/annotation/AnimRes.java
deleted file mode 100644
index 56f8acf82313..000000000000
--- a/core/java/android/annotation/AnimRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be an anim resource reference (e.g. {@link android.R.anim#fade_in}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface AnimRes {
-}
diff --git a/core/java/android/annotation/AnimatorRes.java b/core/java/android/annotation/AnimatorRes.java
deleted file mode 100644
index cd4c189b7531..000000000000
--- a/core/java/android/annotation/AnimatorRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be an animator resource reference (e.g. {@link android.R.animator#fade_in}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface AnimatorRes {
-}
diff --git a/core/java/android/annotation/AnyRes.java b/core/java/android/annotation/AnyRes.java
deleted file mode 100644
index 44411a04a8e7..000000000000
--- a/core/java/android/annotation/AnyRes.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a resource reference of any type. If the specific type is known, use
- * one of the more specific annotations instead, such as {@link StringRes} or
- * {@link DrawableRes}.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface AnyRes {
-}
diff --git a/core/java/android/annotation/AnyThread.java b/core/java/android/annotation/AnyThread.java
deleted file mode 100644
index ee36a42b3fc6..000000000000
--- a/core/java/android/annotation/AnyThread.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2016 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.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated method can be called from any thread (e.g. it is
- * "thread safe".) If the annotated element is a class, then all methods in the
- * class can be called from any thread.
- * <p>
- * The main purpose of this method is to indicate that you believe a method can
- * be called from any thread; static tools can then check that nothing you call
- * from within this method or class have more strict threading requirements.
- * <p>
- * Example:
- *
- * <pre>
- * <code>
- * &#64;AnyThread
- * public void deliverResult(D data) { ... }
- * </code>
- * </pre>
- *
- * @memberDoc This method is safe to call from any thread.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
-public @interface AnyThread {
-}
diff --git a/core/java/android/annotation/AppIdInt.java b/core/java/android/annotation/AppIdInt.java
deleted file mode 100644
index 29838dd5bd7c..000000000000
--- a/core/java/android/annotation/AppIdInt.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2016 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.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated element is a multi-user application ID. This is
- * <em>not</em> the same as a UID.
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface AppIdInt {
-}
diff --git a/core/java/android/annotation/ArrayRes.java b/core/java/android/annotation/ArrayRes.java
deleted file mode 100644
index 1407af1d1422..000000000000
--- a/core/java/android/annotation/ArrayRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be an array resource reference (e.g. {@link android.R.array#phoneTypes}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface ArrayRes {
-}
diff --git a/core/java/android/annotation/AttrRes.java b/core/java/android/annotation/AttrRes.java
deleted file mode 100644
index 285b80ce45ca..000000000000
--- a/core/java/android/annotation/AttrRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be an attribute reference (e.g. {@link android.R.attr#action}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface AttrRes {
-}
diff --git a/core/java/android/annotation/BinderThread.java b/core/java/android/annotation/BinderThread.java
deleted file mode 100644
index ca5e14c2adb9..000000000000
--- a/core/java/android/annotation/BinderThread.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated method should only be called on the binder thread.
- * If the annotated element is a class, then all methods in the class should be called
- * on the binder thread.
- * <p>
- * Example:
- * <pre><code>
- * &#64;BinderThread
- * public BeamShareData createBeamShareData() { ... }
- * </code></pre>
- *
- * {@hide}
- */
-@Retention(SOURCE)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
-public @interface BinderThread {
-} \ No newline at end of file
diff --git a/core/java/android/annotation/BoolRes.java b/core/java/android/annotation/BoolRes.java
deleted file mode 100644
index f50785b1e1cf..000000000000
--- a/core/java/android/annotation/BoolRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a boolean resource reference.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface BoolRes {
-}
diff --git a/core/java/android/annotation/BroadcastBehavior.java b/core/java/android/annotation/BroadcastBehavior.java
deleted file mode 100644
index 70d82cb5151b..000000000000
--- a/core/java/android/annotation/BroadcastBehavior.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import android.content.Intent;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Description of how the annotated broadcast action behaves.
- *
- * @hide
- */
-@Target({ ElementType.FIELD })
-@Retention(RetentionPolicy.SOURCE)
-public @interface BroadcastBehavior {
- /**
- * This broadcast will only be delivered to an explicit target.
- *
- * @see Intent#setPackage(String)
- * @see Intent#setComponent(android.content.ComponentName)
- */
- boolean explicitOnly() default false;
-
- /**
- * This broadcast will only be delivered to registered receivers.
- *
- * @see Intent#FLAG_RECEIVER_REGISTERED_ONLY
- */
- boolean registeredOnly() default false;
-
- /**
- * This broadcast will include all {@code AndroidManifest.xml} receivers
- * regardless of process state.
- *
- * @see Intent#FLAG_RECEIVER_INCLUDE_BACKGROUND
- */
- boolean includeBackground() default false;
-
- /**
- * This broadcast is protected and can only be sent by the OS.
- */
- boolean protectedBroadcast() default false;
-}
diff --git a/core/java/android/annotation/BytesLong.java b/core/java/android/annotation/BytesLong.java
deleted file mode 100644
index f5e1a9c5f7fd..000000000000
--- a/core/java/android/annotation/BytesLong.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * @memberDoc Value is a non-negative number of bytes.
- * @paramDoc Value is a non-negative number of bytes.
- * @returnDoc Value is a non-negative number of bytes.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface BytesLong {
-}
diff --git a/core/java/android/annotation/CallSuper.java b/core/java/android/annotation/CallSuper.java
deleted file mode 100644
index c16b51161cac..000000000000
--- a/core/java/android/annotation/CallSuper.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that any overriding methods should invoke this method as well.
- * <p>
- * Example:
- *
- * <pre>
- * <code>
- * &#64;CallSuper
- * public abstract void onFocusLost();
- * </code>
- * </pre>
- *
- * @memberDoc If you override this method you <em>must</em> call through to the
- * superclass implementation.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD})
-public @interface CallSuper {
-}
diff --git a/core/java/android/annotation/CallbackExecutor.java b/core/java/android/annotation/CallbackExecutor.java
deleted file mode 100644
index 4258f730eb16..000000000000
--- a/core/java/android/annotation/CallbackExecutor.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.util.concurrent.Executor;
-
-/**
- * @paramDoc Callback and listener events are dispatched through this
- * {@link Executor}, providing an easy way to control which thread is
- * used. To dispatch events through the main thread of your
- * application, you can use
- * {@link android.content.Context#getMainExecutor() Context.getMainExecutor()}.
- * To dispatch events through a shared thread pool, you can use
- * {@link android.os.AsyncTask#THREAD_POOL_EXECUTOR AsyncTask#THREAD_POOL_EXECUTOR}.
- * @hide
- */
-@Retention(SOURCE)
-@Target(PARAMETER)
-public @interface CallbackExecutor {
-}
diff --git a/core/java/android/annotation/CheckResult.java b/core/java/android/annotation/CheckResult.java
deleted file mode 100644
index 97d031a760a6..000000000000
--- a/core/java/android/annotation/CheckResult.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated method returns a result that it typically is
- * an error to ignore. This is usually used for methods that have no side effect,
- * so calling it without actually looking at the result usually means the developer
- * has misunderstood what the method does.
- * <p>
- * Example:
- * <pre>{@code
- * public @CheckResult String trim(String s) { return s.trim(); }
- * ...
- * s.trim(); // this is probably an error
- * s = s.trim(); // ok
- * }</pre>
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD})
-public @interface CheckResult {
- /** Defines the name of the suggested method to use instead, if applicable (using
- * the same signature format as javadoc.) If there is more than one possibility,
- * list them all separated by commas.
- * <p>
- * For example, ProcessBuilder has a method named {@code redirectErrorStream()}
- * which sounds like it might redirect the error stream. It does not. It's just
- * a getter which returns whether the process builder will redirect the error stream,
- * and to actually set it, you must call {@code redirectErrorStream(boolean)}.
- * In that case, the method should be defined like this:
- * <pre>
- * &#64;CheckResult(suggest="#redirectErrorStream(boolean)")
- * public boolean redirectErrorStream() { ... }
- * </pre>
- */
- String suggest() default "";
-} \ No newline at end of file
diff --git a/core/java/android/annotation/ColorInt.java b/core/java/android/annotation/ColorInt.java
deleted file mode 100644
index 4671b1b9f887..000000000000
--- a/core/java/android/annotation/ColorInt.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated element represents a packed color
- * int, {@code AARRGGBB}. If applied to an int array, every element
- * in the array represents a color integer.
- * <p>
- * Example:
- * <pre>{@code
- * public abstract void setTextColor(@ColorInt int color);
- * }</pre>
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD})
-public @interface ColorInt {
-} \ No newline at end of file
diff --git a/core/java/android/annotation/ColorLong.java b/core/java/android/annotation/ColorLong.java
deleted file mode 100644
index 9b19c76802c9..000000000000
--- a/core/java/android/annotation/ColorLong.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2016 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * <p>Denotes that the annotated element represents a packed color
- * long. If applied to a long array, every element in the array
- * represents a color long. For more information on how colors
- * are packed in a long, please refer to the documentation of
- * the {@link android.graphics.Color} class.</p>
- *
- * <p>Example:</p>
- *
- * <pre>{@code
- * public void setFillColor(@ColorLong long color);
- * }</pre>
- *
- * @see android.graphics.Color
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD})
-public @interface ColorLong {
-}
diff --git a/core/java/android/annotation/ColorRes.java b/core/java/android/annotation/ColorRes.java
deleted file mode 100644
index 061faa05c738..000000000000
--- a/core/java/android/annotation/ColorRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a color resource reference (e.g. {@link android.R.color#black}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface ColorRes {
-}
diff --git a/core/java/android/annotation/Condemned.java b/core/java/android/annotation/Condemned.java
deleted file mode 100644
index 186409b3e204..000000000000
--- a/core/java/android/annotation/Condemned.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * A program element annotated &#64;Condemned is one that programmers are
- * blocked from using, typically because it's about to be completely destroyed.
- * <p>
- * This is a stronger version of &#64;Deprecated, and it's typically used to
- * mark APIs that only existed temporarily in a preview SDK, and which only
- * continue to exist temporarily to support binary compatibility.
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
-public @interface Condemned {
-}
diff --git a/core/java/android/annotation/CurrentTimeMillisLong.java b/core/java/android/annotation/CurrentTimeMillisLong.java
deleted file mode 100644
index 355bb5a2f960..000000000000
--- a/core/java/android/annotation/CurrentTimeMillisLong.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * @memberDoc Value is a non-negative timestamp measured as the number of
- * milliseconds since 1970-01-01T00:00:00Z.
- * @paramDoc Value is a non-negative timestamp measured as the number of
- * milliseconds since 1970-01-01T00:00:00Z.
- * @returnDoc Value is a non-negative timestamp measured as the number of
- * milliseconds since 1970-01-01T00:00:00Z.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface CurrentTimeMillisLong {
-}
diff --git a/core/java/android/annotation/CurrentTimeSecondsLong.java b/core/java/android/annotation/CurrentTimeSecondsLong.java
deleted file mode 100644
index 2b4ffd77ad34..000000000000
--- a/core/java/android/annotation/CurrentTimeSecondsLong.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * @memberDoc Value is a non-negative timestamp measured as the number of
- * seconds since 1970-01-01T00:00:00Z.
- * @paramDoc Value is a non-negative timestamp measured as the number of
- * seconds since 1970-01-01T00:00:00Z.
- * @returnDoc Value is a non-negative timestamp measured as the number of
- * seconds since 1970-01-01T00:00:00Z.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface CurrentTimeSecondsLong {
-}
diff --git a/core/java/android/annotation/DimenRes.java b/core/java/android/annotation/DimenRes.java
deleted file mode 100644
index 02ae00c6868c..000000000000
--- a/core/java/android/annotation/DimenRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a dimension resource reference (e.g. {@link android.R.dimen#app_icon_size}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface DimenRes {
-}
diff --git a/core/java/android/annotation/Dimension.java b/core/java/android/annotation/Dimension.java
deleted file mode 100644
index 5f705ad52d9b..000000000000
--- a/core/java/android/annotation/Dimension.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2016 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that a numeric parameter, field or method return value is expected
- * to represent a dimension.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
-public @interface Dimension {
- @Unit
- int unit() default PX;
-
- int DP = 0;
- int PX = 1;
- int SP = 2;
-
- @IntDef({PX, DP, SP})
- @Retention(SOURCE)
- @interface Unit {}
-}
diff --git a/core/java/android/annotation/DisplayContext.java b/core/java/android/annotation/DisplayContext.java
deleted file mode 100644
index e6b464ac237a..000000000000
--- a/core/java/android/annotation/DisplayContext.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.app.Activity;
-import android.app.WallpaperManager;
-import android.content.Context;
-import android.os.Bundle;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.WindowManager;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes a {@link Context} that is tied to a {@link Display} and can be used to obtain one
- * via {@link Context#getDisplay}, but <b>may not</b> be able to obtain {@link WindowManager},
- * {@link LayoutInflater} or {@link WallpaperManager} via {@link Context#getSystemService(String)}.
- * If the UI services mentioned above are required, please use contexts which are marked as
- * {@link UiContext}.
- * <p>
- * {@link Activity}, and the result of {@link Context#createWindowContext(int, Bundle)} or
- * {@link Context#createDisplayContext(Display)} can be
- * used where a {@link DisplayContext} is required.
- * <p>
- * This is a marker annotation and has no specific attributes.
- *
- * @see Context#getDisplay()
- * @see Context#getSystemService(String)
- * @see Context#getSystemService(Class)
- * @see Context#createDisplayContext(Display)
- * @see Context#createWindowContext(int, Bundle)
- * @see UiContext
- * @hide
- */
-@Retention(SOURCE)
-@Target({TYPE, METHOD, PARAMETER, FIELD})
-public @interface DisplayContext {
-}
diff --git a/core/java/android/annotation/DrawableRes.java b/core/java/android/annotation/DrawableRes.java
deleted file mode 100644
index ebefa1d78ab1..000000000000
--- a/core/java/android/annotation/DrawableRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a drawable resource reference (e.g. {@link android.R.attr#alertDialogIcon}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface DrawableRes {
-}
diff --git a/core/java/android/annotation/DurationMillisLong.java b/core/java/android/annotation/DurationMillisLong.java
deleted file mode 100644
index ce77532a6c6e..000000000000
--- a/core/java/android/annotation/DurationMillisLong.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * @memberDoc Value is a non-negative duration in milliseconds.
- * @paramDoc Value is a non-negative duration in milliseconds.
- * @returnDoc Value is a non-negative duration in milliseconds.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface DurationMillisLong {
-}
diff --git a/core/java/android/annotation/ElapsedRealtimeLong.java b/core/java/android/annotation/ElapsedRealtimeLong.java
deleted file mode 100644
index f77ff72062a6..000000000000
--- a/core/java/android/annotation/ElapsedRealtimeLong.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.os.SystemClock;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * @memberDoc Value is a non-negative timestamp in the
- * {@link SystemClock#elapsedRealtime()} time base.
- * @paramDoc Value is a non-negative timestamp in the
- * {@link SystemClock#elapsedRealtime()} time base.
- * @returnDoc Value is a non-negative timestamp in the
- * {@link SystemClock#elapsedRealtime()} time base.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface ElapsedRealtimeLong {
-}
diff --git a/core/java/android/annotation/FloatRange.java b/core/java/android/annotation/FloatRange.java
deleted file mode 100644
index 05b51680b1b0..000000000000
--- a/core/java/android/annotation/FloatRange.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated element should be a float or double in the given range
- * <p>
- * Example:
- * <pre><code>
- * &#64;FloatRange(from=0.0,to=1.0)
- * public float getAlpha() {
- * ...
- * }
- * </code></pre>
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE})
-public @interface FloatRange {
- /** Smallest value. Whether it is inclusive or not is determined
- * by {@link #fromInclusive} */
- double from() default Double.NEGATIVE_INFINITY;
- /** Largest value. Whether it is inclusive or not is determined
- * by {@link #toInclusive} */
- double to() default Double.POSITIVE_INFINITY;
-
- /** Whether the from value is included in the range */
- boolean fromInclusive() default true;
-
- /** Whether the to value is included in the range */
- boolean toInclusive() default true;
-} \ No newline at end of file
diff --git a/core/java/android/annotation/FontRes.java b/core/java/android/annotation/FontRes.java
deleted file mode 100644
index dbacb5876dce..000000000000
--- a/core/java/android/annotation/FontRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a Font resource reference (e.g. R.font.myfont).
- *
- * @hide
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface FontRes {
-}
diff --git a/core/java/android/annotation/FractionRes.java b/core/java/android/annotation/FractionRes.java
deleted file mode 100644
index fd84d3e85fdf..000000000000
--- a/core/java/android/annotation/FractionRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a fraction resource reference.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface FractionRes {
-}
diff --git a/core/java/android/annotation/HalfFloat.java b/core/java/android/annotation/HalfFloat.java
deleted file mode 100644
index 256008c5e31f..000000000000
--- a/core/java/android/annotation/HalfFloat.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2016 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * <p>Denotes that the annotated element represents a half-precision floating point
- * value. Such values are stored in short data types and can be manipulated with
- * the {@link android.util.Half} class. If applied to an array of short, every
- * element in the array represents a half-precision float.</p>
- *
- * <p>Example:</p>
- *
- * <pre>{@code
- * public abstract void setPosition(@HalfFloat short x, @HalfFloat short y, @HalfFloat short z);
- * }</pre>
- *
- * @see android.util.Half
- * @see android.util.Half#toHalf(float)
- * @see android.util.Half#toFloat(short)
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({PARAMETER, METHOD, LOCAL_VARIABLE, FIELD})
-public @interface HalfFloat {
-}
diff --git a/core/java/android/annotation/Hide.java b/core/java/android/annotation/Hide.java
deleted file mode 100644
index c8e5a4a97ae7..000000000000
--- a/core/java/android/annotation/Hide.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicates that an API is hidden by default, in a similar fashion to the
- * <pre>@hide</pre> javadoc tag.
- *
- * <p>Note that, in order for this to work, metalava has to be invoked with
- * the flag {@code --hide-annotation android.annotation.Hide}.
- * @hide
- */
-@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE})
-@Retention(RetentionPolicy.CLASS)
-public @interface Hide {
-}
diff --git a/core/java/android/annotation/IdRes.java b/core/java/android/annotation/IdRes.java
deleted file mode 100644
index b286965c99d9..000000000000
--- a/core/java/android/annotation/IdRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be an id resource reference (e.g. {@link android.R.id#copy}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface IdRes {
-}
diff --git a/core/java/android/annotation/IntDef.java b/core/java/android/annotation/IntDef.java
deleted file mode 100644
index f84a67655dc3..000000000000
--- a/core/java/android/annotation/IntDef.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated element of integer type, represents
- * a logical type and that its value should be one of the explicitly
- * named constants. If the {@link #flag()} attribute is set to true,
- * multiple constants can be combined.
- * <p>
- * <pre><code>
- * &#64;Retention(SOURCE)
- * &#64;IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
- * public @interface NavigationMode {}
- * public static final int NAVIGATION_MODE_STANDARD = 0;
- * public static final int NAVIGATION_MODE_LIST = 1;
- * public static final int NAVIGATION_MODE_TABS = 2;
- * ...
- * public abstract void setNavigationMode(@NavigationMode int mode);
- * &#64;NavigationMode
- * public abstract int getNavigationMode();
- * </code></pre>
- * For a flag, set the flag attribute:
- * <pre><code>
- * &#64;IntDef(
- * flag = true,
- * value = {NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
- * </code></pre>
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({ANNOTATION_TYPE})
-public @interface IntDef {
- /** Defines the constant prefix for this element */
- String[] prefix() default {};
- /** Defines the constant suffix for this element */
- String[] suffix() default {};
-
- /** Defines the allowed constants for this element */
- int[] value() default {};
-
- /** Defines whether the constants can be used as a flag, or just as an enum (the default) */
- boolean flag() default false;
-}
diff --git a/core/java/android/annotation/IntRange.java b/core/java/android/annotation/IntRange.java
deleted file mode 100644
index c043e2db6a98..000000000000
--- a/core/java/android/annotation/IntRange.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated element should be an int or long in the given range
- * <p>
- * Example:
- * <pre><code>
- * &#64;IntRange(from=0,to=255)
- * public int getAlpha() {
- * ...
- * }
- * </code></pre>
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
-public @interface IntRange {
- /** Smallest value, inclusive */
- long from() default Long.MIN_VALUE;
- /** Largest value, inclusive */
- long to() default Long.MAX_VALUE;
-} \ No newline at end of file
diff --git a/core/java/android/annotation/IntegerRes.java b/core/java/android/annotation/IntegerRes.java
deleted file mode 100644
index 5313f4adf46e..000000000000
--- a/core/java/android/annotation/IntegerRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be an integer resource reference (e.g. {@link android.R.integer#config_shortAnimTime}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface IntegerRes {
-}
diff --git a/core/java/android/annotation/InterpolatorRes.java b/core/java/android/annotation/InterpolatorRes.java
deleted file mode 100644
index 8877a5f9a4f1..000000000000
--- a/core/java/android/annotation/InterpolatorRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be an interpolator resource reference (e.g. {@link android.R.interpolator#cycle}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface InterpolatorRes {
-}
diff --git a/core/java/android/annotation/LayoutRes.java b/core/java/android/annotation/LayoutRes.java
deleted file mode 100644
index 15ba86f98159..000000000000
--- a/core/java/android/annotation/LayoutRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a layout resource reference (e.g. {@link android.R.layout#list_content}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface LayoutRes {
-}
diff --git a/core/java/android/annotation/LongDef.java b/core/java/android/annotation/LongDef.java
deleted file mode 100644
index 8723eef86328..000000000000
--- a/core/java/android/annotation/LongDef.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated long element represents
- * a logical type and that its value should be one of the explicitly
- * named constants. If the {@link #flag()} attribute is set to true,
- * multiple constants can be combined.
- * <p>
- * <pre><code>
- * &#64;Retention(SOURCE)
- * &#64;LongDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
- * public @interface NavigationMode {}
- * public static final long NAVIGATION_MODE_STANDARD = 0;
- * public static final long NAVIGATION_MODE_LIST = 1;
- * public static final long NAVIGATION_MODE_TABS = 2;
- * ...
- * public abstract void setNavigationMode(@NavigationMode long mode);
- * &#64;NavigationMode
- * public abstract long getNavigationMode();
- * </code></pre>
- * For a flag, set the flag attribute:
- * <pre><code>
- * &#64;LongDef(
- * flag = true,
- * value = {NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
- * </code></pre>
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({ANNOTATION_TYPE})
-public @interface LongDef {
- /** Defines the constant prefix for this element */
- String[] prefix() default "";
-
- /** Defines the allowed constants for this element */
- long[] value() default {};
-
- /** Defines whether the constants can be used as a flag, or just as an enum (the default) */
- boolean flag() default false;
-}
diff --git a/core/java/android/annotation/MainThread.java b/core/java/android/annotation/MainThread.java
deleted file mode 100644
index a070246e5ef3..000000000000
--- a/core/java/android/annotation/MainThread.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated method should only be called on the main thread.
- * If the annotated element is a class, then all methods in the class should be
- * called on the main thread.
- * <p>
- * Example:
- *
- * <pre>
- * <code>
- * &#64;MainThread
- * public void deliverResult(D data) { ... }
- * </code>
- * </pre>
- *
- * @memberDoc This method must be called from the main thread of your app.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
-public @interface MainThread {
-}
diff --git a/core/java/android/annotation/MenuRes.java b/core/java/android/annotation/MenuRes.java
deleted file mode 100644
index b6dcc4604cfb..000000000000
--- a/core/java/android/annotation/MenuRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a menu resource reference.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface MenuRes {
-}
diff --git a/core/java/android/annotation/NavigationRes.java b/core/java/android/annotation/NavigationRes.java
deleted file mode 100644
index 3af5ecff84a6..000000000000
--- a/core/java/android/annotation/NavigationRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a navigation resource reference (e.g. {@code R.navigation.flow}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface NavigationRes {
-}
diff --git a/core/java/android/annotation/NonNull.java b/core/java/android/annotation/NonNull.java
deleted file mode 100644
index 20472bacf6ad..000000000000
--- a/core/java/android/annotation/NonNull.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that a parameter, field or method return value can never be null.
- * <p>
- * This is a marker annotation and it has no specific attributes.
- *
- * @paramDoc This value cannot be {@code null}.
- * @returnDoc This value cannot be {@code null}.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface NonNull {
-}
diff --git a/core/java/android/annotation/NonUiContext.java b/core/java/android/annotation/NonUiContext.java
deleted file mode 100644
index c119ca20ba11..000000000000
--- a/core/java/android/annotation/NonUiContext.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.app.WallpaperManager;
-import android.content.Context;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.WindowManager;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes a {@link Context} that <b>can not</b> be used to obtain a {@link Display} via
- * {@link Context#getDisplay} nor to obtain a {@link WindowManager}, {@link LayoutInflater} or
- * {@link WallpaperManager} via {@link Context#getSystemService(String)}.
- * <p>
- * This is a marker annotation and has no specific attributes.
- *
- * @see Context#getDisplay()
- * @see Context#getSystemService(String)
- * @see Context#getSystemService(Class)
- * @hide
- */
-@Retention(SOURCE)
-@Target({TYPE, METHOD, PARAMETER, FIELD})
-public @interface NonUiContext {
-}
diff --git a/core/java/android/annotation/Nullable.java b/core/java/android/annotation/Nullable.java
deleted file mode 100644
index b8473e750c95..000000000000
--- a/core/java/android/annotation/Nullable.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that a parameter, field or method return value can be null.
- * <p>
- * When decorating a method call parameter, this denotes that the parameter can
- * legitimately be null and the method will gracefully deal with it. Typically
- * used on optional parameters.
- * <p>
- * When decorating a method, this denotes the method might legitimately return
- * null.
- * <p>
- * This is a marker annotation and it has no specific attributes.
- *
- * @paramDoc This value may be {@code null}.
- * @returnDoc This value may be {@code null}.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface Nullable {
-}
diff --git a/core/java/android/annotation/OWNERS b/core/java/android/annotation/OWNERS
deleted file mode 100644
index e1ef54460b56..000000000000
--- a/core/java/android/annotation/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-tnorbye@google.com
-aurimas@google.com
-per-file UnsupportedAppUsage.java = mathewi@google.com, satayev@google.com, andreionea@google.com
diff --git a/core/java/android/annotation/PluralsRes.java b/core/java/android/annotation/PluralsRes.java
deleted file mode 100644
index 31ac729aaa47..000000000000
--- a/core/java/android/annotation/PluralsRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a plurals resource reference.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface PluralsRes {
-}
diff --git a/core/java/android/annotation/Px.java b/core/java/android/annotation/Px.java
deleted file mode 100644
index cec7f80405d3..000000000000
--- a/core/java/android/annotation/Px.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2016 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that a numeric parameter, field or method return value is expected
- * to represent a pixel dimension.
- *
- * @memberDoc This units of this value are pixels.
- * @paramDoc This units of this value are pixels.
- * @returnDoc This units of this value are pixels.
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
-@Dimension(unit = Dimension.PX)
-public @interface Px {
-}
diff --git a/core/java/android/annotation/RawRes.java b/core/java/android/annotation/RawRes.java
deleted file mode 100644
index 39970b36fd95..000000000000
--- a/core/java/android/annotation/RawRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a raw resource reference.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface RawRes {
-}
diff --git a/core/java/android/annotation/RequiresFeature.java b/core/java/android/annotation/RequiresFeature.java
deleted file mode 100644
index 08861d42be39..000000000000
--- a/core/java/android/annotation/RequiresFeature.java
+++ /dev/null
@@ -1,52 +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 android.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.content.pm.PackageManager;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated element requires one or more device features. This
- * is used to auto-generate documentation.
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({TYPE,FIELD,METHOD,CONSTRUCTOR})
-public @interface RequiresFeature {
- /**
- * The name of the device feature that is required.
- */
- String value();
-
- /**
- * Defines the name of the method that should be called to check whether the feature is
- * available, using the same signature format as javadoc. The feature checking method can have
- * multiple parameters, but the feature name parameter must be of type String and must also be
- * the first String-type parameter.
- * <p>
- * By default, the enforcement is {@link PackageManager#hasSystemFeature(String)}.
- */
- String enforcement() default("android.content.pm.PackageManager#hasSystemFeature");
-}
diff --git a/core/java/android/annotation/RequiresNoPermission.java b/core/java/android/annotation/RequiresNoPermission.java
deleted file mode 100644
index cdbf36ec20dd..000000000000
--- a/core/java/android/annotation/RequiresNoPermission.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2021 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.annotation;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated element requires no permissions.
- * <p>
- * This explicit annotation helps distinguish which of three states that an
- * element may exist in:
- * <ul>
- * <li>Annotated with {@link RequiresPermission}, indicating that an element
- * requires (or may require) one or more permissions.
- * <li>Annotated with {@link RequiresNoPermission}, indicating that an element
- * requires no permissions.
- * <li>Neither annotation, indicating that no explicit declaration about
- * permissions has been made for that element.
- * </ul>
- *
- * @see RequiresPermission
- * @hide
- */
-@Retention(CLASS)
-@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER})
-public @interface RequiresNoPermission {
-}
diff --git a/core/java/android/annotation/RequiresPermission.java b/core/java/android/annotation/RequiresPermission.java
deleted file mode 100644
index 0379d303ab92..000000000000
--- a/core/java/android/annotation/RequiresPermission.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated element requires (or may require) one or more permissions.
- * <p/>
- * Example of requiring a single permission:
- * <pre>{@code
- * {@literal @}RequiresPermission(Manifest.permission.SET_WALLPAPER)
- * public abstract void setWallpaper(Bitmap bitmap) throws IOException;
- *
- * {@literal @}RequiresPermission(ACCESS_COARSE_LOCATION)
- * public abstract Location getLastKnownLocation(String provider);
- * }</pre>
- * Example of requiring at least one permission from a set:
- * <pre>{@code
- * {@literal @}RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
- * public abstract Location getLastKnownLocation(String provider);
- * }</pre>
- * Example of requiring multiple permissions:
- * <pre>{@code
- * {@literal @}RequiresPermission(allOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
- * public abstract Location getLastKnownLocation(String provider);
- * }</pre>
- * Example of requiring separate read and write permissions for a content provider:
- * <pre>{@code
- * {@literal @}RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
- * {@literal @}RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
- * public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
- * }</pre>
- * <p>
- * When specified on a parameter, the annotation indicates that the method requires
- * a permission which depends on the value of the parameter. For example, consider
- * {@link android.app.Activity#startActivity(android.content.Intent)
- * Activity#startActivity(Intent)}:
- * <pre>{@code
- * public void startActivity(@RequiresPermission Intent intent) { ... }
- * }</pre>
- * Notice how there are no actual permission names listed in the annotation. The actual
- * permissions required will depend on the particular intent passed in. For example,
- * the code may look like this:
- * <pre>{@code
- * Intent intent = new Intent(Intent.ACTION_CALL);
- * startActivity(intent);
- * }</pre>
- * and the actual permission requirement for this particular intent is described on
- * the Intent name itself:
- * <pre>{@code
- * {@literal @}RequiresPermission(Manifest.permission.CALL_PHONE)
- * public static final String ACTION_CALL = "android.intent.action.CALL";
- * }</pre>
- *
- * @see RequiresNoPermission
- * @hide
- */
-@Retention(CLASS)
-@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER})
-public @interface RequiresPermission {
- /**
- * The name of the permission that is required, if precisely one permission
- * is required. If more than one permission is required, specify either
- * {@link #allOf()} or {@link #anyOf()} instead.
- * <p>
- * If specified, {@link #anyOf()} and {@link #allOf()} must both be null.
- */
- String value() default "";
-
- /**
- * Specifies a list of permission names that are all required.
- * <p>
- * If specified, {@link #anyOf()} and {@link #value()} must both be null.
- */
- String[] allOf() default {};
-
- /**
- * Specifies a list of permission names where at least one is required
- * <p>
- * If specified, {@link #allOf()} and {@link #value()} must both be null.
- */
- String[] anyOf() default {};
-
- /**
- * If true, the permission may not be required in all cases (e.g. it may only be
- * enforced on certain platforms, or for certain call parameters, etc.
- */
- boolean conditional() default false;
-
- /**
- * Specifies that the given permission is required for read operations.
- * <p>
- * When specified on a parameter, the annotation indicates that the method requires
- * a permission which depends on the value of the parameter (and typically
- * the corresponding field passed in will be one of a set of constants which have
- * been annotated with a <code>@RequiresPermission</code> annotation.)
- */
- @Target({FIELD, METHOD, PARAMETER})
- @interface Read {
- RequiresPermission value() default @RequiresPermission;
- }
-
- /**
- * Specifies that the given permission is required for write operations.
- * <p>
- * When specified on a parameter, the annotation indicates that the method requires
- * a permission which depends on the value of the parameter (and typically
- * the corresponding field passed in will be one of a set of constants which have
- * been annotated with a <code>@RequiresPermission</code> annotation.)
- */
- @Target({FIELD, METHOD, PARAMETER})
- @interface Write {
- RequiresPermission value() default @RequiresPermission;
- }
-}
diff --git a/core/java/android/annotation/SdkConstant.java b/core/java/android/annotation/SdkConstant.java
deleted file mode 100644
index 0a5318609847..000000000000
--- a/core/java/android/annotation/SdkConstant.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2008 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.annotation;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Indicates a constant field value should be exported to be used in the SDK tools.
- * @hide
- */
-@Target({ ElementType.FIELD })
-@Retention(RetentionPolicy.SOURCE)
-public @interface SdkConstant {
- public static enum SdkConstantType {
- ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE;
- }
-
- SdkConstantType value();
-}
diff --git a/core/java/android/annotation/Size.java b/core/java/android/annotation/Size.java
deleted file mode 100644
index 7c3e70f658e9..000000000000
--- a/core/java/android/annotation/Size.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated element should have a given size or length.
- * Note that "-1" means "unset". Typically used with a parameter or
- * return value of type array or collection.
- * <p>
- * Example:
- * <pre>{@code
- * public void getLocationInWindow(@Size(2) int[] location) {
- * ...
- * }
- * }</pre>
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({PARAMETER,LOCAL_VARIABLE,METHOD,FIELD})
-public @interface Size {
- /** An exact size (or -1 if not specified) */
- long value() default -1;
- /** A minimum size, inclusive */
- long min() default Long.MIN_VALUE;
- /** A maximum size, inclusive */
- long max() default Long.MAX_VALUE;
- /** The size must be a multiple of this factor */
- long multiple() default 1;
-} \ No newline at end of file
diff --git a/core/java/android/annotation/StringDef.java b/core/java/android/annotation/StringDef.java
deleted file mode 100644
index a37535b9c98e..000000000000
--- a/core/java/android/annotation/StringDef.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated String element, represents a logical
- * type and that its value should be one of the explicitly named constants.
- * <p>
- * Example:
- * <pre><code>
- * &#64;Retention(SOURCE)
- * &#64;StringDef({
- * POWER_SERVICE,
- * WINDOW_SERVICE,
- * LAYOUT_INFLATER_SERVICE
- * })
- * public @interface ServiceName {}
- * public static final String POWER_SERVICE = "power";
- * public static final String WINDOW_SERVICE = "window";
- * public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
- * ...
- * public abstract Object getSystemService(@ServiceName String name);
- * </code></pre>
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({ANNOTATION_TYPE})
-public @interface StringDef {
- /** Defines the constant prefix for this element */
- String[] prefix() default {};
- /** Defines the constant suffix for this element */
- String[] suffix() default {};
-
- /** Defines the allowed constants for this element */
- String[] value() default {};
-}
diff --git a/core/java/android/annotation/StringRes.java b/core/java/android/annotation/StringRes.java
deleted file mode 100644
index 190b68a9960b..000000000000
--- a/core/java/android/annotation/StringRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a String resource reference (e.g. {@link android.R.string#ok}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface StringRes {
-}
diff --git a/core/java/android/annotation/StyleRes.java b/core/java/android/annotation/StyleRes.java
deleted file mode 100644
index 4453b8d89153..000000000000
--- a/core/java/android/annotation/StyleRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that a integer parameter, field or method return value is expected
- * to be a style resource reference (e.g. {@link android.R.style#TextAppearance}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface StyleRes {
-}
diff --git a/core/java/android/annotation/StyleableRes.java b/core/java/android/annotation/StyleableRes.java
deleted file mode 100644
index 3c1895e6dce9..000000000000
--- a/core/java/android/annotation/StyleableRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that a integer parameter, field or method return value is expected
- * to be a styleable resource reference (e.g. {@link android.R.styleable#TextView_text}).
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface StyleableRes {
-}
diff --git a/core/java/android/annotation/SuppressAutoDoc.java b/core/java/android/annotation/SuppressAutoDoc.java
deleted file mode 100644
index e34e03bcee29..000000000000
--- a/core/java/android/annotation/SuppressAutoDoc.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that any automatically generated documentation should be suppressed
- * for the annotated method, parameter, or field.
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
-public @interface SuppressAutoDoc {
-}
diff --git a/core/java/android/annotation/SuppressLint.java b/core/java/android/annotation/SuppressLint.java
deleted file mode 100644
index 2d3456b0ea46..000000000000
--- a/core/java/android/annotation/SuppressLint.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2012 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.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/** Indicates that Lint should ignore the specified warnings for the annotated element. */
-@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
-@Retention(RetentionPolicy.CLASS)
-public @interface SuppressLint {
- /**
- * The set of warnings (identified by the lint issue id) that should be
- * ignored by lint. It is not an error to specify an unrecognized name.
- */
- String[] value();
-}
diff --git a/core/java/android/annotation/SystemApi.java b/core/java/android/annotation/SystemApi.java
deleted file mode 100644
index a468439c8e74..000000000000
--- a/core/java/android/annotation/SystemApi.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2014 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.annotation;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicates an API is exposed for use by bundled system applications.
- * <p>
- * These APIs are not guaranteed to remain consistent release-to-release,
- * and are not for use by apps linking against the Android SDK.
- * </p><p>
- * This annotation should only appear on API that is already marked <pre>@hide</pre>.
- * </p>
- *
- * @hide
- */
-@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface SystemApi {
- enum Client {
- /**
- * Specifies that the intended clients of a SystemApi are privileged apps.
- * This is the default value for {@link #client}.
- */
- PRIVILEGED_APPS,
-
- /**
- * Specifies that the intended clients of a SystemApi are used by classes in
- * <pre>BOOTCLASSPATH</pre> in mainline modules. Mainline modules can also expose
- * this type of system APIs too when they're used only by the non-updatable
- * platform code.
- */
- MODULE_LIBRARIES,
-
- /**
- * Specifies that the system API is available only in the system server process.
- * Use this to expose APIs from code loaded by the system server process <em>but</em>
- * not in <pre>BOOTCLASSPATH</pre>.
- */
- SYSTEM_SERVER
- }
-
- /**
- * The intended client of this SystemAPI.
- */
- Client client() default android.annotation.SystemApi.Client.PRIVILEGED_APPS;
-
- /**
- * Container for {@link SystemApi} that allows it to be applied repeatedly to types.
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(TYPE)
- @interface Container {
- SystemApi[] value();
- }
-}
diff --git a/core/java/android/annotation/SystemService.java b/core/java/android/annotation/SystemService.java
deleted file mode 100644
index c05c1bab06d2..000000000000
--- a/core/java/android/annotation/SystemService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Description of a system service available through
- * {@link android.content.Context#getSystemService(Class)}. This is used to auto-generate
- * documentation explaining how to obtain a reference to the service.
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target(TYPE)
-public @interface SystemService {
- /**
- * The string name of the system service that can be passed to
- * {@link android.content.Context#getSystemService(String)}.
- *
- * @see android.content.Context#getSystemServiceName(Class)
- */
- String value();
-}
diff --git a/core/java/android/annotation/TargetApi.java b/core/java/android/annotation/TargetApi.java
deleted file mode 100644
index 975318e4de67..000000000000
--- a/core/java/android/annotation/TargetApi.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2012 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.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/** Indicates that Lint should treat this type as targeting a given API level, no matter what the
- project target is. */
-@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
-@Retention(RetentionPolicy.CLASS)
-public @interface TargetApi {
- /**
- * This sets the target api level for the type..
- */
- int value();
-}
diff --git a/core/java/android/annotation/TestApi.java b/core/java/android/annotation/TestApi.java
deleted file mode 100644
index 0e9ed3751246..000000000000
--- a/core/java/android/annotation/TestApi.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicates an API is exposed for use by CTS.
- * <p>
- * These APIs are not guaranteed to remain consistent release-to-release,
- * and are not for use by apps linking against the Android SDK.
- * </p>
- *
- * @hide
- */
-@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE})
-@Retention(RetentionPolicy.SOURCE)
-public @interface TestApi {
-}
diff --git a/core/java/android/annotation/TransitionRes.java b/core/java/android/annotation/TransitionRes.java
deleted file mode 100644
index 06bac74984a5..000000000000
--- a/core/java/android/annotation/TransitionRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be a transition resource reference.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface TransitionRes {
-}
diff --git a/core/java/android/annotation/UiContext.java b/core/java/android/annotation/UiContext.java
deleted file mode 100644
index 47becc08c2f3..000000000000
--- a/core/java/android/annotation/UiContext.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.app.Activity;
-import android.app.WallpaperManager;
-import android.content.Context;
-import android.os.Bundle;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.WindowManager;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes a {@link Context} that can be used to create UI, meaning that it can provide a
- * {@link Display} via {@link Context#getDisplay} and can be used to obtain a {@link WindowManager},
- * {@link LayoutInflater} or {@link WallpaperManager} via {@link Context#getSystemService(String)}.
- * A {@link Context} which is marked as {@link UiContext} implies that the {@link Context} is also
- * a {@link DisplayContext}.
- * <p>
- * This kind of {@link Context} is usually an {@link Activity} or
- * created via {@link Context#createWindowContext(int, Bundle)}.
- * </p>
- * This is a marker annotation and has no specific attributes.
- *
- * @see Context#getDisplay()
- * @see Context#getSystemService(String)
- * @see Context#getSystemService(Class)
- * @see Context#createWindowContext(int, Bundle)
- * @see DisplayContext
- * @hide
- */
-@Retention(SOURCE)
-@Target({TYPE, METHOD, PARAMETER, FIELD})
-public @interface UiContext {
-}
diff --git a/core/java/android/annotation/UiThread.java b/core/java/android/annotation/UiThread.java
deleted file mode 100644
index 6d7eedc7d2e2..000000000000
--- a/core/java/android/annotation/UiThread.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.os.Looper;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated method or constructor should only be called on the
- * UI thread. If the annotated element is a class, then all methods in the class
- * should be called on the UI thread.
- * <p>
- * Example:
- *
- * <pre>
- * <code>
- * &#64;UiThread
- * public abstract void setText(@NonNull String text) { ... }
- * </code>
- * </pre>
- *
- * @memberDoc This method must be called on the thread that originally created
- * this UI element. This is typically the
- * {@linkplain Looper#getMainLooper() main thread} of your app.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
-public @interface UiThread {
-}
diff --git a/core/java/android/annotation/UptimeMillisLong.java b/core/java/android/annotation/UptimeMillisLong.java
deleted file mode 100644
index 8946eea0249c..000000000000
--- a/core/java/android/annotation/UptimeMillisLong.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.os.SystemClock;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * @memberDoc Value is a non-negative timestamp in the
- * {@link SystemClock#uptimeMillis()} time base.
- * @paramDoc Value is a non-negative timestamp in the
- * {@link SystemClock#uptimeMillis()} time base.
- * @returnDoc Value is a non-negative timestamp in the
- * {@link SystemClock#uptimeMillis()} time base.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface UptimeMillisLong {
-}
diff --git a/core/java/android/annotation/UserHandleAware.java b/core/java/android/annotation/UserHandleAware.java
deleted file mode 100644
index 7d3d20b31b2a..000000000000
--- a/core/java/android/annotation/UserHandleAware.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Indicates an API that uses {@code context.getUser} or {@code context.getUserId}
- * to operate across users (as the user associated with the context)
- * <p>
- * To create a {@link android.content.Context} associated with a different user,
- * use {@link android.content.Context#createContextAsUser} or
- * {@link android.content.Context#createPackageContextAsUser}
- * <p>
- * Example:
- * <pre>{@code
- * {@literal @}UserHandleAware
- * public abstract PackageInfo getPackageInfo({@literal @}NonNull String packageName,
- * {@literal @}PackageInfoFlags int flags) throws NameNotFoundException;
- * }</pre>
- *
- * @memberDoc This method uses {@linkplain android.content.Context#getUser}
- * or {@linkplain android.content.Context#getUserId} to execute across users.
- * @hide
- */
-@Retention(SOURCE)
-@Target({TYPE, METHOD, CONSTRUCTOR, PACKAGE})
-public @interface UserHandleAware {
-}
diff --git a/core/java/android/annotation/UserIdInt.java b/core/java/android/annotation/UserIdInt.java
deleted file mode 100644
index 7b9ce25e3f1a..000000000000
--- a/core/java/android/annotation/UserIdInt.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2016 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.annotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated element is a multi-user user ID. This is
- * <em>not</em> the same as a UID.
- *
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface UserIdInt {
-}
diff --git a/core/java/android/annotation/Widget.java b/core/java/android/annotation/Widget.java
deleted file mode 100644
index 6756cd73c5fe..000000000000
--- a/core/java/android/annotation/Widget.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 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.annotation;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Indicates a class is a widget usable by application developers to create UI.
- * <p>
- * This must be used in cases where:
- * <ul>
- * <li>The widget is not in the package <code>android.widget</code></li>
- * <li>The widget extends <code>android.view.ViewGroup</code></li>
- * </ul>
- * @hide
- */
-@Target({ ElementType.TYPE })
-@Retention(RetentionPolicy.SOURCE)
-public @interface Widget {
-}
diff --git a/core/java/android/annotation/WorkerThread.java b/core/java/android/annotation/WorkerThread.java
deleted file mode 100644
index 8c2a4d381ab1..000000000000
--- a/core/java/android/annotation/WorkerThread.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2015 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.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that the annotated method should only be called on a worker thread.
- * If the annotated element is a class, then all methods in the class should be
- * called on a worker thread.
- * <p>
- * Example:
- *
- * <pre>
- * <code>
- * &#64;WorkerThread
- * protected abstract FilterResults performFiltering(CharSequence constraint);
- * </code>
- * </pre>
- *
- * @memberDoc This method may take several seconds to complete, so it should
- * only be called from a worker thread.
- * @hide
- */
-@Retention(SOURCE)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
-public @interface WorkerThread {
-}
diff --git a/core/java/android/annotation/XmlRes.java b/core/java/android/annotation/XmlRes.java
deleted file mode 100644
index 5fb8a4a47127..000000000000
--- a/core/java/android/annotation/XmlRes.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-/**
- * Denotes that an integer parameter, field or method return value is expected
- * to be an XML resource reference.
- *
- * {@hide}
- */
-@Documented
-@Retention(SOURCE)
-@Target({METHOD, PARAMETER, FIELD})
-public @interface XmlRes {
-}
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index dba62b9d3b63..5a70f925fc02 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -881,7 +881,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public void requestChecksums(@NonNull String packageName, boolean includeSplits,
- @Checksum.Type int required, @NonNull List<Certificate> trustedInstallers,
+ @Checksum.TypeMask int required, @NonNull List<Certificate> trustedInstallers,
@NonNull OnChecksumsReadyListener onChecksumsReadyListener)
throws CertificateEncodingException, NameNotFoundException {
Objects.requireNonNull(packageName);
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index 114ad874d0c4..7e1df1b0e59c 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -1885,9 +1885,9 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
* in {@link android.provider.MediaStore.MediaColumns}.</p>
*
* @param uri The URI whose file is to be opened.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode Access mode for the file. May be "r" for read-only access,
+ * "rw" for read and write access, or "rwt" for read and write access
+ * that truncates any existing file.
*
* @return Returns a new ParcelFileDescriptor which you can use to access
* the file.
@@ -1948,9 +1948,10 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
* in {@link android.provider.MediaStore.MediaColumns}.</p>
*
* @param uri The URI whose file is to be opened.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode Access mode for the file. May be "r" for read-only access,
+ * "w" for write-only access, "rw" for read and write access, or
+ * "rwt" for read and write access that truncates any existing
+ * file.
* @param signal A signal to cancel the operation in progress, or
* {@code null} if none. For example, if you are downloading a
* file from the network to service a "rw" mode request, you
@@ -2010,9 +2011,11 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
* containing at least the columns specified by {@link android.provider.OpenableColumns}.</p>
*
* @param uri The URI whose file is to be opened.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode Access mode for the file. May be "r" for read-only access,
+ * "w" for write-only access (erasing whatever data is currently in
+ * the file), "wa" for write-only access to append to any existing data,
+ * "rw" for read and write access on any existing data, and "rwt" for read
+ * and write access that truncates any existing file.
*
* @return Returns a new AssetFileDescriptor which you can use to access
* the file.
@@ -2065,9 +2068,11 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
* containing at least the columns specified by {@link android.provider.OpenableColumns}.</p>
*
* @param uri The URI whose file is to be opened.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode Access mode for the file. May be "r" for read-only access,
+ * "w" for write-only access (erasing whatever data is currently in
+ * the file), "wa" for write-only access to append to any existing data,
+ * "rw" for read and write access on any existing data, and "rwt" for read
+ * and write access that truncates any existing file.
* @param signal A signal to cancel the operation in progress, or
* {@code null} if none. For example, if you are downloading a
* file from the network to service a "rw" mode request, you
@@ -2098,9 +2103,11 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
* by looking up a column named "_data" at the given URI.
*
* @param uri The URI to be opened.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode The file mode. May be "r" for read-only access,
+ * "w" for write-only access (erasing whatever data is currently in
+ * the file), "wa" for write-only access to append to any existing data,
+ * "rw" for read and write access on any existing data, and "rwt" for read
+ * and write access that truncates any existing file.
*
* @return Returns a new ParcelFileDescriptor that can be used by the
* client to access the file.
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 1132991a57f8..aec39da973f0 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -63,9 +63,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.system.ErrnoException;
import android.system.Int64Ref;
-import android.system.Os;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;
@@ -78,10 +76,8 @@ import com.android.internal.util.MimeIconUtils;
import dalvik.system.CloseGuard;
import java.io.File;
-import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -868,20 +864,6 @@ public abstract class ContentResolver implements ContentInterface {
return wrap((ContentInterface) wrapped);
}
- /**
- * Offer to locally truncate the given file when opened using the write-only
- * mode. This is typically used to preserve legacy compatibility behavior.
- */
- private static void maybeTruncate(FileDescriptor fd, String mode) throws FileNotFoundException {
- if ("w".equals(mode)) {
- try {
- Os.ftruncate(fd, 0);
- } catch (ErrnoException e) {
- throw new FileNotFoundException("Failed to truncate: " + e.getMessage());
- }
- }
- }
-
/** @hide */
@SuppressWarnings("HiddenAbstractMethod")
@UnsupportedAppUsage
@@ -1543,20 +1525,8 @@ public abstract class ContentResolver implements ContentInterface {
}
/**
- * Open a stream on to the content associated with a content URI. If there
- * is no data associated with the URI, FileNotFoundException is thrown.
- *
- * <h5>Accepts the following URI schemes:</h5>
- * <ul>
- * <li>content ({@link #SCHEME_CONTENT})</li>
- * <li>file ({@link #SCHEME_FILE})</li>
- * </ul>
- *
- * <p>See {@link #openAssetFileDescriptor(Uri, String)} for more information
- * on these schemes.
- *
- * <p>This method behaves like {@link FileOutputStream} and automatically
- * truncates any existing contents.
+ * Synonym for {@link #openOutputStream(Uri, String)
+ * openOutputStream(uri, "w")}.
*
* @param uri The desired URI.
* @return an OutputStream or {@code null} if the provider recently crashed.
@@ -1564,16 +1534,7 @@ public abstract class ContentResolver implements ContentInterface {
*/
public final @Nullable OutputStream openOutputStream(@NonNull Uri uri)
throws FileNotFoundException {
- AssetFileDescriptor fd = openAssetFileDescriptor(uri, "w", null);
- if (fd == null) return null;
- try {
- final FileOutputStream res = fd.createOutputStream();
- // Unconditionally truncate to mirror FileOutputStream behavior
- maybeTruncate(res.getFD(), "w");
- return res;
- } catch (IOException e) {
- throw new FileNotFoundException("Unable to create stream");
- }
+ return openOutputStream(uri, "w");
}
/**
@@ -1590,9 +1551,7 @@ public abstract class ContentResolver implements ContentInterface {
* on these schemes.
*
* @param uri The desired URI.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode May be "w", "wa", "rw", or "rwt".
* @return an OutputStream or {@code null} if the provider recently crashed.
* @throws FileNotFoundException if the provided URI could not be opened.
* @see #openAssetFileDescriptor(Uri, String)
@@ -1600,14 +1559,8 @@ public abstract class ContentResolver implements ContentInterface {
public final @Nullable OutputStream openOutputStream(@NonNull Uri uri, @NonNull String mode)
throws FileNotFoundException {
AssetFileDescriptor fd = openAssetFileDescriptor(uri, mode, null);
- if (fd == null) return null;
try {
- final FileOutputStream res = fd.createOutputStream();
- // Preserve legacy behavior by offering to truncate
- if (mTargetSdkVersion < Build.VERSION_CODES.Q) {
- maybeTruncate(res.getFD(), mode);
- }
- return res;
+ return fd != null ? fd.createOutputStream() : null;
} catch (IOException e) {
throw new FileNotFoundException("Unable to create stream");
}
@@ -1654,9 +1607,8 @@ public abstract class ContentResolver implements ContentInterface {
* provider, use {@link ParcelFileDescriptor#closeWithError(String)}.
*
* @param uri The desired URI to open.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode The file mode to use, as per {@link ContentProvider#openFile
+ * ContentProvider.openFile}.
* @return Returns a new ParcelFileDescriptor pointing to the file or {@code null} if the
* provider recently crashed. You own this descriptor and are responsible for closing it
* when done.
@@ -1698,9 +1650,8 @@ public abstract class ContentResolver implements ContentInterface {
* provider, use {@link ParcelFileDescriptor#closeWithError(String)}.
*
* @param uri The desired URI to open.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode The file mode to use, as per {@link ContentProvider#openFile
+ * ContentProvider.openFile}.
* @param cancellationSignal A signal to cancel the operation in progress,
* or null if none. If the operation is canceled, then
* {@link OperationCanceledException} will be thrown.
@@ -1793,9 +1744,8 @@ public abstract class ContentResolver implements ContentInterface {
* from any built-in data conversion that a provider implements.
*
* @param uri The desired URI to open.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode The file mode to use, as per {@link ContentProvider#openAssetFile
+ * ContentProvider.openAssetFile}.
* @return Returns a new ParcelFileDescriptor pointing to the file or {@code null} if the
* provider recently crashed. You own this descriptor and are responsible for closing it
* when done.
@@ -1848,9 +1798,8 @@ public abstract class ContentResolver implements ContentInterface {
* from any built-in data conversion that a provider implements.
*
* @param uri The desired URI to open.
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt". See
- * {@link ParcelFileDescriptor#parseMode} for more details.
+ * @param mode The file mode to use, as per {@link ContentProvider#openAssetFile
+ * ContentProvider.openAssetFile}.
* @param cancellationSignal A signal to cancel the operation in progress, or null if
* none. If the operation is canceled, then
* {@link OperationCanceledException} will be thrown.
@@ -1886,10 +1835,6 @@ public abstract class ContentResolver implements ContentInterface {
} else if (SCHEME_FILE.equals(scheme)) {
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(
new File(uri.getPath()), ParcelFileDescriptor.parseMode(mode));
- // Preserve legacy behavior by offering to truncate
- if (mTargetSdkVersion < Build.VERSION_CODES.Q) {
- maybeTruncate(pfd.getFileDescriptor(), mode);
- }
return new AssetFileDescriptor(pfd, 0, -1);
} else {
if ("r".equals(mode)) {
@@ -1947,11 +1892,6 @@ public abstract class ContentResolver implements ContentInterface {
// ParcelFileDescriptorInner do that when it is closed.
stableProvider = null;
- // Preserve legacy behavior by offering to truncate
- if (mTargetSdkVersion < Build.VERSION_CODES.Q) {
- maybeTruncate(pfd.getFileDescriptor(), mode);
- }
-
return new AssetFileDescriptor(pfd, fd.getStartOffset(),
fd.getDeclaredLength());
diff --git a/core/java/android/content/pm/ApkChecksum.java b/core/java/android/content/pm/ApkChecksum.java
index eca48eca9e4b..d550f411f6f7 100644
--- a/core/java/android/content/pm/ApkChecksum.java
+++ b/core/java/android/content/pm/ApkChecksum.java
@@ -118,7 +118,7 @@ public final class ApkChecksum implements Parcelable {
- // Code below generated by codegen v1.0.15.
+ // Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -235,8 +235,8 @@ public final class ApkChecksum implements Parcelable {
};
@DataClass.Generated(
- time = 1601589269293L,
- codegenVersion = "1.0.15",
+ time = 1619810171079L,
+ codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/content/pm/ApkChecksum.java",
inputSignatures = "private final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.NonNull android.content.pm.Checksum mChecksum\nprivate final @android.annotation.Nullable java.lang.String mInstallerPackageName\nprivate final @android.annotation.Nullable byte[] mInstallerCertificate\npublic @android.content.pm.Checksum.Type int getType()\npublic @android.annotation.NonNull byte[] getValue()\npublic @android.annotation.Nullable byte[] getInstallerCertificateBytes()\npublic @android.annotation.Nullable java.security.cert.Certificate getInstallerCertificate()\nclass ApkChecksum extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genHiddenConstructor=true)")
@Deprecated
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index e302f9e404fb..a3e0473e39cc 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -2141,22 +2141,57 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
}
/**
+ * Use default value for
+ * {@link android.R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess}.
+ */
+ public static final int RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT = 0;
+
+ /**
+ * Raw external storage was requested by this app.
+ */
+ public static final int RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED = 1;
+
+ /**
+ * Raw external storage was not requested by this app.
+ */
+ public static final int RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED = 2;
+
+ /**
+ * These constants need to match the value of
+ * {@link android.R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess}.
+ * in application manifest.
+ * @hide
+ */
+ @IntDef(prefix = {"RAW_EXTERNAL_STORAGE_"}, value = {
+ RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT,
+ RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED,
+ RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface RawExternalStorage {}
+
+ /**
* @return
* <ul>
- * <li>{@code true} if this app requested raw external storage access
- * <li>{@code false} if this app requests to disable raw external storage access.
- * <li>{@code null} if the app didn't specify
+ * <li>{@link ApplicationInfo#RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT} if app didn't specify
* {@link android.R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess}
- * in its manifest file.
- * </ul>
- *
- * @hide
+ * attribute in the manifest.
+ * <li>{@link ApplicationInfo#RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED} if this app requested raw
+ * external storage access.
+ * <li>{@link ApplicationInfo#RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED} if this app requests to
+ * disable raw external storage access
+ * </ul
+ * <p>
+ * Note that this doesn't give any hints on whether the app gets raw external storage access or
+ * not. Also, apps may get raw external storage access by default in some cases, see
+ * {@link android.R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess}.
*/
- @SuppressWarnings("AutoBoxing")
- @SystemApi
- @Nullable
- public Boolean hasRequestRawExternalStorageAccess() {
- return requestRawExternalStorageAccess;
+ public @RawExternalStorage int getRequestRawExternalStorageAccess() {
+ if (requestRawExternalStorageAccess == null) {
+ return RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT;
+ }
+ return requestRawExternalStorageAccess ? RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED
+ : RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED;
}
/**
diff --git a/core/java/android/content/pm/Checksum.java b/core/java/android/content/pm/Checksum.java
index 4f4898af278b..ff17496c7457 100644
--- a/core/java/android/content/pm/Checksum.java
+++ b/core/java/android/content/pm/Checksum.java
@@ -113,7 +113,7 @@ public final class Checksum implements Parcelable {
public static final int TYPE_PARTIAL_MERKLE_ROOT_1M_SHA512 = 0x00000040;
/** @hide */
- @IntDef(flag = true, prefix = {"TYPE_"}, value = {
+ @IntDef(prefix = {"TYPE_"}, value = {
TYPE_WHOLE_MERKLE_ROOT_4K_SHA256,
TYPE_WHOLE_MD5,
TYPE_WHOLE_SHA1,
@@ -125,6 +125,19 @@ public final class Checksum implements Parcelable {
@Retention(RetentionPolicy.SOURCE)
public @interface Type {}
+ /** @hide */
+ @IntDef(flag = true, prefix = {"TYPE_"}, value = {
+ TYPE_WHOLE_MERKLE_ROOT_4K_SHA256,
+ TYPE_WHOLE_MD5,
+ TYPE_WHOLE_SHA1,
+ TYPE_WHOLE_SHA256,
+ TYPE_WHOLE_SHA512,
+ TYPE_PARTIAL_MERKLE_ROOT_1M_SHA256,
+ TYPE_PARTIAL_MERKLE_ROOT_1M_SHA512,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface TypeMask {}
+
/**
* Serialize checksum to the stream in binary format.
* @hide
@@ -163,7 +176,7 @@ public final class Checksum implements Parcelable {
- // Code below generated by codegen v1.0.22.
+ // Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -263,8 +276,8 @@ public final class Checksum implements Parcelable {
};
@DataClass.Generated(
- time = 1611601571576L,
- codegenVersion = "1.0.22",
+ time = 1619810358402L,
+ codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/content/pm/Checksum.java",
inputSignatures = "public static final int TYPE_WHOLE_MERKLE_ROOT_4K_SHA256\npublic static final @java.lang.Deprecated int TYPE_WHOLE_MD5\npublic static final @java.lang.Deprecated int TYPE_WHOLE_SHA1\npublic static final @java.lang.Deprecated int TYPE_WHOLE_SHA256\npublic static final @java.lang.Deprecated int TYPE_WHOLE_SHA512\npublic static final int TYPE_PARTIAL_MERKLE_ROOT_1M_SHA256\npublic static final int TYPE_PARTIAL_MERKLE_ROOT_1M_SHA512\nprivate final @android.content.pm.Checksum.Type int mType\nprivate final @android.annotation.NonNull byte[] mValue\npublic static void writeToStream(java.io.DataOutputStream,android.content.pm.Checksum)\npublic static @android.annotation.NonNull android.content.pm.Checksum readFromStream(java.io.DataInputStream)\nclass Checksum extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstDefs=false)")
@Deprecated
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 07d8478da553..a1d419e82174 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -8711,7 +8711,7 @@ public abstract class PackageManager {
* @throws NameNotFoundException if a package with the given name cannot be found on the system.
*/
public void requestChecksums(@NonNull String packageName, boolean includeSplits,
- @Checksum.Type int required, @NonNull List<Certificate> trustedInstallers,
+ @Checksum.TypeMask int required, @NonNull List<Certificate> trustedInstallers,
@NonNull OnChecksumsReadyListener onChecksumsReadyListener)
throws CertificateEncodingException, NameNotFoundException {
throw new UnsupportedOperationException("requestChecksums not implemented in subclass");
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index a06a8577a56a..f3e0ce9cd19e 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -1470,7 +1470,7 @@ public final class FileUtils {
return MediaStore.getOriginalMediaFormatFileDescriptor(context,
ParcelFileDescriptor.dup(fd));
} catch (Exception e) {
- Log.w(TAG, "Failed to convert to modern format file descriptor", e);
+ Log.d(TAG, "Failed to convert to modern format file descriptor", e);
return null;
}
}
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
index 0c9ad1b17a7e..c0847872a45a 100644
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ b/core/java/android/os/ParcelFileDescriptor.java
@@ -31,7 +31,6 @@ import static android.system.OsConstants.S_ISLNK;
import static android.system.OsConstants.S_ISREG;
import static android.system.OsConstants.S_IWOTH;
-import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
@@ -64,8 +63,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.UncheckedIOException;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.net.DatagramSocket;
import java.net.Socket;
import java.nio.ByteOrder;
@@ -113,20 +110,6 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
private final CloseGuard mGuard = CloseGuard.get();
- /** @hide */
- @IntDef(prefix = {"MODE_"}, value = {
- MODE_WORLD_READABLE,
- MODE_WORLD_WRITEABLE,
- MODE_READ_ONLY,
- MODE_WRITE_ONLY,
- MODE_READ_WRITE,
- MODE_CREATE,
- MODE_TRUNCATE,
- MODE_APPEND,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface Mode { }
-
/**
* For use with {@link #open}: if {@link #MODE_CREATE} has been supplied and
* this file doesn't already exist, then create the file with permissions
@@ -244,8 +227,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
* be opened with the requested mode.
* @see #parseMode(String)
*/
- public static ParcelFileDescriptor open(File file, @Mode int mode)
- throws FileNotFoundException {
+ public static ParcelFileDescriptor open(File file, int mode) throws FileNotFoundException {
final FileDescriptor fd = openInternal(file, mode);
if (fd == null) return null;
@@ -277,7 +259,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
// We can't accept a generic Executor here, since we need to use
// MessageQueue.addOnFileDescriptorEventListener()
@SuppressLint("ExecutorRegistration")
- public static ParcelFileDescriptor open(File file, @Mode int mode, Handler handler,
+ public static ParcelFileDescriptor open(File file, int mode, Handler handler,
final OnCloseListener listener) throws IOException {
if (handler == null) {
throw new IllegalArgumentException("Handler must not be null");
@@ -348,8 +330,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
return pfd;
}
- private static FileDescriptor openInternal(File file, @Mode int mode)
- throws FileNotFoundException {
+ private static FileDescriptor openInternal(File file, int mode) throws FileNotFoundException {
final int flags = FileUtils.translateModePfdToPosix(mode) | ifAtLeastQ(O_CLOEXEC);
int realMode = S_IRWXU | S_IRWXG;
@@ -642,36 +623,15 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
}
/**
- * Converts a string representing a file mode, such as "rw", into a bitmask
- * suitable for use with {@link #open}.
+ * Converts a string representing a file mode, such as "rw", into a bitmask suitable for use
+ * with {@link #open}.
* <p>
- * The argument must define at least one of the following base access modes:
- * <ul>
- * <li>"r" indicates the file should be opened in read-only mode, equivalent
- * to {@link OsConstants#O_RDONLY}.
- * <li>"w" indicates the file should be opened in write-only mode,
- * equivalent to {@link OsConstants#O_WRONLY}.
- * <li>"rw" indicates the file should be opened in read-write mode,
- * equivalent to {@link OsConstants#O_RDWR}.
- * </ul>
- * In addition to a base access mode, the following additional modes may
- * requested:
- * <ul>
- * <li>"a" indicates the file should be opened in append mode, equivalent to
- * {@link OsConstants#O_APPEND}. Before each write, the file offset is
- * positioned at the end of the file.
- * <li>"t" indicates the file should be opened in truncate mode, equivalent
- * to {@link OsConstants#O_TRUNC}. If the file already exists and is a
- * regular file and is opened for writing, it will be truncated to length 0.
- * </ul>
- *
- * @param mode The string representation of the file mode. Can be "r", "w",
- * "wt", "wa", "rw" or "rwt".
+ * @param mode The string representation of the file mode. Can be "r", "w", "wt", "wa", "rw"
+ * or "rwt".
* @return A bitmask representing the given file mode.
- * @throws IllegalArgumentException if the given string does not match a
- * known file mode.
+ * @throws IllegalArgumentException if the given string does not match a known file mode.
*/
- public static @Mode int parseMode(String mode) {
+ public static int parseMode(String mode) {
return FileUtils.translateModePosixToPfd(FileUtils.translateModeStringToPosix(mode));
}
diff --git a/core/java/android/os/VintfObject.java b/core/java/android/os/VintfObject.java
index 7af8f71aa4aa..bf0b655fe574 100644
--- a/core/java/android/os/VintfObject.java
+++ b/core/java/android/os/VintfObject.java
@@ -16,6 +16,7 @@
package android.os;
+import android.annotation.NonNull;
import android.annotation.TestApi;
import android.util.Slog;
@@ -112,6 +113,15 @@ public class VintfObject {
public static native String getSepolicyVersion();
/**
+ * @return the PLATFORM_SEPOLICY_VERSION build flag available in framework
+ * compatibility matrix.
+ *
+ * @hide
+ */
+ @TestApi
+ public static native @NonNull String getPlatformSepolicyVersion();
+
+ /**
* @return a list of VNDK snapshots supported by the framework, as
* specified in framework manifest. For example,
* [("27", ["libjpeg.so", "libbase.so"]),
diff --git a/core/java/com/android/internal/annotations/CompositeRWLock.java b/core/java/com/android/internal/annotations/CompositeRWLock.java
deleted file mode 100644
index b6ddfc4d2cc4..000000000000
--- a/core/java/com/android/internal/annotations/CompositeRWLock.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2021 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.internal.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Specifies a list of locks which are required for read/write operations on a data field.
- *
- * <p>
- * To annotate methods accessing the data field with the annotation {@link CompositeRWLock},
- * use {@link GuardedBy#value} to annotate method w/ write and/or read access to the data field,
- * use {@link GuardedBy#anyOf} to annotate method w/ read only access to the data field.
- * </p>
- *
- * <p>
- * When its {@link #value()} consists of multiple locks:
- * <ul>
- * <li>To write to the protected data, acquire <b>all</b> of the locks
- * in the order of the appearance in the {@link #value}.</li>
- * <li>To read from the protected data, acquire any of the locks in the {@link #value}.</li>
- * </ul>
- * </p>
- */
-@Target({FIELD})
-@Retention(RetentionPolicy.CLASS)
-public @interface CompositeRWLock {
- String[] value() default {};
-}
diff --git a/core/java/com/android/internal/annotations/GuardedBy.java b/core/java/com/android/internal/annotations/GuardedBy.java
deleted file mode 100644
index c05c4abd10e4..000000000000
--- a/core/java/com/android/internal/annotations/GuardedBy.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2012 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.internal.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation type used to mark a method or field that can only be accessed when
- * holding the referenced locks.
- */
-@Target({FIELD, METHOD})
-@Retention(RetentionPolicy.CLASS)
-public @interface GuardedBy {
- /**
- * Specifies a list of locks to be held in order to access the field/method
- * annotated with this; when used in conjunction with the {@link CompositeRWLock}, locks
- * should be acquired in the order of the appearance in the {@link #value} here.
- *
- * <p>
- * If specified, {@link #anyOf()} must be null.
- * </p>
- *
- * @see CompositeRWLock
- */
- String[] value() default {};
-
- /**
- * Specifies a list of locks where at least one of them must be held in order to access
- * the field/method annotated with this; it should be <em>only</em> used in the conjunction
- * with the {@link CompositeRWLock}.
- *
- * <p>
- * If specified, {@link #allOf()} must be null.
- * </p>
- *
- * @see CompositeRWLock
- */
- String[] anyOf() default {};
-}
diff --git a/core/java/com/android/internal/annotations/Immutable.java b/core/java/com/android/internal/annotations/Immutable.java
deleted file mode 100644
index b424275f7a86..000000000000
--- a/core/java/com/android/internal/annotations/Immutable.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2012 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.internal.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation type used to mark a class which is immutable.
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface Immutable {
-}
diff --git a/core/java/com/android/internal/annotations/VisibleForNative.java b/core/java/com/android/internal/annotations/VisibleForNative.java
deleted file mode 100644
index e6a3fc67b7d3..000000000000
--- a/core/java/com/android/internal/annotations/VisibleForNative.java
+++ /dev/null
@@ -1,28 +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.internal.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Denotes that the class, method or field has its visibility relaxed so
- * that native code can access it.
- */
-@Retention(RetentionPolicy.CLASS)
-public @interface VisibleForNative {
-}
diff --git a/core/java/com/android/internal/annotations/VisibleForTesting.java b/core/java/com/android/internal/annotations/VisibleForTesting.java
deleted file mode 100644
index 99512ac68d5d..000000000000
--- a/core/java/com/android/internal/annotations/VisibleForTesting.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2012 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.internal.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Denotes that the class, method or field has its visibility relaxed so
- * that unit tests can access it.
- * <p/>
- * The <code>visibility</code> argument can be used to specific what the original
- * visibility should have been if it had not been made public or package-private for testing.
- * The default is to consider the element private.
- */
-@Retention(RetentionPolicy.CLASS)
-public @interface VisibleForTesting {
- /**
- * Intended visibility if the element had not been made public or package-private for
- * testing.
- */
- enum Visibility {
- /** The element should be considered protected. */
- PROTECTED,
- /** The element should be considered package-private. */
- PACKAGE,
- /** The element should be considered private. */
- PRIVATE
- }
-
- /**
- * Intended visibility if the element had not been made public or package-private for testing.
- * If not specified, one should assume the element originally intended to be private.
- */
- Visibility visibility() default Visibility.PRIVATE;
-}
diff --git a/core/jni/android_media_AudioAttributes.cpp b/core/jni/android_media_AudioAttributes.cpp
index b616ffc111a3..f1ae268f4c16 100644
--- a/core/jni/android_media_AudioAttributes.cpp
+++ b/core/jni/android_media_AudioAttributes.cpp
@@ -171,10 +171,6 @@ jint JNIAudioAttributeHelper::getJavaArray(
/*
* JNI registration.
*/
-static const JNINativeMethod gMethods[] = {
- // n/a
-};
-
int register_android_media_AudioAttributes(JNIEnv *env)
{
jclass audioAttributesClass = FindClassOrDie(env, kClassPathName);
@@ -218,5 +214,5 @@ int register_android_media_AudioAttributes(JNIEnv *env)
env->DeleteLocalRef(audioAttributesClass);
- return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
+ return 0;
}
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index 4bd33a9cbd3b..1baea2aecc3c 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -37,11 +37,13 @@ static jmethodID gLongValueOf;
namespace android {
+using vintf::CompatibilityMatrix;
using vintf::HalManifest;
using vintf::Level;
using vintf::SchemaType;
using vintf::to_string;
using vintf::toXml;
+using vintf::Version;
using vintf::VintfObject;
using vintf::Vndk;
@@ -119,6 +121,28 @@ static jstring android_os_VintfObject_getSepolicyVersion(JNIEnv* env, jclass) {
return env->NewStringUTF(cString.c_str());
}
+static jstring android_os_VintfObject_getPlatformSepolicyVersion(JNIEnv* env, jclass) {
+ std::shared_ptr<const CompatibilityMatrix> matrix =
+ VintfObject::GetFrameworkCompatibilityMatrix();
+ if (matrix == nullptr || matrix->type() != SchemaType::FRAMEWORK) {
+ jniThrowRuntimeException(env, "Cannot get framework compatibility matrix");
+ return nullptr;
+ }
+
+ auto versions = matrix->getSepolicyVersions();
+ if (versions.empty()) {
+ jniThrowRuntimeException(env,
+ "sepolicy_version in framework compatibility matrix is empty");
+ return nullptr;
+ }
+
+ Version latest;
+ for (const auto& range : versions) {
+ latest = std::max(latest, range.maxVer());
+ }
+ return env->NewStringUTF(to_string(latest).c_str());
+}
+
static jobject android_os_VintfObject_getVndkSnapshots(JNIEnv* env, jclass) {
std::shared_ptr<const HalManifest> manifest = VintfObject::GetFrameworkHalManifest();
if (manifest == nullptr || manifest->type() != SchemaType::FRAMEWORK) {
@@ -145,12 +169,17 @@ static jobject android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersi
// ----------------------------------------------------------------------------
static const JNINativeMethod gVintfObjectMethods[] = {
- {"report", "()[Ljava/lang/String;", (void*)android_os_VintfObject_report},
- {"verifyWithoutAvb", "()I", (void*)android_os_VintfObject_verifyWithoutAvb},
- {"getHalNamesAndVersions", "()[Ljava/lang/String;", (void*)android_os_VintfObject_getHalNamesAndVersions},
- {"getSepolicyVersion", "()Ljava/lang/String;", (void*)android_os_VintfObject_getSepolicyVersion},
- {"getVndkSnapshots", "()Ljava/util/Map;", (void*)android_os_VintfObject_getVndkSnapshots},
- {"getTargetFrameworkCompatibilityMatrixVersion", "()Ljava/lang/Long;", (void*)android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersion},
+ {"report", "()[Ljava/lang/String;", (void*)android_os_VintfObject_report},
+ {"verifyWithoutAvb", "()I", (void*)android_os_VintfObject_verifyWithoutAvb},
+ {"getHalNamesAndVersions", "()[Ljava/lang/String;",
+ (void*)android_os_VintfObject_getHalNamesAndVersions},
+ {"getSepolicyVersion", "()Ljava/lang/String;",
+ (void*)android_os_VintfObject_getSepolicyVersion},
+ {"getPlatformSepolicyVersion", "()Ljava/lang/String;",
+ (void*)android_os_VintfObject_getPlatformSepolicyVersion},
+ {"getVndkSnapshots", "()Ljava/util/Map;", (void*)android_os_VintfObject_getVndkSnapshots},
+ {"getTargetFrameworkCompatibilityMatrixVersion", "()Ljava/lang/Long;",
+ (void*)android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersion},
};
const char* const kVintfObjectPathName = "android/os/VintfObject";
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 182fddce11b0..ff07d9b7ad7b 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -2287,8 +2287,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"এপ্লিকেশ্বনৰ ব্ৰেণ্ডৰ প্ৰতিচ্ছবি"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"এক্সেছৰ ছেটিং পৰীক্ষা কৰক"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g>এ আপোনাৰ স্ক্ৰীনখন চাব আৰু পৰিচালনা কৰিব পাৰে। পৰ্যালোচনা কৰিবলৈ টিপক।"</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> অনুবাদ কৰা হ’ল।"</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"বাৰ্তাটো <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>ৰ পৰা <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>লৈ অনুবাদ কৰা হ’ল।"</string>
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index a265821e5b09..a065f19e0b44 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -2287,8 +2287,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"অ্যাপের ব্র্যান্ড ছবি"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"অ্যাক্সেস করার সেটিংস চেক করুন"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> আপনার স্ক্রিন দেখতে ও কন্ট্রোল করতে পারবে। পর্যালোচনা করতে ট্যাপ করুন।"</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> অনুবাদ করা হয়েছে।"</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"মেসেজ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> থেকে <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ভাষাতে অনুবাদ করা হয়েছে।"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 6a33a0a52f53..d277a80fe440 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -2287,8 +2287,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"App-Branding-Hintergrundbild"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"Zugriffseinstellungen prüfen"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kann deinen Bildschirm sehen und steuern. Zum Prüfen tippen."</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"„<xliff:g id="MESSAGE">%1$s</xliff:g>“ wurde übersetzt."</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Nachricht wurde von <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> auf <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> übersetzt."</string>
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 17cff18dcd23..b7ecc0eb4676 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -2287,8 +2287,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ઍપ્લિકેશનની બ્રાંડિંગ છબી"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"ઍક્સેસના સેટિંગ ચેક કરો"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> તમારી સ્ક્રીન જોઈ અને નિયંત્રિત કરી શકે છે. રિવ્યૂ કરવા માટે ટૅપ કરો."</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g>નો અનુવાદ કર્યો."</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>થી <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>માં સંદેશનો અનુવાદ કરવામાં આવ્યો."</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index aecd79bd6527..dd96815dc551 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -2355,8 +2355,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"תדמית המותג של האפליקציה"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"בדיקה של הגדרות הגישה"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"לשירות <xliff:g id="SERVICE_NAME">%s</xliff:g> יש הרשאה להצגת המסך ושליטה בו. אפשר להקיש כדי לבדוק."</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"ההודעה <xliff:g id="MESSAGE">%1$s</xliff:g> תורגמה."</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ההודעה תורגמה מ<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ל<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 3a2a2b569f27..330147d6a131 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -2285,7 +2285,7 @@
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"सेन्सरसम्बन्धी गोपनीयता"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"एप जनाउने आइकन"</string>
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"एपको ब्रान्डिङ फोटो"</string>
- <string name="view_and_control_notification_title" msgid="4300765399209912240">"हेराइ र नियन्त्रणसम्बन्धी सेटिङ जाँच्नुहोस्"</string>
+ <string name="view_and_control_notification_title" msgid="4300765399209912240">"भ्यु र नियन्त्रणसम्बन्धी सेटिङ जाँच्नुहोस्"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> तपाईंको स्क्रिन हेर्न र नियन्त्रण गर्न सक्छ। सेटिङ मिलाउन ट्याप गर्नुहोस्।"</string>
<!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
<skip />
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 5aa16e7e22de..cdd9f52aa322 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -2287,8 +2287,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ଆପ୍ଲିକେସନ୍ ବ୍ରାଣ୍ଡିଂ ଛବି"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"ଆକ୍ସେସ୍ ସେଟିଂସକୁ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ଦେଖିପାରିବ ଏବଂ ନିୟନ୍ତ୍ରଣ କରିପାରିବ। ସମୀକ୍ଷା କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ଅନୁବାଦ କରାଯାଇଛି।"</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ମେସେଜ୍, <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>ରୁ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>କୁ ଅନୁବାଦ କରାଯାଇଛି।"</string>
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 6cc4f1998183..afd9c0c12496 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -2287,8 +2287,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਬ੍ਰਾਂਡ ਵਾਲਾ ਚਿੱਤਰ"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"ਪਹੁੰਚ ਸੈਟਿੰਗਾਂ ਦੀ ਜਾਂਚ ਕਰੋ"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ਸੇਵਾ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਨੂੰ ਦੇਖ ਅਤੇ ਕੰਟਰੋਲ ਕਰ ਸਕਦੀ ਹੈ। ਸਮੀਖਿਆ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ਦਾ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ।"</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ਸੁਨੇਹੇ ਦਾ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ਤੋਂ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ਵਿੱਚ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ।"</string>
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 49ea3638a160..e1998ddf0dfe 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -2287,8 +2287,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"యాప్ బ్రాండింగ్ ఇమేజ్"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"యాక్సెస్ సెట్టింగ్‌లను చెక్ చేయండి"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> మీ స్క్రీన్‌ను చూడవచ్చు, కంట్రోల్ చేయవచ్చు. రివ్యూ చేయడానికి ట్యాప్ చేయండి."</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> అనువదించబడింది."</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"మెసేజ్ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> నుండి <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>‌కు అనువదించబడింది."</string>
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 48208ac677cc..6d99dfb4563c 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -2287,8 +2287,6 @@
<string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ایپلیکیشن کی برانڈنگ تصویر"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"رسائی کی ترتیبات چیک کریں"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"‫<xliff:g id="SERVICE_NAME">%s</xliff:g> آپ کی اسکرین کو دیکھ اور کنٹرول کر سکتی ہیں۔ جائزے کے لیے تھپتھپائیں۔"</string>
- <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) -->
- <skip />
- <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) -->
- <skip />
+ <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> کا ترجمہ کیا گیا۔"</string>
+ <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"پیغام کا ترجمہ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> سے<xliff:g id="TO_LANGUAGE">%2$s</xliff:g> میں کیا گیا۔"</string>
</resources>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
index 1971ca97d426..55dfc12966a9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
@@ -15,6 +15,7 @@
*/
package com.android.wm.shell.bubbles;
+import static android.graphics.Paint.ANTI_ALIAS_FLAG;
import static android.graphics.Paint.DITHER_FLAG;
import static android.graphics.Paint.FILTER_BITMAP_FLAG;
@@ -22,10 +23,10 @@ import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.PathParser;
import android.widget.ImageView;
@@ -75,13 +76,13 @@ public class BadgedImageView extends ImageView {
private BubbleViewProvider mBubble;
private BubblePositioner mPositioner;
+ private boolean mOnLeft;
private DotRenderer mDotRenderer;
private DotRenderer.DrawParams mDrawParams;
- private boolean mOnLeft;
-
private int mDotColor;
+ private Paint mPaint = new Paint(ANTI_ALIAS_FLAG);
private Rect mTempBounds = new Rect();
public BadgedImageView(Context context) {
@@ -305,7 +306,7 @@ public class BadgedImageView extends ImageView {
}
void showBadge() {
- Drawable badge = mBubble.getAppBadge();
+ Bitmap badge = mBubble.getAppBadge();
if (badge == null) {
setImageBitmap(mBubble.getBubbleIcon());
return;
@@ -318,13 +319,13 @@ public class BadgedImageView extends ImageView {
bubbleCanvas.setBitmap(bubble);
final int bubbleSize = bubble.getWidth();
final int badgeSize = (int) (ICON_BADGE_SCALE * bubbleSize);
+ Rect dest = new Rect();
if (mOnLeft) {
- badge.setBounds(0, bubbleSize - badgeSize, badgeSize, bubbleSize);
+ dest.set(0, bubbleSize - badgeSize, badgeSize, bubbleSize);
} else {
- badge.setBounds(bubbleSize - badgeSize, bubbleSize - badgeSize,
- bubbleSize, bubbleSize);
+ dest.set(bubbleSize - badgeSize, bubbleSize - badgeSize, bubbleSize, bubbleSize);
}
- badge.draw(bubbleCanvas);
+ bubbleCanvas.drawBitmap(badge, null /* src */, dest, mPaint);
bubbleCanvas.setBitmap(null);
setImageBitmap(bubble);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index f6e92ef0e8ea..afb40d1ff95c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -104,9 +104,10 @@ public class Bubble implements BubbleViewProvider {
}
private FlyoutMessage mFlyoutMessage;
- private Drawable mBadgeDrawable;
- // Bitmap with no badge, no dot
+ // The developer provided image for the bubble
private Bitmap mBubbleBitmap;
+ // The app badge for the bubble
+ private Bitmap mBadgeBitmap;
private int mDotColor;
private Path mDotPath;
private int mFlags;
@@ -242,8 +243,8 @@ public class Bubble implements BubbleViewProvider {
}
@Override
- public Drawable getAppBadge() {
- return mBadgeDrawable;
+ public Bitmap getAppBadge() {
+ return mBadgeBitmap;
}
@Override
@@ -398,7 +399,7 @@ public class Bubble implements BubbleViewProvider {
mAppName = info.appName;
mFlyoutMessage = info.flyoutMessage;
- mBadgeDrawable = info.badgeDrawable;
+ mBadgeBitmap = info.badgeBitmap;
mBubbleBitmap = info.bubbleBitmap;
mDotColor = info.dotColor;
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 696f705782c0..d8ec6508d77c 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
@@ -395,7 +395,6 @@ public class BubbleExpandedView extends LinearLayout {
mPointerView.setBackground(mCurrentPointer);
}
-
private String getBubbleKey() {
return mBubble != null ? mBubble.getKey() : "null";
}
@@ -519,16 +518,11 @@ public class BubbleExpandedView extends LinearLayout {
+ " bubble=" + getBubbleKey());
}
mIsContentVisible = visibility;
-
- final float alpha = visibility ? 1f : 0f;
-
- mPointerView.setAlpha(alpha);
if (mTaskView != null && !mIsAlphaAnimating) {
- mTaskView.setAlpha(alpha);
+ mTaskView.setAlpha(visibility ? 1f : 0f);
}
}
-
@Nullable
TaskView getTaskView() {
return mTaskView;
@@ -673,26 +667,48 @@ public class BubbleExpandedView extends LinearLayout {
}
/**
- * Set the position that the tip of the triangle should point to.
+ * Sets the position of the pointer.
+ *
+ * When bubbles are showing "vertically" they display along the left / right sides of the
+ * screen with the expanded view beside them.
+ *
+ * If they aren't showing vertically they're positioned along the top of the screen with the
+ * expanded view below them.
+ *
+ * @param bubblePosition the x position of the bubble if showing on top, the y position of
+ * the bubble if showing vertically.
+ * @param onLeft whether the stack was on the left side of the screen when expanded.
*/
- public void setPointerPosition(float x, float y, boolean isLandscape, boolean onLeft) {
+ public void setPointerPosition(float bubblePosition, boolean onLeft) {
// Pointer gets drawn in the padding
- int paddingLeft = (isLandscape && onLeft) ? mPointerHeight : 0;
- int paddingRight = (isLandscape && !onLeft) ? mPointerHeight : 0;
- int paddingTop = isLandscape ? 0 : mExpandedViewPadding;
+ final boolean showVertically = mPositioner.showBubblesVertically();
+ final int paddingLeft = (showVertically && onLeft) ? mPointerHeight : 0;
+ final int paddingRight = (showVertically && !onLeft) ? mPointerHeight : 0;
+ final int paddingTop = showVertically ? 0 : mExpandedViewPadding;
setPadding(paddingLeft, paddingTop, paddingRight, 0);
- if (isLandscape) {
- // TODO: why setY vs setTranslationY ? linearlayout?
- mPointerView.setY(y - (mPointerWidth / 2f));
- mPointerView.setTranslationX(onLeft ? -mPointerHeight : x - mExpandedViewPadding);
- } else {
- mPointerView.setTranslationY(0f);
- mPointerView.setTranslationX(x - mExpandedViewPadding - (mPointerWidth / 2f));
- }
- mCurrentPointer = isLandscape ? onLeft ? mLeftPointer : mRightPointer : mTopPointer;
- updatePointerView();
- mPointerView.setVisibility(VISIBLE);
+ final float expandedViewY = mPositioner.getExpandedViewY();
+ final float bubbleSize = mPositioner.getBubbleBitmapSize();
+ final float bubbleCenter = showVertically
+ ? bubblePosition + (bubbleSize / 2f) - expandedViewY
+ : bubblePosition + (bubbleSize / 2f);
+ // Post because we need the width of the view
+ post(() -> {
+ float pointerY;
+ float pointerX;
+ if (showVertically) {
+ pointerY = bubbleCenter - (mPointerWidth / 2f);
+ pointerX = onLeft ? -mPointerHeight : getWidth() - mPaddingRight;
+ } else {
+ pointerY = 0;
+ pointerX = bubbleCenter - mPaddingLeft - (mPointerWidth / 2f);
+ }
+ mPointerView.setTranslationY(pointerY);
+ mPointerView.setTranslationX(pointerX);
+ mCurrentPointer = showVertically ? onLeft ? mLeftPointer : mRightPointer : mTopPointer;
+ updatePointerView();
+ mPointerView.setVisibility(VISIBLE);
+ });
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
index e64ed6a0836c..b83feeedbf21 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
@@ -101,6 +101,12 @@ public class BubbleIconFactory extends BaseIconFactory {
userBadgedBitmap.getHeight(), userBadgedBitmap.getConfig());
Canvas c = new Canvas(badgeAndRing);
+ Paint ringPaint = new Paint();
+ ringPaint.setStyle(Paint.Style.FILL);
+ ringPaint.setColor(importantConversationColor);
+ ringPaint.setAntiAlias(true);
+ c.drawCircle(c.getWidth() / 2, c.getHeight() / 2, c.getWidth() / 2, ringPaint);
+
final int bitmapTop = (int) ringStrokeWidth;
final int bitmapLeft = (int) ringStrokeWidth;
final int bitmapWidth = c.getWidth() - 2 * (int) ringStrokeWidth;
@@ -110,14 +116,6 @@ public class BubbleIconFactory extends BaseIconFactory {
bitmapHeight, /* filter */ true);
c.drawBitmap(scaledBitmap, bitmapTop, bitmapLeft, /* paint */null);
- Paint ringPaint = new Paint();
- ringPaint.setStyle(Paint.Style.STROKE);
- ringPaint.setColor(importantConversationColor);
- ringPaint.setAntiAlias(true);
- ringPaint.setStrokeWidth(ringStrokeWidth);
- c.drawCircle(c.getWidth() / 2, c.getHeight() / 2, c.getWidth() / 2 - ringStrokeWidth,
- ringPaint);
-
shadowGenerator.recreateIcon(Bitmap.createBitmap(badgeAndRing), c);
return createIconBitmap(badgeAndRing);
} else {
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 51d63cff385a..36908b854842 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
@@ -24,7 +24,6 @@ import android.graphics.Matrix
import android.graphics.Path
import android.graphics.drawable.AdaptiveIconDrawable
import android.graphics.drawable.ColorDrawable
-import android.graphics.drawable.Drawable
import android.graphics.drawable.InsetDrawable
import android.util.PathParser
import android.util.TypedValue
@@ -151,7 +150,7 @@ class BubbleOverflow(
return dotColor
}
- override fun getAppBadge(): Drawable? {
+ override fun getAppBadge(): Bitmap? {
return null
}
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 c4d33877f17d..07d16b57d675 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
@@ -2487,7 +2487,7 @@ public class BubbleStackView extends FrameLayout
// name and icon.
if (show && mBubbleData.hasBubbleInStackWithKey(mExpandedBubble.getKey())) {
final Bubble bubble = mBubbleData.getBubbleInStackWithKey(mExpandedBubble.getKey());
- mManageSettingsIcon.setImageDrawable(bubble.getAppBadge());
+ mManageSettingsIcon.setImageBitmap(bubble.getAppBadge());
mManageSettingsText.setText(getResources().getString(
R.string.bubbles_app_settings, bubble.getAppName()));
}
@@ -2683,7 +2683,7 @@ public class BubbleStackView extends FrameLayout
Log.d(TAG, "updateExpandedView: mIsExpanded=" + mIsExpanded);
}
boolean isOverflowExpanded = mExpandedBubble != null
- && mBubbleOverflow.KEY.equals(mExpandedBubble.getKey());
+ && BubbleOverflow.KEY.equals(mExpandedBubble.getKey());
int[] paddings = mPositioner.getExpandedViewPadding(
mStackAnimationController.isStackOnLeftSide(), isOverflowExpanded);
mExpandedViewContainer.setPadding(paddings[0], 0, paddings[1], 0);
@@ -2695,6 +2695,7 @@ public class BubbleStackView extends FrameLayout
mExpandedViewContainer.setTranslationX(0f);
mExpandedBubble.getExpandedView().updateView(
mExpandedViewContainer.getLocationOnScreen());
+ updatePointerPosition();
}
mStackOnLeftOrWillBe = mStackAnimationController.isStackOnLeftSide();
@@ -2732,27 +2733,7 @@ public class BubbleStackView extends FrameLayout
return;
}
float bubblePosition = mExpandedAnimationController.getBubbleXOrYForOrientation(index);
- float expandedViewY = mPositioner.getExpandedViewY();
- if (mPositioner.showBubblesVertically()) {
- float x = mStackOnLeftOrWillBe
- ? mPositioner.getAvailableRect().left
- : mPositioner.getAvailableRect().right
- - mExpandedViewContainer.getPaddingRight()
- - mPointerHeight;
- float bubbleCenter = bubblePosition - expandedViewY + (mBubbleSize / 2f);
- mExpandedBubble.getExpandedView().setPointerPosition(
- x,
- bubbleCenter,
- true,
- mStackOnLeftOrWillBe);
- } else {
- float bubbleCenter = bubblePosition + (mBubbleSize / 2f);
- mExpandedBubble.getExpandedView().setPointerPosition(
- bubbleCenter,
- expandedViewY,
- false,
- mStackOnLeftOrWillBe);
- }
+ mExpandedBubble.getExpandedView().setPointerPosition(bubblePosition, mStackOnLeftOrWillBe);
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
index fc53ef26dbd9..932f879caef8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
@@ -126,7 +126,7 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask
ShortcutInfo shortcutInfo;
String appName;
Bitmap bubbleBitmap;
- Drawable badgeDrawable;
+ Bitmap badgeBitmap;
int dotColor;
Path dotPath;
Bubble.FlyoutMessage flyoutMessage;
@@ -188,7 +188,7 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask
BitmapInfo badgeBitmapInfo = iconFactory.getBadgeBitmap(badgedIcon,
b.isImportantConversation());
- info.badgeDrawable = badgedIcon;
+ info.badgeBitmap = badgeBitmapInfo.icon;
info.bubbleBitmap = iconFactory.createBadgedIconBitmap(bubbleDrawable,
null /* user */,
true /* shrinkNonAdaptiveIcons */).icon;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java
index da4259c42558..38b3ba9dfda0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java
@@ -18,7 +18,6 @@ package com.android.wm.shell.bubbles;
import android.graphics.Bitmap;
import android.graphics.Path;
-import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.annotation.Nullable;
@@ -48,7 +47,7 @@ public interface BubbleViewProvider {
Bitmap getBubbleIcon();
/** App badge drawable to draw above bubble icon. */
- @Nullable Drawable getAppBadge();
+ @Nullable Bitmap getAppBadge();
/** Path of normalized bubble icon to draw dot on. */
Path getDotPath();
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 8b226c926c99..4f587ebba89c 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -50,13 +50,6 @@ java_library {
srcs: ["src/com/android/systemui/EventLogTags.logtags"],
}
-java_library {
- name: "SystemUI-sensors",
- srcs: [
- "src/com/android/systemui/util/sensors/ThresholdSensor.java",
- ],
-}
-
android_library {
name: "SystemUI-core",
srcs: [
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 173e95954014..d6989753f16e 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -62,11 +62,13 @@
<!-- Networking and telephony -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
- <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
- <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
+ <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"
+ android:usesPermissionFlags="neverForLocation" />
+ <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"
+ android:usesPermissionFlags="neverForLocation" />
+ <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
+ android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp
index ab9ab831157c..1b15d20d2c52 100644
--- a/packages/SystemUI/animation/Android.bp
+++ b/packages/SystemUI/animation/Android.bp
@@ -36,7 +36,6 @@ android_library {
static_libs: [
"PluginCoreLib",
- "SystemUI-sensors",
],
manifest: "AndroidManifest.xml",
diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp
index 9f02fdbf3ec9..cafaaf854eed 100644
--- a/packages/SystemUI/plugin/Android.bp
+++ b/packages/SystemUI/plugin/Android.bp
@@ -34,7 +34,6 @@ java_library {
static_libs: [
"androidx.annotation_annotation",
"PluginCoreLib",
- "SystemUI-sensors",
"SystemUIAnimationLib",
],
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
index b75252b46785..5ac8961aceeb 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
@@ -21,7 +21,6 @@ import android.net.Uri;
import android.view.MotionEvent;
import com.android.systemui.plugins.annotations.ProvidesInterface;
-import com.android.systemui.util.sensors.ThresholdSensor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -118,7 +117,7 @@ public interface FalsingManager {
void cleanup();
/** Call to report a ProximityEvent to the FalsingManager. */
- void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent);
+ void onProximityEvent(ProximityEvent proximityEvent);
/** Adds a {@link FalsingBeliefListener}. */
void addFalsingBeliefListener(FalsingBeliefListener listener);
@@ -141,4 +140,13 @@ public interface FalsingManager {
interface FalsingTapListener {
void onDoubleTapRequired();
}
+
+ /** Passed to {@link FalsingManager#onProximityEvent}. */
+ interface ProximityEvent {
+ /** Returns true when the proximity sensor was covered. */
+ boolean getCovered();
+
+ /** Returns when the proximity sensor was covered in nanoseconds. */
+ long getTimestampNs();
+ }
}
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml
index 1a38585ea78d..ce63082868bb 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml
@@ -40,7 +40,7 @@
android:clipToPadding="false">
<LinearLayout
- android:id="@+id/container"
+ android:id="@+id/pattern_container"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
index 50ffbc802a7d..c64afd307f23 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
@@ -27,7 +27,7 @@
android:orientation="vertical"
>
<LinearLayout
- android:id="@+id/container"
+ android:id="@+id/pin_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
diff --git a/packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml b/packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml
index 0e308d2f5bfb..da581061370b 100644
--- a/packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml
@@ -1,12 +1,24 @@
+<!--
+ Copyright (C) 2021 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:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:width="16dp"
+ android:height="16dp"
+ android:viewportWidth="16.0"
+ android:viewportHeight="16.0">
<path
android:fillColor="#FF000000"
- android:pathData="M20.17,14.84l-3.26,-0.65c-0.33,-0.07 -0.67,0.04 -0.9,0.27l-2.62,2.62c-2.75,-1.49 -5.01,-3.75 -6.5,-6.5l2.62,-2.62c0.24,-0.24 0.34,-0.58 0.27,-0.9L9.13,3.8C9.04,3.34 8.63,3 8.15,3H4C3.44,3 2.97,3.47 3,4.03c0.17,2.91 1.04,5.63 2.43,8.01c1.57,2.69 3.81,4.93 6.5,6.5c2.38,1.39 5.1,2.26 8.01,2.43c0.56,0.03 1.03,-0.44 1.03,-1v-4.15C20.97,15.34 20.64,14.93 20.17,14.84z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M22,3.41L20.59,2L18.5,4.09L16.41,2L15,3.41l2.09,2.09L15,7.59L16.41,9l2.09,-2.08L20.59,9L22,7.59L19.92,5.5L22,3.41z"/>
+ android:pathData="M6.52,11.37c0.46,0.37 0.94,0.7 1.45,0.99c1.59,0.93 3.4,1.51 5.34,1.62C13.69,14 14,13.69 14,13.31v-2.77c0,-0.32 -0.23,-0.59 -0.53,-0.65l-2.17,-0.43c-0.22,-0.05 -0.45,0.03 -0.6,0.18l-1.75,1.75c-0.52,-0.28 -1.01,-0.61 -1.48,-0.97l7.61,-7.61l-0.95,-0.94L1.87,14.13l0.94,0.94L6.52,11.37L6.52,11.37zM5.59,8.55C5.22,8.08 4.89,7.58 4.61,7.05l1.75,-1.75c0.16,-0.16 0.23,-0.39 0.18,-0.6L6.1,2.53C6.04,2.23 5.77,2 5.45,2H2.68C2.31,2 1.99,2.31 2.01,2.69c0.11,1.94 0.69,3.75 1.62,5.34c0.3,0.51 0.64,1.01 1.01,1.47L5.59,8.55L5.59,8.55z"/>
</vector> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_media_button_background.xml b/packages/SystemUI/res/drawable/qs_media_button_background.xml
index 2241abf130e3..ed9bd263a79d 100644
--- a/packages/SystemUI/res/drawable/qs_media_button_background.xml
+++ b/packages/SystemUI/res/drawable/qs_media_button_background.xml
@@ -26,4 +26,5 @@
android:right="16dp"
android:top="8dp"
android:bottom="8dp" />
+ <solid android:color="@android:color/transparent" />
</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/media_carousel.xml b/packages/SystemUI/res/layout/media_carousel.xml
index 95cee66af536..87acfd088939 100644
--- a/packages/SystemUI/res/layout/media_carousel.xml
+++ b/packages/SystemUI/res/layout/media_carousel.xml
@@ -22,7 +22,7 @@
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
- >
+ android:theme="@style/MediaPlayer">
<com.android.systemui.media.MediaScrollView
android:id="@+id/media_carousel_scroller"
android:layout_width="match_parent"
@@ -47,7 +47,7 @@
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginBottom="4dp"
- android:tint="?android:attr/textColorPrimary"
+ android:tint="?android:attr/textColor"
android:forceHasOverlappingRendering="false"
/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml
index 85354266f228..8c54e2c1cec4 100644
--- a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml
+++ b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml
@@ -19,7 +19,6 @@
<com.android.systemui.util.animation.TransitionLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:id="@+id/media_recommendations"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -28,7 +27,8 @@
android:clipChildren="false"
android:clipToPadding="false"
android:forceHasOverlappingRendering="false"
- android:background="@drawable/qs_media_background">
+ android:background="@drawable/qs_media_background"
+ android:theme="@style/MediaPlayer">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/media_vertical_start_guideline"
@@ -49,7 +49,7 @@
android:layout_width="@dimen/qs_aa_media_rec_header_icon_size"
android:layout_height="@dimen/qs_aa_media_rec_header_icon_size"
android:src="@drawable/ic_headset"
- android:tint="?android:attr/colorPrimary" />
+ android:tint="?android:attr/textColor" />
<TextView
android:id="@+id/recommendation_card_text"
@@ -58,7 +58,6 @@
android:singleLine="true"
android:text="@string/controls_media_smartspace_rec_title"
android:fontFamily="google-sans-medium"
- android:textColor="?android:attr/colorPrimary"
android:textDirection="locale"
android:textSize="@dimen/qq_aa_media_rec_header_text_size" />
@@ -68,7 +67,7 @@
android:layout_height="@dimen/qs_aa_media_rec_album_size"
android:adjustViewBounds="true"
android:background="@drawable/bg_smartspace_media_item"
- android:backgroundTint="?androidprv:attr/colorAccentSecondary"
+ style="@style/MediaPlayer.Album"
android:clipToOutline="true"
android:scaleType="centerCrop"/>
@@ -76,7 +75,7 @@
android:id="@+id/media_logo1"
android:layout_width="@dimen/qs_media_icon_size"
android:layout_height="@dimen/qs_media_icon_size"
- android:background="@drawable/qs_media_icon_background" />
+ style="@style/MediaPlayer.AppIcon" />
<ImageView
android:id="@+id/media_cover2"
@@ -84,7 +83,7 @@
android:layout_height="@dimen/qs_aa_media_rec_album_size"
android:adjustViewBounds="true"
android:background="@drawable/bg_smartspace_media_item"
- android:backgroundTint="?androidprv:attr/colorAccentSecondary"
+ style="@style/MediaPlayer.Album"
android:clipToOutline="true"
android:scaleType="centerCrop"/>
@@ -92,7 +91,7 @@
android:id="@+id/media_logo2"
android:layout_width="@dimen/qs_media_icon_size"
android:layout_height="@dimen/qs_media_icon_size"
- android:background="@drawable/qs_media_icon_background" />
+ style="@style/MediaPlayer.AppIcon" />
<ImageView
android:id="@+id/media_cover3"
@@ -100,7 +99,7 @@
android:layout_height="@dimen/qs_aa_media_rec_album_size"
android:adjustViewBounds="true"
android:background="@drawable/bg_smartspace_media_item"
- android:backgroundTint="?androidprv:attr/colorAccentSecondary"
+ style="@style/MediaPlayer.Album"
android:clipToOutline="true"
android:scaleType="centerCrop"/>
@@ -108,7 +107,7 @@
android:id="@+id/media_logo3"
android:layout_width="@dimen/qs_media_icon_size"
android:layout_height="@dimen/qs_media_icon_size"
- android:background="@drawable/qs_media_icon_background" />
+ style="@style/MediaPlayer.AppIcon" />
<ImageView
android:id="@+id/media_cover4"
@@ -116,7 +115,7 @@
android:layout_height="@dimen/qs_aa_media_rec_album_size"
android:adjustViewBounds="true"
android:background="@drawable/bg_smartspace_media_item"
- android:backgroundTint="?androidprv:attr/colorAccentSecondary"
+ style="@style/MediaPlayer.Album"
android:clipToOutline="true"
android:scaleType="centerCrop"/>
@@ -124,7 +123,7 @@
android:id="@+id/media_logo4"
android:layout_width="@dimen/qs_media_icon_size"
android:layout_height="@dimen/qs_media_icon_size"
- android:background="@drawable/qs_media_icon_background" />
+ style="@style/MediaPlayer.AppIcon" />
<ImageView
android:id="@+id/media_cover5"
@@ -132,7 +131,7 @@
android:layout_height="@dimen/qs_aa_media_rec_album_size"
android:adjustViewBounds="true"
android:background="@drawable/bg_smartspace_media_item"
- android:backgroundTint="?androidprv:attr/colorAccentSecondary"
+ style="@style/MediaPlayer.Album"
android:clipToOutline="true"
android:scaleType="centerCrop"/>
@@ -140,7 +139,7 @@
android:id="@+id/media_logo5"
android:layout_width="@dimen/qs_media_icon_size"
android:layout_height="@dimen/qs_media_icon_size"
- android:background="@drawable/qs_media_icon_background" />
+ style="@style/MediaPlayer.AppIcon" />
<ImageView
android:id="@+id/media_cover6"
@@ -148,7 +147,7 @@
android:layout_height="@dimen/qs_aa_media_rec_album_size"
android:adjustViewBounds="true"
android:background="@drawable/bg_smartspace_media_item"
- android:backgroundTint="?androidprv:attr/colorAccentSecondary"
+ style="@style/MediaPlayer.Album"
android:clipToOutline="true"
android:scaleType="centerCrop"/>
@@ -156,7 +155,7 @@
android:id="@+id/media_logo6"
android:layout_width="@dimen/qs_media_icon_size"
android:layout_height="@dimen/qs_media_icon_size"
- android:background="@drawable/qs_media_icon_background" />
+ style="@style/MediaPlayer.AppIcon" />
<!-- Long press menu -->
<TextView
@@ -168,7 +167,6 @@
android:id="@+id/remove_text"
android:fontFamily="@*android:string/config_headlineFontFamily"
android:singleLine="true"
- android:textColor="?android:attr/textColorPrimary"
android:text="@string/controls_media_close_session"
android:gravity="center_horizontal|top"
app:layout_constraintTop_toTopOf="parent"
@@ -193,9 +191,7 @@
android:layout_gravity="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/qs_media_button_background"
- android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/MediaPlayer.OutlineButton"
android:text="@string/controls_media_settings_button" />
</FrameLayout>
@@ -216,9 +212,7 @@
android:layout_gravity="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/qs_media_button_background"
- android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/MediaPlayer.OutlineButton"
android:text="@string/cancel" />
</FrameLayout>
@@ -239,9 +233,7 @@
android:layout_gravity="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/qs_media_button_background"
- android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/MediaPlayer.OutlineButton"
android:text="@string/controls_media_dismiss_button"
/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/media_view.xml b/packages/SystemUI/res/layout/media_view.xml
index cdced5a1be71..e9a24e284601 100644
--- a/packages/SystemUI/res/layout/media_view.xml
+++ b/packages/SystemUI/res/layout/media_view.xml
@@ -18,7 +18,6 @@
<!-- Layout for media controls inside QSPanel carousel -->
<com.android.systemui.util.animation.TransitionLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:id="@+id/qs_media_controls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -26,7 +25,8 @@
android:clipToPadding="false"
android:gravity="center_horizontal|fill_vertical"
android:forceHasOverlappingRendering="false"
- android:background="@drawable/qs_media_background">
+ android:background="@drawable/qs_media_background"
+ android:theme="@style/MediaPlayer">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/center_vertical_guideline"
@@ -55,7 +55,6 @@
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:fontFamily="@*android:string/config_bodyFontFamily"
- android:textColor="?android:attr/textColorPrimary"
android:gravity="start"
android:textSize="12sp" />
@@ -65,7 +64,6 @@
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:fontFamily="@*android:string/config_bodyFontFamily"
- android:textColor="?android:attr/textColorPrimary"
android:gravity="end"
android:textSize="12sp" />
</FrameLayout>
@@ -86,31 +84,31 @@
<ImageButton
android:id="@+id/action0"
- style="@style/MediaPlayer.Button"
+ style="@style/MediaPlayer.Action"
android:layout_width="48dp"
android:layout_height="48dp" />
<ImageButton
android:id="@+id/action1"
- style="@style/MediaPlayer.Button"
+ style="@style/MediaPlayer.Action"
android:layout_width="48dp"
android:layout_height="48dp" />
<ImageButton
android:id="@+id/action2"
- style="@style/MediaPlayer.Button"
+ style="@style/MediaPlayer.Action"
android:layout_width="48dp"
android:layout_height="48dp" />
<ImageButton
android:id="@+id/action3"
- style="@style/MediaPlayer.Button"
+ style="@style/MediaPlayer.Action"
android:layout_width="48dp"
android:layout_height="48dp" />
<ImageButton
android:id="@+id/action4"
- style="@style/MediaPlayer.Button"
+ style="@style/MediaPlayer.Action"
android:layout_width="48dp"
android:layout_height="48dp" />
@@ -120,8 +118,8 @@
android:layout_width="@dimen/qs_media_album_size"
android:layout_height="@dimen/qs_media_album_size"
android:layout_gravity="center_vertical"
+ style="@style/MediaPlayer.Album"
android:background="@drawable/qs_media_art_background"
- android:backgroundTint="?androidprv:attr/colorAccentSecondary"
android:clipToOutline="true" />
<!-- Seamless Output Switcher -->
@@ -138,6 +136,7 @@
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="@dimen/qs_seamless_height"
+ android:theme="@style/MediaPlayer.SolidButton"
android:background="@drawable/qs_media_seamless_background"
android:orientation="horizontal"
android:contentDescription="@string/quick_settings_media_device_label">
@@ -146,7 +145,6 @@
android:layout_width="@dimen/qs_seamless_icon_size"
android:layout_height="@dimen/qs_seamless_icon_size"
android:layout_gravity="center"
- android:tint="?android:attr/colorPrimary"
android:src="@*android:drawable/ic_media_seamless" />
<TextView
android:id="@+id/media_seamless_text"
@@ -157,7 +155,6 @@
android:fontFamily="@*android:string/config_headlineFontFamily"
android:singleLine="true"
android:text="@*android:string/ext_media_seamless_action"
- android:textColor="?android:attr/colorPrimary"
android:textDirection="locale"
android:textSize="12sp" />
</LinearLayout>
@@ -171,7 +168,7 @@
android:layout_marginBottom="@dimen/qs_media_padding"
android:layout_marginStart="@dimen/qs_center_guideline_padding"
android:layout_marginEnd="@dimen/qs_seamless_fallback_margin"
- android:tint="?android:attr/textColorPrimary"
+ android:tint="?android:attr/textColor"
android:src="@drawable/ic_cast_connected"
android:forceHasOverlappingRendering="false" />
@@ -179,17 +176,13 @@
<!-- As per Material Design on Biderectionality, this is forced to LTR in code -->
<SeekBar
android:id="@+id/media_progress_bar"
- style="@android:style/Widget.ProgressBar.Horizontal"
+ style="@style/MediaPlayer.ProgressBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:clickable="true"
android:maxHeight="@dimen/qs_media_enabled_seekbar_height"
android:paddingTop="@dimen/qs_media_enabled_seekbar_vertical_padding"
android:layout_marginTop="-22dp"
android:paddingBottom="0dp"
- android:thumbTint="?android:attr/textColorPrimary"
- android:progressTint="?android:attr/textColorPrimary"
- android:progressBackgroundTint="?android:attr/textColorTertiary"
android:splitTrack="false" />
<!-- Song name -->
@@ -199,7 +192,6 @@
android:layout_height="wrap_content"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:singleLine="true"
- android:textColor="?android:attr/textColorPrimary"
android:textSize="16sp" />
<!-- Artist name -->
@@ -209,16 +201,14 @@
android:layout_height="wrap_content"
android:fontFamily="@*android:string/config_headlineFontFamily"
android:singleLine="true"
- android:textColor="?android:attr/textColorSecondary"
+ style="@style/MediaPlayer.Subtitle"
android:textSize="14sp" />
<com.android.internal.widget.CachingIconView
android:id="@+id/icon"
- android:tint="?android:attr/colorAccent"
+ style="@style/MediaPlayer.AppIcon"
android:layout_width="@dimen/qs_media_icon_size"
- android:layout_height="@dimen/qs_media_icon_size"
- android:background="@drawable/qs_media_icon_background"
- />
+ android:layout_height="@dimen/qs_media_icon_size" />
<!-- Long press menu -->
<TextView
@@ -230,7 +220,6 @@
android:id="@+id/remove_text"
android:fontFamily="@*android:string/config_headlineFontFamily"
android:singleLine="true"
- android:textColor="?android:attr/textColorPrimary"
android:text="@string/controls_media_close_session"
android:gravity="center_horizontal|top"
app:layout_constraintTop_toTopOf="parent"
@@ -255,9 +244,7 @@
android:layout_gravity="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/qs_media_button_background"
- android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/MediaPlayer.OutlineButton"
android:text="@string/controls_media_settings_button" />
</FrameLayout>
@@ -278,9 +265,7 @@
android:layout_gravity="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/qs_media_button_background"
- android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/MediaPlayer.OutlineButton"
android:text="@string/cancel" />
</FrameLayout>
@@ -301,9 +286,7 @@
android:layout_gravity="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/qs_media_button_background"
- android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/MediaPlayer.OutlineButton"
android:text="@string/controls_media_dismiss_button"
/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml
index ea644cfca68a..c332f4cf7a39 100644
--- a/packages/SystemUI/res/layout/notification_conversation_info.xml
+++ b/packages/SystemUI/res/layout/notification_conversation_info.xml
@@ -254,7 +254,6 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/notification_importance_button_description_top_margin"
android:visibility="gone"
- android:text="@string/notification_channel_summary_priority"
android:clickable="false"
android:focusable="false"
android:ellipsize="end"
diff --git a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml b/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml
deleted file mode 100644
index 3f0e514a9af2..000000000000
--- a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml
+++ /dev/null
@@ -1,166 +0,0 @@
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/onboarding_half_shell_container"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|bottom"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- >
-
- <LinearLayout
- android:id="@+id/half_shell"
- android:layout_width="@dimen/qs_panel_width"
- android:layout_height="wrap_content"
- android:paddingTop="16dp"
- android:paddingStart="16dp"
- android:paddingEnd="16dp"
- android:orientation="vertical"
- android:gravity="bottom"
- android:layout_gravity="center_horizontal|bottom"
- android:background="@drawable/rounded_bg_full"
- >
-
- <FrameLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:padding="12dp"
- android:layout_gravity="center_horizontal"
- >
-
- <!-- Big icon: 52x52, 12dp padding left + top, 16dp padding right -->
- <ImageView
- android:id="@+id/conversation_icon"
- android:layout_width="@*android:dimen/conversation_avatar_size"
- android:layout_height="@*android:dimen/conversation_avatar_size"
- android:scaleType="centerCrop"
- android:importantForAccessibility="no"
- />
-
- <FrameLayout
- android:id="@+id/conversation_icon_badge"
- android:layout_width="@*android:dimen/conversation_icon_size_badged"
- android:layout_height="@*android:dimen/conversation_icon_size_badged"
- android:layout_marginLeft="@*android:dimen/conversation_badge_side_margin"
- android:layout_marginTop="@*android:dimen/conversation_badge_side_margin"
- android:clipChildren="false"
- android:clipToPadding="false"
- >
- <ImageView
- android:id="@+id/conversation_icon_badge_bg"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- android:src="@*android:drawable/conversation_badge_background"
- android:forceHasOverlappingRendering="false"
- />
- <ImageView
- android:id="@+id/icon"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="4dp"
- android:layout_gravity="center"
- android:forceHasOverlappingRendering="false"
- />
- <ImageView
- android:id="@+id/conversation_icon_badge_ring"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:src="@*android:drawable/conversation_badge_ring"
- android:forceHasOverlappingRendering="false"
- android:clipToPadding="false"
- android:scaleType="center"
- />
- </FrameLayout>
- </FrameLayout>
-
- <TextView
- android:id="@+id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_marginTop="16dp"
- android:text="@string/priority_onboarding_title"
- style="@style/TextAppearance.NotificationImportanceChannel"
- />
-
- <View
- android:id="@+id/divider"
- android:layout_width="match_parent"
- android:layout_height="0.5dp"
- android:layout_marginTop="20dp"
- android:layout_marginBottom="20dp"
- android:background="@color/material_grey_300" />
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="start"
- android:text="@string/priority_onboarding_behavior"
- style="@style/TextAppearance.NotificationImportanceChannelGroup"
- />
-
- <TextView
- android:id="@+id/behaviors"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="start"
- android:layout_marginTop="8dp"
- style="@style/TextAppearance.NotificationImportanceChannelGroup"
- />
-
- <!-- Bottom button container -->
- <RelativeLayout
- android:id="@+id/button_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="32dp"
- android:orientation="horizontal"
- >
- <TextView
- android:id="@+id/settings_button"
- android:text="@string/priority_onboarding_settings_button_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentStart="true"
- android:gravity="start|center_vertical"
- android:minWidth="@dimen/notification_importance_toggle_size"
- android:minHeight="@dimen/notification_importance_toggle_size"
- android:maxWidth="125dp"
- style="@style/TextAppearance.NotificationInfo.Button"/>
- <TextView
- android:id="@+id/done_button"
- android:text="@string/priority_onboarding_done_button_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:gravity="end|center_vertical"
- android:minWidth="@dimen/notification_importance_toggle_size"
- android:minHeight="@dimen/notification_importance_toggle_size"
- android:maxWidth="125dp"
- style="@style/TextAppearance.NotificationInfo.Button"/>
-
- </RelativeLayout>
-
- </LinearLayout>
-</FrameLayout>
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index 5bf691928300..bb540990ccb7 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -36,7 +36,7 @@
<include layout="@layout/quick_status_bar_header_date_privacy"/>
<RelativeLayout
- android:id="@+id/container"
+ android:id="@+id/qs_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index b94e9e8ae1c3..f17067a58b69 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Beweeg na regs onder"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Beweeg na rand en versteek"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Beweeg weg van rand en wys"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"wissel"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Toestelkontroles"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Voeg kontroles vir jou gekoppelde toestelle by"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Stel toestelkontroles op"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Maak toe"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Hervat"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Instellings"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Speel"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Onaktief, gaan program na"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Fout, probeer tans weer …"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nie gekry nie"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index d2ee53d54a46..d2ecd78df75c 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ታችኛውን ቀኝ አንቀሳቅስ"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ወደ ጠርዝ አንቀሳቅስ እና ደደብቅ"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ጠርዙን ወደ ውጭ አንቀሳቅስ እና አሳይ"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ቀያይር"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"የመሣሪያ መቆጣጠሪያዎች"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ለእርስዎ የተገናኙ መሣሪያዎች መቆጣጠሪያዎችን ያክሉ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"የመሣሪያ መቆጣጠሪያዎችን ያቀናብሩ"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"አሰናብት"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"ከቆመበት ቀጥል"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"ቅንብሮች"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"አጫውት"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ንቁ ያልኾነ፣ መተግበሪያን ይፈትሹ"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"ስህተት፣ እንደገና በመሞከር ላይ…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"አልተገኘም"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index a32a55ce8101..bceb6c9250ae 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"তলৰ সোঁফালে নিয়ক"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"কাষলৈ নিয়ক আৰু লুকুৱাওক"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"কাষৰ বাহিৰলৈ নিয়ক আৰু দেখুৱাওক"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ট’গল কৰক"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"আপোনাৰ সংযোজিত ডিভাইচৰ বাবে নিয়ন্ত্ৰণ যোগ কৰক"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহ ছেট আপ কৰক"</string>
@@ -1087,15 +1086,12 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"অধিক চাবলৈ ছোৱাইপ কৰক"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"চুপাৰিছসমূহ ল’ড কৰি থকা হৈছে"</string>
<string name="controls_media_title" msgid="1746947284862928133">"মিডিয়া"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"এই মিডিয়াৰ ছেশ্বনটো লুকুৱাবনে?"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"বৰ্তমানৰ মিডিয়াৰ ছেশ্বনটো লুকুৱাব নোৱাৰি।"</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"অগ্ৰাহ্য কৰক"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"পুনৰ আৰম্ভ কৰক"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"ছেটিংসমূহ"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"প্লে’ কৰক"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"সক্ৰিয় নহয়, এপ্‌টো পৰীক্ষা কৰক"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"আসোঁৱাহ, পুনৰ চেষ্টা কৰি আছে…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"বিচাৰি পোৱা নগ’ল"</string>
@@ -1156,6 +1152,5 @@
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰ অক্ষম হৈ আছে"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"বিশ্বাসযোগ্যতা প্ৰমাণ কৰক"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"ডিভাইচ আনলক কৰক"</string>
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"খুলিবলৈ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string>
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 9318906f4a49..466d24ef491d 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Aşağıya sağa köçürün"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"İçəri keçirib gizlədin"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Kənara daşıyıb göstərin"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"keçirin"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Cihaz idarəetmələri"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Qoşulmuş cihazlarınız üçün nizamlayıcılar əlavə edin"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz idarəetmələrini ayarlayın"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"İmtina edin"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Davam edin"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Ayarlar"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Oxudun"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Aktiv deyil, tətbiqi yoxlayın"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Xəta, yenidən cəhd edilir…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Tapılmadı"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index eeb3061fe8e7..f1303ce06190 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -1049,8 +1049,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Premesti dole desno"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Premesti do ivice i sakrij"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Premesti izvan ivice i prikaži"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"uključite/isključite"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Podesite kontrole uređaja"</string>
@@ -1098,8 +1097,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Odbaci"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Nastavi"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Podešavanja"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Pusti"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno. Vidite aplikaciju"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Greška, pokušava se ponovo…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 44f6ff96d323..e857489eff56 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Преместване долу вдясно"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Преместване в края и скриване"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Преместване в края и показване"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"превключване"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Контроли за устройството"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Добавяне на контроли за свързаните ви устройства"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Настройване на контролите за устройството"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Отхвърляне"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Възобновяване"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Настройки"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Google Play"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Неактивно, проверете прилож."</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Грешка. Извършва се нов опит…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Не е намерено"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 959f07b36b92..8f9953ba2a6d 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -1087,10 +1087,8 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"আরও দেখতে সোয়াইপ করুন"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"সাজেশন লোড করা হচ্ছে"</string>
<string name="controls_media_title" msgid="1746947284862928133">"মিডিয়া"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"এই মিডিয়া সেশন লুকিয়ে রাখতে চান?"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"বর্তমান মিডিয়া সেশন লুকিয়ে রাখা যাবে না।"</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"খারিজ করুন"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"আবার চালু করুন"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"সেটিংস"</string>
@@ -1156,6 +1154,5 @@
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ফিঙ্গারপ্রিন্ট সেন্সর বন্ধ করা আছে"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"যাচাই করিয়ে নিন"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"ডিভাইস আনলক করুন"</string>
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"খুলতে ফিঙ্গারপ্রিন্ট ব্যবহার করুন"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 674f049849b0..482c8ad816f9 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -1049,8 +1049,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Pomjeranje dolje desno"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Pomjeranje do ivice i sakrivanje"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Pomjeranje izvan ivice i prikaz"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aktiviranje/deaktiviranje"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Postavite kontrole uređaja"</string>
@@ -1098,8 +1097,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Odbaci"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Nastavi"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Postavke"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Pokrenite"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, vidite aplikaciju"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Greška, ponovni pokušaj…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index b9e01021df59..ac86cfbba09e 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mou a baix a la dreta"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mou dins de les vores i amaga"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mou fora de les vores i mostra"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"commuta"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controls de dispositius"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Afegeix controls per als teus dispositius connectats"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura els controls de dispositius"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ignora"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Reprèn"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Configuració"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reprodueix"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactiu; comprova l\'aplicació"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Error. S\'està tornant a provar…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"No s\'ha trobat"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 123b09fc1816..bf969a19d21e 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -1054,8 +1054,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Přesunout vpravo dolů"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Přesunout k okraji a skrýt"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Přesunout okraj ven a zobrazit"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"přepnout"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Ovládání zařízení"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Přidejte si ovládací prvky pro připojená zařízení"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavení ovládání zařízení"</string>
@@ -1104,8 +1103,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Zavřít"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Pokračovat"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Nastavení"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Přehrát"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivní, zkontrolujte aplikaci"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Chyba. Nový pokus…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nenalezeno"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 5ccdbf38680a..abcb89e0de39 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Flyt ned til højre"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Flyt ud til kanten, og skjul"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Flyt ud til kanten, og vis"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"slå til/fra"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Enhedsstyring"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Tilføj styring af dine tilsluttede enheder"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhedsstyring"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Luk"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Genoptag"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Indstillinger"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Afspil"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv. Tjek appen"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Fejl. Prøver igen…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ikke fundet"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 6885380b2cc5..2bc8a0392261 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -1087,10 +1087,8 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Wischen, um weitere zu sehen"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Empfehlungen werden geladen"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Medien"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"Diese Mediensitzung ausblenden?"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"Die Mediensitzung kann nicht ausgeblendet werden."</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ablehnen"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Fortsetzen"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Einstellungen"</string>
@@ -1156,6 +1154,5 @@
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"Fingerabdrucksensor ist deaktiviert"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"zu authentifizieren"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"das Gerät einzugeben"</string>
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Mit Fingerabdruck öffnen"</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index f8420271d256..545d822c50ac 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Μετακίνηση κάτω δεξιά"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Μετακίν. στο άκρο και απόκρυψη"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Μετακ. εκτός άκρου και εμφάν."</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"εναλλαγή"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Στοιχεία ελέγχου συσκευής"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Προσθήκη στοιχείων ελέγχου για τις συνδεδεμένες συσκευές σας."</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Ρύθμιση στοιχείων ελέγχου συσκευής"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Παράβλεψη"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Συνέχιση"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Ρυθμίσεις"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Play"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Ανενεργό, έλεγχος εφαρμογής"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Προέκυψε σφάλμα. Επανάληψη…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Δεν βρέθηκε."</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 21ed95421f1f..5292f8741446 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover abajo a la derecha"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover fuera de borde y ocultar"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover fuera de borde y mostrar"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activar o desactivar"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controles de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Agrega controles para los dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles de dispositivos"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Descartar"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Reanudar"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Configuración"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reproducir"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Verifica la app"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Hubo un error. Reintentando…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"No se encontró"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index eaeaf0b6fbf8..d23f073d387f 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover abajo a la derecha"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover al borde y ocultar"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover al borde y mostrar"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activar/desactivar"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Añade controles para tus dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar control de dispositivos"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Cerrar"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Reanudar"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Ajustes"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reproducir"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactivo, comprobar aplicación"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Error; reintentando…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"No se ha encontrado"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index ceaf3fcadb96..d227dcbfd225 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Teisalda alla paremale"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Teisalda serva ja kuva"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Teisalda servast eemale ja kuva"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"lülita"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhikud"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisage juhtelemendid ühendatud seadmete jaoks"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Seadmete juhtimisvidinate seadistamine"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Loobu"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Jätka"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Seaded"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Esitamine"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Passiivne, vaadake rakendust"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Viga, proovitakse uuesti …"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ei leitud"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 3cb0b4398f4e..199107c2be56 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Eraman behealdera, eskuinetara"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Eraman ertzera eta ezkutatu"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Atera ertzetik eta erakutsi"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aldatu"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Gailuak kontrolatzeko widgetak"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Gehitu konektatutako gailuak kontrolatzeko widgetak"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfiguratu gailuak kontrolatzeko widgetak"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Baztertu"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Berrekin"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Ezarpenak"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Erreproduzitu"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktibo; egiaztatu aplikazioa"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Errorea. Berriro saiatzen…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ez da aurkitu"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 7e9dabb4089a..d6b018df10b7 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"انتقال به پایین سمت چپ"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"انتقال به لبه و پنهان کردن"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"انتقال به خارج از لبه و نمایش"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"روشن/ خاموش کردن"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"کنترل‌های دستگاه"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"افزودن کنترل‌ها برای دستگاه‌های متصل"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"تنظیم کنترل‌های دستگاه"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"رد کردن"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"ازسرگیری"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"تنظیمات"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"پخش"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"غیرفعال، برنامه را بررسی کنید"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"خطا، درحال تلاش مجدد…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"پیدا نشد"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 89566a6e6e29..d4da4597d56c 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Déplacer dans coin inf. droit"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Éloigner du bord et masquer"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Éloigner du bord et afficher"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"basculer"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajoutez des commandes pour vos appareils connectés"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes des appareils"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Fermer"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Reprendre"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Paramètres"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Faire jouer"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Délai expiré, vérifiez l\'appli"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Erreur, nouvelle tentative…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Introuvable"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 7f73bab04817..c17bf8ffe906 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Déplacer en bas à droite"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Rapprocher du bord et masquer"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Éloigner du bord et afficher"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activer/désactiver"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajouter des commandes pour vos appareils connectés"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes des appareils"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Fermer"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Reprendre"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Paramètres"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Lire"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Délai expiré, vérifier l\'appli"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Erreur. Nouvelle tentative…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Introuvable"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 4a2a93ef0ec1..73d2de64d194 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover á parte inferior dereita"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover ao bordo e ocultar"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover fóra do bordo e mostrar"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activar/desactivar"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Engade controis para os dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar o control de dispositivos"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ignorar"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Retomar"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Configuración"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reproducir"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Comproba a app"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Erro. Tentando de novo…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Non se atopou"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 25eb4163d3e9..4c5308bfc2fd 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -137,8 +137,7 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"ફોન"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"વૉઇસ સહાય"</string>
<string name="accessibility_unlock_button" msgid="122785427241471085">"અનલૉક કરો"</string>
- <!-- no translation found for accessibility_lock_icon (661492842417875775) -->
- <skip />
+ <string name="accessibility_lock_icon" msgid="661492842417875775">"ડિવાઇસ લૉક કરેલું છે"</string>
<string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"ફિંગરપ્રિન્ટની રાહ જોઈ રહ્યાં છીએ"</string>
<string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"તમારી ફિંગરપ્રિન્ટનો ઉપયોગ કર્યા વગર અનલૉક કરો"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ચહેરો સ્કૅન કરવો"</string>
@@ -1088,10 +1087,8 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"વધુ જોવા માટે સ્વાઇપ કરો"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"સુઝાવ લોડ કરી રહ્યાં છીએ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"મીડિયા"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"શું આ મીડિયા સત્ર છુપાવીએ?"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"હાલનું મીડિયા સત્ર છુપાવી શકાતું નથી."</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"છોડી દો"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"ફરી શરૂ કરો"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"સેટિંગ"</string>
@@ -1153,14 +1150,9 @@
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"તમારું બૅટરી મીટર વાંચવામાં સમસ્યા આવી"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"વધુ માહિતી માટે ટૅપ કરો"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"કોઈ અલાર્મ સેટ નથી"</string>
- <!-- no translation found for accessibility_fingerprint_label (5255731221854153660) -->
- <skip />
- <!-- no translation found for accessibility_udfps_disabled_button (4284034245130239384) -->
- <skip />
- <!-- no translation found for accessibility_authenticate_hint (798914151813205721) -->
- <skip />
- <!-- no translation found for accessibility_enter_hint (2617864063504824834) -->
- <skip />
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ફિંગરપ્રિન્ટ સેન્સર"</string>
+ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ફિંગરપ્રિન્ટ સેન્સર બંધ કરેલું છે"</string>
+ <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ખાતરી કરો"</string>
+ <string name="accessibility_enter_hint" msgid="2617864063504824834">"ડિવાઇસ અનલૉક કરો"</string>
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ખોલવા માટે ફિંગરપ્રિન્ટનો ઉપયોગ કરો"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 02e4a45751a8..6b03458b0f73 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"सबसे नीचे दाईं ओर ले जाएं"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"एज पर ले जाएं और छिपाएं"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"एज से निकालें और दिखाएं"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"टॉगल करें"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"डिवाइस कंट्रोल"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"कनेक्ट किए गए डिवाइस के लिए कंट्रोल जोड़ें"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"डिवाइस कंट्रोल सेट अप करें"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"खारिज करें"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"फिर से शुरू करें"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"सेटिंग"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"चलाएं"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"काम नहीं कर रहा, ऐप जांचें"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"कोई गड़बड़ी हुई, फिर से कोशिश की जा रही है…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"कंट्रोल नहीं है"</string>
@@ -1153,6 +1151,6 @@
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"फ़िंगरप्रिंट सेंसर"</string>
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"फ़िंगरप्रिंट सेंसर बंद है"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"पुष्टि करें"</string>
- <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिवाइस अनलॉक करें"</string>
+ <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिवाइस की होम स्क्रीन पर जाएं"</string>
<string name="keyguard_try_fingerprint" msgid="2825130772993061165">"खोलने के लिए, फ़िंगरप्रिंट का इस्तेमाल करें"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 39e628296126..3b4d034c8039 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -1049,8 +1049,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Premjesti u donji desni kut"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Premjesti na rub i sakrij"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Ukloni s ruba i prikaži"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"promijeni"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Postavljanje kontrola uređaja"</string>
@@ -1098,8 +1097,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Odbaci"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Nastavi"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Postavke"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reprodukcija"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, provjerite aplik."</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Pogreška, pokušavamo ponovo…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 906b45fe13e9..1940cd5ef2ea 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Áthelyezés le és jobbra"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Áthelyezés a szélen kívül és elrejtés"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Áthelyezés a szélen kívül és mutatás"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"váltás"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Eszközvezérlők"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Vezérlők hozzáadása a csatlakoztatott eszközökhöz"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Eszközvezérlők beállítása"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Elvetés"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Folytatás"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Beállítások"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Játék"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktív, ellenőrizze az appot"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Hiba, újrapróbálkozás…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nem található"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 630792f1ec4f..aaf2b5d8c31a 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Færa neðst til hægri"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Færa að jaðri og fela"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Færa að jaðri og birta"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"kveikja/slökkva"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Tækjastjórnun"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Bæta við stýringum fyrir tengd tæki"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Setja upp tækjastjórnun"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Hunsa"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Halda áfram"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Stillingar"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Spila"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Óvirkt, athugaðu forrit"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Villa, reynir aftur…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Fannst ekki"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 0fd51ec1ad09..40294d5a32fe 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Sposta in basso a destra"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Sposta fino a bordo e nascondi"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Sposta fuori da bordo e mostra"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"attiva/disattiva"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controllo dei dispositivi"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Aggiungi controlli per i dispositivi connessi"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura il controllo dei dispositivi"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ignora"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Riprendi"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Impostazioni"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Riproduci"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inattivo, controlla l\'app"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Errore. Nuovo tentativo…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Controllo non trovato"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 98ae9d1ae9d4..0a9cceb32c5b 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -1099,10 +1099,8 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"יש להחליק כדי להציג עוד פריטים"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ההמלצות בטעינה"</string>
<string name="controls_media_title" msgid="1746947284862928133">"מדיה"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"להסתיר את סשן המדיה?"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"לא ניתן להסתיר את סשן המדיה הנוכחי."</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"סגירה"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"המשך"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"הגדרות"</string>
@@ -1168,6 +1166,5 @@
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"חיישן טביעות האצבע מושבת"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"אימות"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"הזנת מכשיר"</string>
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"שימוש בטביעת אצבע כדי לפתוח"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index c3475017a066..97d94ab4d41c 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"右下に移動"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"端に移動して非表示"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"端から移動して表示"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"切り替え"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"デバイス コントロール"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"コネクテッド デバイスのコントロールを追加します"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"デバイス コントロールの設定"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"閉じる"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"再開"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"設定"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"再生"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"無効: アプリをご確認ください"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"エラー。再試行しています…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"見つかりませんでした"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index bc8abd42c929..0a181b43d1e7 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Төменгі оң жаққа жылжыту"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Шетке жылжыту және жасыру"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Шетке жылжыту және көрсету"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ауыстыру"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Құрылғыны басқару элементтері"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Жалғанған құрылғылар үшін басқару элементтерін қосу"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Құрылғыны басқару элементтерін реттеу"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Жабу"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Жалғастыру"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Параметрлер"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Ойнату"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Өшірулі. Қолданба тексеріңіз."</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Қате, әрекет қайталануда…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Табылмады"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 48b80f684471..f872660aa1c8 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ផ្លាស់ទីទៅខាងក្រោមផ្នែកខាងស្ដាំ"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ផ្លាស់ទីទៅផ្នែកខាងចុង រួចលាក់"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ផ្លាស់ទីចេញពីផ្នែកខាងចុង រួចបង្ហាញ"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"បិទ/បើក"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"ផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"បញ្ចូល​ផ្ទាំងគ្រប់គ្រង​សម្រាប់​ឧបករណ៍​ដែលអ្នកបានភ្ជាប់"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"រៀបចំ​ផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string>
@@ -1094,8 +1093,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"ច្រាន​ចោល"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"បន្ត"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"ការកំណត់"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"ចាក់"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"អសកម្ម ពិនិត្យមើល​កម្មវិធី"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"បញ្ហា កំពុងព្យាយាម​ម្ដងទៀត…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"រកមិន​ឃើញទេ"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index f35c3b28b103..ffc634adbe4f 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -137,8 +137,7 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"ಫೋನ್"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ಧ್ವನಿ ಸಹಾಯಕ"</string>
<string name="accessibility_unlock_button" msgid="122785427241471085">"ಅನ್‌ಲಾಕ್"</string>
- <!-- no translation found for accessibility_lock_icon (661492842417875775) -->
- <skip />
+ <string name="accessibility_lock_icon" msgid="661492842417875775">"ಸಾಧನ ಲಾಕ್ ಆಗಿದೆ"</string>
<string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‍‍ಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಬಳಸದೆಯೇ ಅನ್‌ಲಾಕ್ ಮಾಡಿ"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ಮುಖವನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
@@ -1153,14 +1152,10 @@
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ಅಲಾರಾಂ ಸೆಟ್ ಆಗಿಲ್ಲ"</string>
- <!-- no translation found for accessibility_fingerprint_label (5255731221854153660) -->
- <skip />
- <!-- no translation found for accessibility_udfps_disabled_button (4284034245130239384) -->
- <skip />
- <!-- no translation found for accessibility_authenticate_hint (798914151813205721) -->
- <skip />
- <!-- no translation found for accessibility_enter_hint (2617864063504824834) -->
- <skip />
+ <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್"</string>
+ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ದೃಢೀಕರಿಸಿ"</string>
+ <string name="accessibility_enter_hint" msgid="2617864063504824834">"ಸಾಧನವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 3c61f44beff2..7d27acba2fd0 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"오른쪽 하단으로 이동"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"가장자리로 옮겨서 숨기기"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"가장자리 바깥으로 옮겨서 표시"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"전환"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"기기 컨트롤"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"연결된 기기의 컨트롤을 추가하세요."</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"기기 컨트롤 설정"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"닫기"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"다시 시작"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"설정"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"재생"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"비활성. 앱을 확인하세요."</string>
<string name="controls_error_retryable" msgid="864025882878378470">"오류 발생, 다시 시도 중…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"찾을 수 없음"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index a0d460b40599..54310c102821 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Баруун доош зөөх"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Ирмэг рүү зөөж, нуух"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Ирмэгээс гаргаж, харуулах"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"асаах/унтраах"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Төхөөрөмжийн хяналт"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Холбогдсон төхөөрөмжүүд дээрээ хяналт нэмэх"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Төхөөрөмжийн хяналтыг тохируулах"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Хаах"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Үргэлжлүүлэх"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Тохиргоо"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Тоглуулах"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Идэвхгүй байна, аппыг шалгана уу"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Алдаа, дахин оролдож байна…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Олдсонгүй"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 6bbeb52da831..3945370ca7b7 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Alihkan ke bawah sebelah kanan"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Alihkan ke tepi dan sorokkan"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Alihkan ke tepi dan tunjukkan"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"togol"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Kawalan peranti"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Tambah kawalan untuk peranti yang disambungkan"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Sediakan kawalan peranti"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Tolak"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Sambung semula"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Tetapan"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Main"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Tidak aktif, semak apl"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Ralat, mencuba semula…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Tidak ditemukan"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 649d7c509c65..3dcea65e7701 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Flytt til nederst til høyre"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Flytt til kanten og skjul"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Flytt ut kanten og vis"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"slå av/på"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyring"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Legg til kontroller for de tilkoblede enhetene dine"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhetsstyring"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Lukk"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Gjenoppta"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Innstillinger"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Spill av"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv. Sjekk appen"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Feil. Prøver igjen …"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ikke funnet"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 6258e4590a71..cd87cd5401d6 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -137,8 +137,7 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"फोन"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"आवाज सहायता"</string>
<string name="accessibility_unlock_button" msgid="122785427241471085">"खोल्नुहोस्"</string>
- <!-- no translation found for accessibility_lock_icon (661492842417875775) -->
- <skip />
+ <string name="accessibility_lock_icon" msgid="661492842417875775">"यन्त्र लक गरिएको छ"</string>
<string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"फिंगरप्रिन्ट कुर्दै"</string>
<string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"आफ्नो फिंगरप्रिन्ट बिना नै अनलक गर्नुहोस्"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"अनुहार स्क्यान गर्दै"</string>
@@ -1153,14 +1152,10 @@
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"डिभाइसको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"थप जानकारी प्राप्त गर्न ट्याप गर्नुहोस्"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"अलार्म राखिएको छैन"</string>
- <!-- no translation found for accessibility_fingerprint_label (5255731221854153660) -->
- <skip />
- <!-- no translation found for accessibility_udfps_disabled_button (4284034245130239384) -->
- <skip />
- <!-- no translation found for accessibility_authenticate_hint (798914151813205721) -->
- <skip />
- <!-- no translation found for accessibility_enter_hint (2617864063504824834) -->
- <skip />
+ <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"फिंगरप्रिन्ट सेन्सर"</string>
+ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"फिंगरप्रिन्ट सेन्सर असक्षम पारिएको छ"</string>
+ <string name="accessibility_authenticate_hint" msgid="798914151813205721">"प्रमाणित गर्नुहोस्"</string>
+ <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिभाइस हाल्नुहोस्"</string>
<!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 0bd3cd589401..d5d094684dd0 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Naar rechtsonder verplaatsen"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Naar rand verplaatsen en verbergen"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Over rand verplaatsen en tonen"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"schakelen"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Apparaatbediening"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Voeg bedieningselementen voor je gekoppelde apparaten toe"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Apparaatbediening instellen"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Sluiten"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Hervatten"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Instellingen"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Afspelen"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactief, check de app"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Fout. Opnieuw proberen…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Niet gevonden"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index e9371c60af14..95f1d3589ca4 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ନିମ୍ନ ଡାହାଣକୁ ମୁଭ୍ କରନ୍ତୁ"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ଧାରକୁ ମୁଭ୍ କରି ଲୁଚାନ୍ତୁ"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ଧାର ବାହାରକୁ ମୁଭ୍ କରି ଦେଖାନ୍ତୁ"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ଟୋଗଲ୍ କରନ୍ତୁ"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ଆପଣଙ୍କ ସଂଯୁକ୍ତ ଡିଭାଇସଗୁଡ଼ିକ ପାଇଁ ନିୟନ୍ତ୍ରଣ ଯୋଗ କରନ୍ତୁ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
@@ -1087,15 +1086,12 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ଅଧିକ ଦେଖିବାକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ସୁପାରିଶଗୁଡ଼ିକ ଲୋଡ୍ କରାଯାଉଛି"</string>
<string name="controls_media_title" msgid="1746947284862928133">"ମିଡିଆ"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"ଏହି ମିଡିଆ ସେସନକୁ ଲୁଚାଇବେ?"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"ବର୍ତ୍ତମାନର ମିଡିଆ ସେସନକୁ ଲୁଚାଯାଇପାରିବ ନାହିଁ।"</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"ଖାରଜ କରନ୍ତୁ"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"ସେଟିଂସ୍"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"ଚଲାନ୍ତୁ"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ନିଷ୍କ୍ରିୟ ଅଛି, ଆପ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"ତ୍ରୁଟି, ପୁଣି ଚେଷ୍ଟା କରୁଛି…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"ମିଳିଲା ନାହିଁ"</string>
@@ -1156,6 +1152,5 @@
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ଟିପଚିହ୍ନ ସେନ୍ସରକୁ ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"ପ୍ରମାଣୀକରଣ କରନ୍ତୁ"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"ଡିଭାଇସ୍ ବିଷୟରେ ସୂଚନା ଲେଖନ୍ତୁ"</string>
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ଖୋଲିବାକୁ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index fdc20266c18a..e0e1b4f2f119 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -1087,10 +1087,8 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ਹੋਰ ਦੇਖਣ ਲਈ ਸਵਾਈਪ ਕਰੋ"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ਸਿਫ਼ਾਰਸ਼ਾਂ ਲੋਡ ਹੋ ਰਹੀਆਂ ਹਨ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"ਮੀਡੀਆ"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"ਕੀ ਇਹ ਮੀਡੀਆ ਸੈਸ਼ਨ ਲੁਕਾਉਣਾ ਹੈ?"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"ਮੌਜੂਦਾ ਮੀਡੀਆ ਸੈਸ਼ਨ ਲੁਕਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"ਖਾਰਜ ਕਰੋ"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"ਮੁੜ-ਚਾਲੂ ਕਰੋ"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"ਸੈਟਿੰਗਾਂ"</string>
@@ -1156,6 +1154,5 @@
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"ਪ੍ਰਮਾਣਿਤ ਕਰੋ"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"ਡੀਵਾਈਸ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ਖੋਲ੍ਹਣ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 4c6c15911a59..d95eabc8c35a 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -1165,6 +1165,6 @@
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Czytnik linii papilarnych"</string>
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"Czytnik linii papilarnych został wyłączony"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"uwierzytelnij"</string>
- <string name="accessibility_enter_hint" msgid="2617864063504824834">"dodaj urządzenie"</string>
+ <string name="accessibility_enter_hint" msgid="2617864063504824834">"otwórz urządzenie"</string>
<string name="keyguard_try_fingerprint" msgid="2825130772993061165">"By otworzyć, użyj odcisku palca"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index cc60b6a3719f..b786dfb46b03 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover para o canto inferior direito"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover para a borda e ocultar"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover para fora da borda e exibir"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"alternar"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Dispensar"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Retomar"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Configurações"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Iniciar"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inativo, verifique o app"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Erro. Tentando novamente…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c38388d42b9b..496fcb21f838 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover parte inferior direita"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover p/ extremidade e ocultar"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Retirar extremidade e mostrar"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ativar/desativar"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controlos de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adicione controlos para os dispositivos associados."</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configure os controlos de dispositivos"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ignorar"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Retomar"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Definições"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reproduzir"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inativa. Consulte a app."</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Erro. A tentar novamente…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado."</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index cc60b6a3719f..b786dfb46b03 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover para o canto inferior direito"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover para a borda e ocultar"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover para fora da borda e exibir"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"alternar"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Dispensar"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Retomar"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Configurações"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Iniciar"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inativo, verifique o app"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Erro. Tentando novamente…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 4e3fb127ee37..2100466e2cdf 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -1049,8 +1049,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mutați în dreapta jos"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mutați în afară și ascundeți"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mutați în afară și afișați"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"Activați / dezactivați"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Comenzile dispozitivelor"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adăugați comenzi pentru dispozitivele conectate"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurați comenzile dispozitivelor"</string>
@@ -1098,8 +1097,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Închideți"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Reia"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Setări"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Redați"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactiv, verificați aplicația"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Eroare, se încearcă din nou…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nu s-a găsit"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index fe834484ab56..45abf9550ff3 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"පහළ දකුණට ගෙන යන්න"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"මායිමට ගෙන යන්න සහ සඟවන්න"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"මායිමෙන් පිටට ගන්න සහ පෙන්වන්න"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ටොගල් කරන්න"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"උපාංග පාලන"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ඔබේ සම්බන්ධිත උපාංග සඳහා පාලන එක් කරන්න"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"උපාංග පාලන පිහිටුවන්න"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"ඉවත ලන්න"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"නැවත පටන් ගන්න"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"සැකසීම්"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"වාදනය කරන්න"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"අක්‍රියයි, යෙදුම පරීක්ෂා කරන්න"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"දෝෂයකි, නැවත උත්සාහ කරමින්…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"හමු නොවිණි"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index d947376d1429..63c3b8bc5876 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -1054,8 +1054,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Presunúť doprava nadol"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Presunúť k okraju a skryť"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Presunúť z okraja a zobraziť"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"prepínač"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Ovládanie zariadení"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridajte si ovládače pripojených zariadení"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavenie ovládania zariadení"</string>
@@ -1104,8 +1103,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Zavrieť"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Pokračovať"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Nastavenia"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Prehrať"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktívne, preverte aplikáciu"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Chyba, skúša sa znova…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nenájdené"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index a0b5081c84ae..f1f7a7a63ff7 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Zhvendos poshtë djathtas"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Zhvendose te skaji dhe fshihe"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Zhvendose jashtë skajit dhe shfaqe"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aktivizo/çaktivizo"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrollet e pajisjes"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Shto kontrolle për pajisjet e tua të lidhura"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfiguro kontrollet e pajisjes"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Hiq"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Vazhdo"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Cilësimet"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Luaj"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Joaktive, kontrollo aplikacionin"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Gabim, po provohet përsëri"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nuk u gjet"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index de323ecbffd1..22af16a5e242 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -1049,8 +1049,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Премести доле десно"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Премести до ивице и сакриј"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Премести изван ивице и прикажи"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"укључите/искључите"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Контроле уређаја"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Додајте контроле за повезане уређаје"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Подесите контроле уређаја"</string>
@@ -1098,8 +1097,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Одбаци"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Настави"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Подешавања"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Пусти"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Неактивно. Видите апликацију"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Грешка, покушава се поново…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Није пронађено"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index cc7adf5bd078..ebcae0f3ade8 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Flytta längst ned till höger"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Flytta till kanten och dölj"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Flytta från kanten och visa"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aktivera och inaktivera"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyrning"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Lägg till snabbkontroller för anslutna enheter"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurera enhetsstyrning"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Stäng"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Återuppta"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Inställningar"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Spela upp"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv, kolla appen"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Fel, försöker igen …"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Hittades inte"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index afa23984d9e8..2a45ce5a0a33 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Sogeza chini kulia"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Sogeza kwenye ukingo kisha ufiche"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Sogeza nje ya ukingo kisha uonyeshe"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"geuza"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Vidhibiti vya vifaa"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Weka vidhibiti vya vifaa ulivyounganisha"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Weka mipangilio ya vidhibiti vya vifaa"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ondoa"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Endelea"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Mipangilio"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Cheza"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Haitumiki, angalia programu"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Hitilafu, inajaribu tena…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Hakipatikani"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index ad0e4c751900..63b4c3b8560d 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"கீழே வலதுபுறத்திற்கு நகர்த்து"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ஓரத்திற்கு நகர்த்தி மறை"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ஓரத்திற்கு நகர்த்தி, காட்டு"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"நிலைமாற்று"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"சாதனக் கட்டுப்பாடுகள்"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"இணைக்கப்பட்ட சாதனங்களில் கட்டுப்பாடுகளைச் சேர்க்கலாம்"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"சாதனக் கட்டுப்பாடுகளை அமைத்தல்"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"மூடுக"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"தொடர்க"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"அமைப்புகள்"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"இயக்குதல்"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"செயலில் இல்லை , சரிபார்க்கவும்"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"பிழை, மீண்டும் முயல்கிறது…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"இல்லை"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 0b030faa82e7..7b05e3620d9b 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -1087,10 +1087,8 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"మరిన్నింటిని చూడటం కోసం స్వైప్ చేయండి"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"సిఫార్సులు లోడ్ అవుతున్నాయి"</string>
<string name="controls_media_title" msgid="1746947284862928133">"మీడియా"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"ఈ మీడియా సెషన్‌ను దాచాలా?"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"ప్రస్తుత మీడియా సెషన్‌ను దాచడం సాధ్యం కాదు."</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"విస్మరించు"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"కొనసాగించండి"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"సెట్టింగ్‌లు"</string>
@@ -1156,6 +1154,5 @@
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"వేలిముద్ర సెన్సార్ డిజేబుల్ చేయబడింది"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"ప్రామాణీకరించండి"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"పరికరాన్ని ఎంటర్ చేయండి"</string>
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"తెరవడానికి వేలిముద్రను ఉపయోగించండి"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 578f8a11bf39..171ecd449b06 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ย้ายไปด้านขาวล่าง"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ย้ายไปที่ขอบและซ่อน"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ย้ายออกจากขอบและแสดง"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"สลับ"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"ระบบควบคุมอุปกรณ์"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"เพิ่มตัวควบคุมของอุปกรณ์ที่เชื่อมต่อ"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"ตั้งค่าระบบควบคุมอุปกรณ์"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"ปิด"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"เล่นต่อ"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"การตั้งค่า"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"เล่น"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ไม่มีการใช้งาน โปรดตรวจสอบแอป"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"มีข้อผิดพลาด กำลังลองอีกครั้ง…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"ไม่พบ"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 896eeade63fc..0490ff7ce286 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Ilipat sa kanan sa ibaba"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Ilipat sa sulok at itago"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Alisin sa sulok at ipakita"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"i-toggle"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Mga kontrol ng device"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Magdagdag ng kontrol para sa mga nakakonektang device"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"I-set up ang mga kontrol ng device"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"I-dismiss"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Ituloy"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Mga Setting"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"I-play"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Hindi aktibo, tingnan ang app"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Nagka-error, sinusubukan ulit…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Hindi nahanap"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index c584d31438b4..12cae9b93216 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Sağ alta taşı"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Kenara taşıyıp gizle"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Kenarın dışına taşıyıp göster"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"değiştir"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Cihaz denetimleri"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Bağlı cihazlarınız için denetimler ekleyin"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz denetimlerini kur"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Kapat"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Devam ettir"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Ayarlar"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Oynat"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Devre dışı, uygulamaya bakın"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Hata, yeniden deneniyor…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Bulunamadı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 73d5e935a973..4e7de7110672 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -1165,6 +1165,6 @@
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сканер відбитків пальців"</string>
<string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"Сканер відбитків пальців вимкнено"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"пройти автентифікацію"</string>
- <string name="accessibility_enter_hint" msgid="2617864063504824834">"виконати вхід на пристрої"</string>
+ <string name="accessibility_enter_hint" msgid="2617864063504824834">"відкрити пристрій"</string>
<string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Щоб відкрити, використайте відбиток пальця"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 7e9cf556a9c8..702bc7efd36b 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -137,8 +137,7 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"فون"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"صوتی معاون"</string>
<string name="accessibility_unlock_button" msgid="122785427241471085">"غیر مقفل کریں"</string>
- <!-- no translation found for accessibility_lock_icon (661492842417875775) -->
- <skip />
+ <string name="accessibility_lock_icon" msgid="661492842417875775">"آلہ مقفل کر دیا گیا"</string>
<string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"فنگر پرنٹ کا انتظار ہے"</string>
<string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"فنگر پرنٹ استعمال کیے بغیرغیر مقفل کریں"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"اسکیننگ چہرہ"</string>
@@ -1088,10 +1087,8 @@
<string name="controls_structure_tooltip" msgid="4355922222944447867">"مزید دیکھنے کیلئے سوائپ کریں"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"تجاویز لوڈ ہو رہی ہیں"</string>
<string name="controls_media_title" msgid="1746947284862928133">"میڈیا"</string>
- <!-- no translation found for controls_media_close_session (1193000643003066508) -->
- <skip />
- <!-- no translation found for controls_media_active_session (3146882316024153337) -->
- <skip />
+ <string name="controls_media_close_session" msgid="1193000643003066508">"اس میڈیا سیشن کو چھپائیں؟"</string>
+ <string name="controls_media_active_session" msgid="3146882316024153337">"میڈیا کے موجودہ سیشن کو چھپایا نہیں جا سکتا۔"</string>
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"برخاست کریں"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"دوبارہ شروع کریں"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"ترتیبات"</string>
@@ -1153,14 +1150,9 @@
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"آپ کے بیٹری میٹر کو پڑھنے میں دشواری"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"مزید معلومات کے لیے تھپتھپائیں"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"کوئی الارم سیٹ نہیں ہے"</string>
- <!-- no translation found for accessibility_fingerprint_label (5255731221854153660) -->
- <skip />
- <!-- no translation found for accessibility_udfps_disabled_button (4284034245130239384) -->
- <skip />
- <!-- no translation found for accessibility_authenticate_hint (798914151813205721) -->
- <skip />
- <!-- no translation found for accessibility_enter_hint (2617864063504824834) -->
- <skip />
- <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) -->
- <skip />
+ <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"فنگر پرنٹ سینسر"</string>
+ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"فنگر پرنٹ سینسر غیر فعال ہے"</string>
+ <string name="accessibility_authenticate_hint" msgid="798914151813205721">"تصدیق کریں"</string>
+ <string name="accessibility_enter_hint" msgid="2617864063504824834">"آلہ درج کریں"</string>
+ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"کھولنے کے لیے فنگر پرنٹ کا استعمال کریں"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index eb6a27214556..216a0944fcad 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Quyi oʻngga surish"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Chetiga olib borish va yashirish"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Chetidan qaytarish va koʻrsatish"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"oʻzgartirish"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Qurilmalarni boshqarish"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ulangan qurilmalar uchun boshqaruv elementlari"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Qurilma boshqaruv elementlarini sozlash"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Yopish"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Davom etish"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Sozlamalar"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Ijro"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Nofaol. Ilovani tekshiring"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Xato, qayta urinilmoqda…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Topilmadi"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 237036f725c8..a6a9ace99e4c 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Chuyển tới dưới cùng bên phải"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Chuyển đến cạnh và ẩn"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Chuyển ra xa cạnh và hiển thị"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"bật/tắt"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Điều khiển thiết bị"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Thêm các nút điều khiển cho các thiết bị đã kết nối"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Thiết lập các tùy chọn điều khiển thiết bị"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Đóng"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Tiếp tục"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Cài đặt"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Phát"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Không hoạt động, hãy kiểm tra ứng dụng"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Lỗi, đang thử lại…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Không tìm thấy"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index aa5e4e2b1824..51b9a545721e 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"移去右下方"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"移到邊緣並隱藏"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"從邊緣移出並顯示"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"切換"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"為連接的裝置新增控制選項"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"關閉"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"繼續播放"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"設定"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"播放"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"已停用,請檢查應用程式"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"發生錯誤,正在重試…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"找不到"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index ed44b087f0f8..8a93729c1e34 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"移到右下方"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"移到邊緣並隱藏"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"從邊緣移出並顯示"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"切換"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"新增已連結裝置的控制項"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制項"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"關閉"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"繼續播放"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"設定"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"播放"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"無效,請查看應用程式"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"發生錯誤,正在重試…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"找不到控制項"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 01e0fca3a89e..674a7c843f5f 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -1044,8 +1044,7 @@
<string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Hamba phansi ngakwesokudla"</string>
<string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Hamba onqenqemeni ufihle"</string>
<string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Phuma onqenqemeni ubonise"</string>
- <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) -->
- <skip />
+ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"guqula"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Izilawuli zezinsiza"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Engeza izilawuli zedivayisi yakho exhunyiwe"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Setha izilawuli zezinsiza"</string>
@@ -1092,8 +1091,7 @@
<string name="controls_media_dismiss_button" msgid="9081375542265132213">"Cashisa"</string>
<string name="controls_media_resume" msgid="1933520684481586053">"Qalisa kabusha"</string>
<string name="controls_media_settings_button" msgid="5815790345117172504">"Izilungiselelo"</string>
- <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) -->
- <skip />
+ <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Dlala"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Akusebenzi, hlola uhlelo lokusebenza"</string>
<string name="controls_error_retryable" msgid="864025882878378470">"Iphutha, iyazama futhi…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ayitholakali"</string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 673a03ddac4e..d9cc24fa38ef 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1897,13 +1897,16 @@
<string name="notification_channel_summary_automatic_demoted">&lt;b>Status:&lt;/b> Ranked Lower</string>
<!-- [CHAR LIMIT=150] Notification Importance title: important conversation level summary -->
- <string name="notification_channel_summary_priority">Always shown at the top of your notifications, even when Priority mode is on</string>
+ <string name="notification_channel_summary_priority_baseline">Shows at the top of conversation notifications and as a profile picture on lock screen</string>
+ <string name="notification_channel_summary_priority_bubble">Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble</string>
+ <string name="notification_channel_summary_priority_dnd">Shows at the top of conversation notifications and as a profile picture on lock screen, interrupts Do Not Disturb</string>
+ <string name="notification_channel_summary_priority_all">Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb</string>
<!--[CHAR LIMIT=30] Linkable text to Settings app -->
<string name="notification_conversation_channel_settings">Settings</string>
<!-- [CHAR LIMIT=150] Notification Importance title: important conversation level -->
- <string name="notification_priority_title">Priority conversations</string>
+ <string name="notification_priority_title">Priority</string>
<!-- Text shown in notification guts for conversation notifications that don't implement the full feature -->
<string name="no_shortcut"><xliff:g id="app_name" example="YouTube">%1$s</xliff:g> doesn\u2019t support conversation features</string>
@@ -2667,25 +2670,6 @@
<!-- Title of the overlay warning the user to interact with the device or it will go to sleep. [CHAR LIMIT=25] -->
<string name="inattentive_sleep_warning_title">Standby</string>
- <!-- Priority conversation onboarding screen -->
- <!-- title of priority onboarding [CHAR LIMIT=75] -->
- <string name="priority_onboarding_title">Conversation set to priority</string>
- <!-- Text explaining that the following actions are the behaviors of priority conversations.
- E.g. priority conversations will show at the top of the conversation section [CHAR LIMIT=75] -->
- <string name="priority_onboarding_behavior">Priority conversations</string>
- <!-- Text explaining that priority conversations show at the top of the conversation section [CHAR LIMIT=120] -->
- <string name="priority_onboarding_show_at_top_text">These conversations are shown at the top of your list and can always reach you when Priority mode is on</string>
- <!-- Text explaining that priority conversations show an avatar on the lock screen [CHAR LIMIT=120] -->
- <string name="priority_onboarding_show_avatar_text">Profile pictures are shown on the lock screen</string>
- <!-- Text explaining that priority conversations will appear as a bubble [CHAR LIMIT=120] -->
- <string name="priority_onboarding_appear_as_bubble_text">You can easily find these conversations in bubbles on your Home screen</string>
- <!-- Text explaining that priority conversations can interrupt DnD settings [CHAR LIMIT=120] -->
- <string name="priority_onboarding_ignores_dnd_text">Interrupt Do Not Disturb</string>
- <!-- Title for the affirmative button [CHAR LIMIT=50] -->
- <string name="priority_onboarding_done_button_title">Got it</string>
- <!-- Title for the settings button button [CHAR LIMIT=50] -->
- <string name="priority_onboarding_settings_button_title">Settings</string>
-
<!-- Window Magnification strings -->
<!-- Title for Magnification Window [CHAR LIMIT=NONE] -->
<string name="magnification_window_title">Magnification Window</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index ac9ced93f2df..aa1f954cb27a 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<style name="ClearAllButtonDefaultMargins">
<item name="android:layout_marginStart">0dp</item>
<item name="android:layout_marginTop">0dp</item>
@@ -609,12 +610,54 @@
<item name="android:elevation">10dp</item>
</style>
- <style name="MediaPlayer.Button" parent="@android:style/Widget.Material.Button.Borderless.Small">
+ <!-- Media controls always have light background -->
+ <style name="MediaPlayer" parent="@*android:style/Theme.DeviceDefault.Light">
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:backgroundTint">@android:color/system_accent2_50</item>
+ </style>
+
+ <style name="MediaPlayer.ProgressBar" parent="@android:style/Widget.ProgressBar.Horizontal">
+ <item name="android:thumbTint">?android:attr/textColorPrimary</item>
+ <item name="android:progressTint">?android:attr/textColorPrimary</item>
+ <item name="android:progressBackgroundTint">?android:attr/textColorTertiary</item>
+ <item name="android:clickable">true</item>
+ <item name="android:splitTrack">false</item>
+ </style>
+
+ <style name="MediaPlayer.Subtitle" parent="MediaPlayer">
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
+ </style>
+
+ <style name="MediaPlayer.Action" parent="@android:style/Widget.Material.Button.Borderless.Small">
<item name="android:background">@drawable/qs_media_light_source</item>
<item name="android:tint">?android:attr/textColorPrimary</item>
<item name="android:stateListAnimator">@anim/media_button_state_list_animator</item>
</style>
+ <style name="MediaPlayer.OutlineButton">
+ <item name="android:background">@drawable/qs_media_button_background</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:backgroundTint">?androidprv:attr/colorAccentPrimaryVariant</item>
+ <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
+ </style>
+
+ <style name="MediaPlayer.SolidButton">
+ <item name="android:backgroundTint">?android:attr/colorAccent</item>
+ <item name="android:tint">?android:attr/colorPrimary</item>
+ <item name="android:textColor">?android:attr/colorPrimary</item>
+ </style>
+
+ <style name="MediaPlayer.AppIcon">
+ <item name="android:background">@drawable/qs_media_icon_background</item>
+ <item name="android:backgroundTint">?android:attr/colorPrimary</item>
+ <item name="android:tint">?android:attr/colorAccent</item>
+ </style>
+
+ <style name="MediaPlayer.Album">
+ <item name="android:backgroundTint">?androidprv:attr/colorAccentSecondary</item>
+
+ </style>
+
<!-- Used to style charging animation AVD animation -->
<style name="ChargingAnim" />
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
index b7a2c64dd107..2325b554d507 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
@@ -76,7 +76,7 @@ public class KeyguardPINView extends KeyguardPinBasedInputView {
protected void onFinishInflate() {
super.onFinishInflate();
- mContainer = findViewById(R.id.container);
+ mContainer = findViewById(R.id.pin_container);
mRow0 = findViewById(R.id.row0);
mRow1 = findViewById(R.id.row1);
mRow2 = findViewById(R.id.row2);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
index d4513384c569..98e7fb48b7a6 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
@@ -97,7 +97,7 @@ public class KeyguardPatternView extends KeyguardInputView
mLockPatternView = findViewById(R.id.lockPatternView);
mEcaView = findViewById(R.id.keyguard_selector_fade_container);
- mContainer = findViewById(R.id.container);
+ mContainer = findViewById(R.id.pattern_container);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java
index f28d1137f3e7..7f183798709c 100644
--- a/packages/SystemUI/src/com/android/systemui/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/Prefs.java
@@ -73,8 +73,7 @@ public final class Prefs {
Key.TOUCHED_RINGER_TOGGLE,
Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP,
Key.HAS_SEEN_REVERSE_BOTTOM_SHEET,
- Key.CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT,
- Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S
+ Key.CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT
})
// TODO: annotate these with their types so {@link PrefsCommandLine} can know how to set them
public @interface Key {
@@ -123,8 +122,6 @@ public final class Prefs {
String HAS_SEEN_ODI_CAPTIONS_TOOLTIP = "HasSeenODICaptionsTooltip";
String HAS_SEEN_REVERSE_BOTTOM_SHEET = "HasSeenReverseBottomSheet";
String CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT = "ControlsStructureSwipeTooltipCount";
- /** Tracks whether the user has seen the onboarding screen for priority conversations */
- String HAS_SEEN_PRIORITY_ONBOARDING_IN_S = "HasUserSeenPriorityOnboardingInS";
}
public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) {
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
index 58881d9a33f4..c821d100f553 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
@@ -35,7 +35,6 @@ import com.android.systemui.dagger.qualifiers.TestHarness;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.util.sensors.ThresholdSensor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -317,7 +316,7 @@ public class BrightLineFalsingManager implements FalsingManager {
}
@Override
- public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
+ public void onProximityEvent(ProximityEvent proximityEvent) {
// TODO: some of these classifiers might allow us to abort early, meaning we don't have to
// make these calls.
mClassifiers.forEach((classifier) -> classifier.onProximityEvent(proximityEvent));
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java
index 81b9f66e9bc3..d75752841023 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java
@@ -18,7 +18,7 @@ package com.android.systemui.classifier;
import android.view.MotionEvent;
-import com.android.systemui.util.sensors.ProximitySensor;
+import com.android.systemui.plugins.FalsingManager;
import java.util.List;
@@ -110,7 +110,7 @@ public abstract class FalsingClassifier {
/**
* Called when a ProximityEvent occurs (change in near/far).
*/
- void onProximityEvent(ProximitySensor.ThresholdSensorEvent proximityEvent) {}
+ void onProximityEvent(FalsingManager.ProximityEvent proximityEvent) {}
/**
* The phone screen has turned on and we need to begin falsing detection.
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index 94e5c8ad1536..0f202b085851 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -361,7 +361,7 @@ class FalsingCollectorImpl implements FalsingCollector {
private void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
// TODO: some of these classifiers might allow us to abort early, meaning we don't have to
// make these calls.
- mFalsingManager.onProximityEvent(proximityEvent);
+ mFalsingManager.onProximityEvent(new ProximityEventImpl(proximityEvent));
}
@@ -374,4 +374,21 @@ class FalsingCollectorImpl implements FalsingCollector {
Log.d(TAG, msg, throwable);
}
}
+
+ private static class ProximityEventImpl implements FalsingManager.ProximityEvent {
+ private ThresholdSensor.ThresholdSensorEvent mThresholdSensorEvent;
+
+ ProximityEventImpl(ThresholdSensor.ThresholdSensorEvent thresholdSensorEvent) {
+ mThresholdSensorEvent = thresholdSensorEvent;
+ }
+ @Override
+ public boolean getCovered() {
+ return mThresholdSensorEvent.getBelow();
+ }
+
+ @Override
+ public long getTimestampNs() {
+ return mThresholdSensorEvent.getTimestampNs();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
index e8445d40836e..ee69e277cc46 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
@@ -20,7 +20,6 @@ import android.net.Uri;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.util.sensors.ThresholdSensor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -133,7 +132,7 @@ public class FalsingManagerFake implements FalsingManager {
}
@Override
- public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
+ public void onProximityEvent(ProximityEvent proximityEvent) {
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
index 6b819fbbbcf1..ee0dba0a5087 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
@@ -31,7 +31,6 @@ import com.android.systemui.plugins.FalsingPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.util.DeviceConfigProxy;
-import com.android.systemui.util.sensors.ThresholdSensor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -186,7 +185,7 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable {
}
@Override
- public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
+ public void onProximityEvent(ProximityEvent proximityEvent) {
mInternalFalsingManager.onProximityEvent(proximityEvent);
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java
index 72d4303dc0ef..32d9ca59951d 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java
@@ -25,8 +25,8 @@ import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
import android.provider.DeviceConfig;
import android.view.MotionEvent;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.util.DeviceConfigProxy;
-import com.android.systemui.util.sensors.ProximitySensor;
import java.util.Locale;
@@ -107,11 +107,11 @@ class ProximityClassifier extends FalsingClassifier {
@Override
public void onProximityEvent(
- ProximitySensor.ThresholdSensorEvent proximityEvent) {
- boolean near = proximityEvent.getBelow();
+ FalsingManager.ProximityEvent proximityEvent) {
+ boolean covered = proximityEvent.getCovered();
long timestampNs = proximityEvent.getTimestampNs();
- logDebug("Sensor is: " + near + " at time " + timestampNs);
- update(near, timestampNs);
+ logDebug("Sensor is: " + covered + " at time " + timestampNs);
+ update(covered, timestampNs);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index 6a2d0afa813b..24503675ae36 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -3,7 +3,6 @@ package com.android.systemui.media
import android.app.smartspace.SmartspaceTarget
import android.content.Context
import android.content.Intent
-import android.content.res.ColorStateList
import android.content.res.Configuration
import android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS
import android.util.Log
@@ -116,7 +115,6 @@ class MediaCarouselController @Inject constructor(
private var needsReordering: Boolean = false
private var keysNeedRemoval = mutableSetOf<String>()
private var bgColor = getBackgroundColor()
- private var fgColor = getForegroundColor()
private var isRtl: Boolean = false
set(value) {
if (value != field) {
@@ -276,10 +274,6 @@ class MediaCarouselController @Inject constructor(
}
private fun addOrUpdatePlayer(key: String, oldKey: String?, data: MediaData) {
- data.actions.forEach {
- it.icon?.setTintList(ColorStateList.valueOf(fgColor))
- }
- data.appIcon?.setTintList(ColorStateList.valueOf(fgColor))
val dataCopy = data.copy(backgroundColor = bgColor)
val existingPlayer = MediaPlayerData.getMediaPlayer(key, oldKey)
if (existingPlayer == null) {
@@ -328,7 +322,7 @@ class MediaCarouselController @Inject constructor(
val lp = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT)
newRecs.recommendationViewHolder?.recommendations?.setLayoutParams(lp)
- newRecs.bindRecommendation(data, fgColor, bgColor)
+ newRecs.bindRecommendation(data, bgColor)
MediaPlayerData.addMediaPlayer(key, newRecs)
updatePlayerToState(newRecs, noAnimation = true)
reorderAllPlayers()
@@ -368,8 +362,6 @@ class MediaCarouselController @Inject constructor(
private fun recreatePlayers() {
bgColor = getBackgroundColor()
- fgColor = getForegroundColor()
- pageIndicator.tintList = ColorStateList.valueOf(fgColor)
MediaPlayerData.mediaData().forEach { (key, data) ->
removePlayer(key, dismissMediaData = false)
@@ -381,11 +373,6 @@ class MediaCarouselController @Inject constructor(
return context.getColor(android.R.color.system_accent2_50)
}
- private fun getForegroundColor(): Int {
- return com.android.settingslib.Utils.getColorAttr(context,
- com.android.internal.R.attr.textColorPrimary).defaultColor
- }
-
private fun updatePageIndicator() {
val numPages = mediaContent.getChildCount()
pageIndicator.setNumPages(numPages)
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index ed16777110c9..1e9cc8cb08cc 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -265,9 +265,6 @@ public class MediaControlPanel {
ConstraintSet expandedSet = mMediaViewController.getExpandedLayout();
ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout();
- mPlayerViewHolder.getPlayer().setBackgroundTintList(
- ColorStateList.valueOf(mBackgroundColor));
-
// Click action
PendingIntent clickIntent = data.getClickIntent();
if (clickIntent != null) {
@@ -465,15 +462,11 @@ public class MediaControlPanel {
/** Bind this recommendation view based on the data given. */
public void bindRecommendation(
@NonNull SmartspaceTarget target,
- @NonNull int primaryColor,
@NonNull int backgroundColor) {
if (mRecommendationViewHolder == null) {
return;
}
- mRecommendationViewHolder.getCardIcon().setColorFilter(primaryColor);
- mRecommendationViewHolder.getCardText().setTextColor(primaryColor);
-
mInstanceId = target.getSmartspaceTargetId().hashCode();
mRecommendationViewHolder.getRecommendations()
.setBackgroundTintList(ColorStateList.valueOf(backgroundColor));
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index c552e89a3625..aa4fb712090b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -7,7 +7,6 @@ import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.content.Context;
import android.content.res.Configuration;
-import android.content.res.Resources;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
@@ -333,11 +332,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
@Override
public boolean updateResources() {
- // Update bottom padding, useful for removing extra space once the panel page indicator is
- // hidden.
- Resources res = getContext().getResources();
- setPageMargin(res.getDimensionPixelOffset(R.dimen.qs_tile_margin_horizontal));
-
setPadding(0, 0, 0,
getContext().getResources().getDimensionPixelSize(
R.dimen.qs_paged_tile_layout_padding_bottom));
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index f486c535d9e2..3b436769a456 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -207,11 +207,12 @@ public class QSContainerImpl extends FrameLayout {
mContext.getResources().getDimensionPixelSize(R.dimen.qs_container_bottom_padding)
);
- mSideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings);
+ int sideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings);
int padding = getResources().getDimensionPixelSize(
R.dimen.notification_shade_content_margin_horizontal);
- boolean marginsChanged = padding != mContentPadding;
+ boolean marginsChanged = padding != mContentPadding || sideMargins != mSideMargins;
mContentPadding = padding;
+ mSideMargins = sideMargins;
if (marginsChanged) {
updatePaddingsAndMargins(qsPanelController, quickStatusBarHeaderController);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index e3f00f42d2ca..c69956f90c67 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -55,9 +55,13 @@ public class QuickStatusBarHeader extends FrameLayout {
private TouchAnimator mAlphaAnimator;
private TouchAnimator mTranslationAnimator;
+ private TouchAnimator mIconsAlphaAnimator;
+ private TouchAnimator mIconsAlphaAnimatorFixed;
protected QuickQSPanel mHeaderQsPanel;
private View mDatePrivacyView;
+ private View mDateView;
+ private View mSecurityHeaderView;
private View mClockIconsView;
private View mContainer;
@@ -66,7 +70,7 @@ public class QuickStatusBarHeader extends FrameLayout {
private Space mSpace;
private BatteryMeterView mBatteryRemainingIcon;
private StatusIconContainer mIconContainer;
-
+ private View mPrivacyChip;
private TintedIconManager mTintedIconManager;
private QSExpansionPathInterpolator mQSExpansionPathInterpolator;
@@ -79,7 +83,6 @@ public class QuickStatusBarHeader extends FrameLayout {
private int mCutOutPaddingLeft;
private int mCutOutPaddingRight;
private float mClockIconsAlpha = 1.0f;
- private float mDatePrivacyAlpha = 1.0f;
private float mKeyguardExpansionFraction;
private int mTextColorPrimary = Color.TRANSPARENT;
private int mTopViewMeasureHeight;
@@ -111,8 +114,11 @@ public class QuickStatusBarHeader extends FrameLayout {
mDatePrivacyView = findViewById(R.id.quick_status_bar_date_privacy);
mClockIconsView = findViewById(R.id.quick_qs_status_icons);
mQSCarriers = findViewById(R.id.carrier_group);
- mContainer = findViewById(R.id.container);
+ mContainer = findViewById(R.id.qs_container);
mIconContainer = findViewById(R.id.statusIcons);
+ mPrivacyChip = findViewById(R.id.privacy_chip);
+ mDateView = findViewById(R.id.date);
+ mSecurityHeaderView = findViewById(R.id.header_text_container);
mClockView = findViewById(R.id.clock);
mSpace = findViewById(R.id.space);
@@ -126,6 +132,11 @@ public class QuickStatusBarHeader extends FrameLayout {
// QS will always show the estimate, and BatteryMeterView handles the case where
// it's unavailable or charging
mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE);
+
+ mIconsAlphaAnimatorFixed = new TouchAnimator.Builder()
+ .addFloat(mIconContainer, "alpha", 0, 1)
+ .addFloat(mBatteryRemainingIcon, "alpha", 0, 1)
+ .build();
}
void onAttach(TintedIconManager iconManager,
@@ -226,8 +237,12 @@ public class QuickStatusBarHeader extends FrameLayout {
StatusBarIconView callStrengthIcon =
((StatusBarIconView) mIconContainer.getViewForSlot(mCallStrengthSlotName));
TouchAnimator.Builder builder = new TouchAnimator.Builder()
- .addFloat(mQSCarriers, "alpha", 0, 1)
- .addFloat(mDatePrivacyView, "alpha", 0, mDatePrivacyAlpha);
+ // The following two views have to be hidden manually, so as not to hide the
+ // Privacy chip in QQS
+ .addFloat(mDateView, "alpha", 0, 1)
+ .addFloat(mSecurityHeaderView, "alpha", 0, 1)
+ .addFloat(mQSCarriers, "alpha", 0, 1);
+
if (noCallingIcon != null || callStrengthIcon != null) {
if (noCallingIcon != null) {
builder.addFloat(noCallingIcon, "alpha", 1, 0);
@@ -259,6 +274,20 @@ public class QuickStatusBarHeader extends FrameLayout {
mAlphaAnimator = builder.build();
}
+ void setChipVisibility(boolean visibility) {
+ mPrivacyChip.setVisibility(visibility ? View.VISIBLE : View.GONE);
+ if (visibility) {
+ // Animates the icons and battery indicator from alpha 0 to 1, when the chip is visible
+ mIconsAlphaAnimator = mIconsAlphaAnimatorFixed;
+ mIconsAlphaAnimator.setPosition(mKeyguardExpansionFraction);
+ } else {
+ mIconsAlphaAnimator = null;
+ mIconContainer.setAlpha(1);
+ mBatteryRemainingIcon.setAlpha(1);
+ }
+
+ }
+
/** */
public void setExpanded(boolean expanded, QuickQSPanelController quickQSPanelController) {
if (mExpanded == expanded) return;
@@ -285,6 +314,9 @@ public class QuickStatusBarHeader extends FrameLayout {
if (mTranslationAnimator != null) {
mTranslationAnimator.setPosition(keyguardExpansionFraction);
}
+ if (mIconsAlphaAnimator != null) {
+ mIconsAlphaAnimator.setPosition(keyguardExpansionFraction);
+ }
// If forceExpanded (we are opening QS from lockscreen), the animators have been set to
// position = 1f.
if (forceExpanded) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
index 3aafea98ff2a..617b067be891 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
@@ -225,7 +225,6 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
private void setChipVisibility(boolean chipVisible) {
if (chipVisible && getChipEnabled()) {
- mPrivacyChip.setVisibility(View.VISIBLE);
mPrivacyLogger.logChipVisible(true);
// Makes sure that the chip is logged as viewed at most once each time QS is opened
// mListening makes sure that the callback didn't return after the user closed QS
@@ -235,8 +234,8 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
}
} else {
mPrivacyLogger.logChipVisible(false);
- mPrivacyChip.setVisibility(View.GONE);
}
+ mView.setChipVisibility(chipVisible);
}
private List<String> getIgnoredIconSlots() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt b/packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt
index 1da42a705311..78e85f1e6f73 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt
@@ -168,7 +168,6 @@ private class PrefsCommand(val context: Context) : Command {
when (topLevel) {
"list-prefs" -> listPrefs(pw)
- "set-pref" -> setPref(pw, args.drop(1))
else -> help(pw)
}
}
@@ -180,25 +179,4 @@ private class PrefsCommand(val context: Context) : Command {
pw.println(field.get(Prefs.Key::class.java))
}
}
-
- /**
- * Sets a preference from [Prefs]
- */
- private fun setPref(pw: PrintWriter, args: List<String>) {
- if (args.isEmpty()) {
- pw.println("invalid arguments: $args")
- return
- }
- val pref = args[0]
-
- when (pref) {
- Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S -> {
- val value = Integer.parseInt(args[1])
- Prefs.putBoolean(context, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, value != 0)
- }
- else -> {
- pw.println("Cannot set pref ($pref)")
- }
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
index 5ab71bc62fe6..b3f7ca6f2630 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
@@ -29,6 +29,8 @@ import com.android.systemui.animation.Interpolators
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.statusbar.phone.StatusBarLocationPublisher
+import com.android.systemui.statusbar.phone.StatusBarMarginUpdatedListener
import java.lang.IllegalStateException
import java.util.concurrent.Executor
@@ -51,8 +53,9 @@ import javax.inject.Inject
@SysUISingleton
class PrivacyDotViewController @Inject constructor(
- @Main val mainExecutor: Executor,
- val animationScheduler: SystemStatusAnimationScheduler
+ @Main private val mainExecutor: Executor,
+ private val locationPublisher: StatusBarLocationPublisher,
+ private val animationScheduler: SystemStatusAnimationScheduler
) {
private var rotation = 0
private var leftSize = 0
@@ -80,12 +83,21 @@ class PrivacyDotViewController @Inject constructor(
private val views: Sequence<View>
get() = if (!this::tl.isInitialized) sequenceOf() else sequenceOf(tl, tr, br, bl)
+ init {
+ locationPublisher.addCallback(object : StatusBarMarginUpdatedListener {
+ override fun onStatusBarMarginUpdated(marginLeft: Int, marginRight: Int) {
+ setStatusBarMargins(marginLeft, marginRight)
+ }
+ })
+ }
+
fun setUiExecutor(e: Executor) {
uiExecutor = e
}
@UiThread
fun updateRotation(rot: Int) {
+ dlog("updateRotation: ")
if (rot == rotation) {
return
}
@@ -248,7 +260,7 @@ class PrivacyDotViewController @Inject constructor(
* @param left the space between the status bar contents and the left side of the screen
* @param right space between the status bar contents and the right side of the screen
*/
- fun setStatusBarMargins(left: Int, right: Int) {
+ private fun setStatusBarMargins(left: Int, right: Int) {
leftSize = left
rightSize = right
@@ -262,6 +274,7 @@ class PrivacyDotViewController @Inject constructor(
}
private fun doUpdates(rot: Boolean, height: Boolean, width: Boolean) {
+ dlog("doUpdates: ")
var newDesignatedCorner: View? = null
if (rot) {
@@ -324,12 +337,19 @@ class PrivacyDotViewController @Inject constructor(
}
}
+private fun dlog(s: String) {
+ if (DEBUG) {
+ Log.d(TAG, s)
+ }
+}
+
const val TOP_LEFT = 0
const val TOP_RIGHT = 1
const val BOTTOM_RIGHT = 2
const val BOTTOM_LEFT = 3
private const val DURATION = 160L
private const val TAG = "PrivacyDotViewController"
+private const val DEBUG = false
private fun Int.toGravity(): Int {
return when (this) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt
index 620963060b49..b861c1db9b8b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt
@@ -27,6 +27,7 @@ import android.widget.FrameLayout
import com.android.systemui.R
import com.android.systemui.statusbar.SuperStatusBarViewFactory
+import com.android.systemui.statusbar.phone.StatusBarLocationPublisher
import com.android.systemui.statusbar.phone.StatusBarWindowController
import com.android.systemui.statusbar.phone.StatusBarWindowView
@@ -39,7 +40,8 @@ import javax.inject.Inject
class SystemEventChipAnimationController @Inject constructor(
private val context: Context,
private val statusBarViewFactory: SuperStatusBarViewFactory,
- private val statusBarWindowController: StatusBarWindowController
+ private val statusBarWindowController: StatusBarWindowController,
+ private val locationPublisher: StatusBarLocationPublisher
) : SystemStatusChipAnimationCallback {
var showPersistentDot = false
set(value) {
@@ -64,13 +66,15 @@ class SystemEventChipAnimationController @Inject constructor(
if (state == ANIMATING_IN) {
currentAnimatedView = viewCreator(context)
- animationWindowView.addView(currentAnimatedView, layoutParamsDefault)
+ animationWindowView.addView(currentAnimatedView, layoutParamsDefault())
// We are animating IN; chip comes in from View.END
currentAnimatedView?.apply {
- translationX = width.toFloat()
+ val translation = width.toFloat()
+ translationX = if (isLayoutRtl) -translation else translation
alpha = 0f
visibility = View.VISIBLE
+ setPadding(locationPublisher.marginLeft, 0, locationPublisher.marginRight, 0)
}
} else {
// We are animating away
@@ -109,7 +113,7 @@ class SystemEventChipAnimationController @Inject constructor(
val w = width
val translation = (1 - amt) * w
- translationX = translation
+ translationX = if (isLayoutRtl) -translation else translation
}
}
@@ -131,7 +135,13 @@ class SystemEventChipAnimationController @Inject constructor(
statusBarWindowView.addView(animationWindowView, lp)
}
- private val layoutParamsDefault = FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).also {
- it.gravity = Gravity.END or Gravity.CENTER_VERTICAL
+ private fun start() = if (animationWindowView.isLayoutRtl) right() else left()
+ private fun right() = locationPublisher.marginRight
+ private fun left() = locationPublisher.marginLeft
+
+ private fun layoutParamsDefault(): FrameLayout.LayoutParams =
+ FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).also {
+ it.gravity = Gravity.END or Gravity.CENTER_VERTICAL
+ it.marginStart = start()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt
index 1e071312065b..40049373610c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt
@@ -127,7 +127,6 @@ class SystemStatusAnimationScheduler @Inject constructor(
}
private fun isTooEarly(): Boolean {
- Log.d(TAG, "time=> ${systemClock.uptimeMillis() - Process.getStartUptimeMillis()}")
return systemClock.uptimeMillis() - Process.getStartUptimeMillis() < MIN_UPTIME
}
@@ -339,4 +338,4 @@ private const val ENTRANCE_ANIM_LENGTH = 500L
private const val CHIP_ANIM_LENGTH = 500L
private const val MIN_UPTIME: Long = 5 * 1000
-private const val DEBUG = false \ No newline at end of file
+private const val DEBUG = false
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
index 617dadb42594..e2a37f647bf5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
@@ -69,7 +69,6 @@ import com.android.systemui.statusbar.notification.logging.NotificationPanelLogg
import com.android.systemui.statusbar.notification.row.ChannelEditorDialogController;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
-import com.android.systemui.statusbar.notification.row.PriorityOnboardingDialogController;
import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager;
import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm;
import com.android.systemui.statusbar.phone.ShadeController;
@@ -141,7 +140,6 @@ public interface NotificationsModule {
ShortcutManager shortcutManager,
ChannelEditorDialogController channelEditorDialogController,
UserContextProvider contextTracker,
- Provider<PriorityOnboardingDialogController.Builder> builderProvider,
AssistantFeedbackController assistantFeedbackController,
Optional<BubblesManager> bubblesManagerOptional,
UiEventLogger uiEventLogger,
@@ -161,7 +159,6 @@ public interface NotificationsModule {
shortcutManager,
channelEditorDialogController,
contextTracker,
- builderProvider,
assistantFeedbackController,
bubblesManagerOptional,
uiEventLogger,
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 40be4bfa47dc..1f4f3caea517 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
@@ -22,6 +22,8 @@ import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
+import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_ANYONE;
+import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_IMPORTANT;
import static com.android.systemui.animation.Interpolators.FAST_OUT_SLOW_IN;
@@ -34,7 +36,6 @@ import android.app.INotificationManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
-import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -55,7 +56,6 @@ import android.transition.TransitionManager;
import android.transition.TransitionSet;
import android.util.AttributeSet;
import android.util.Log;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageView;
@@ -64,7 +64,6 @@ import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.notification.ConversationIconFactory;
-import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
@@ -78,8 +77,6 @@ import com.android.systemui.wmshell.BubblesManager;
import java.lang.annotation.Retention;
import java.util.Optional;
-import javax.inject.Provider;
-
/**
* The guts of a conversation notification revealed when performing a long press.
*/
@@ -107,7 +104,6 @@ public class NotificationConversationInfo extends LinearLayout implements
private StatusBarNotification mSbn;
@Nullable private Notification.BubbleMetadata mBubbleMetadata;
private Context mUserContext;
- private Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider;
private boolean mIsDeviceProvisioned;
private int mAppBubble;
@@ -172,13 +168,9 @@ public class NotificationConversationInfo extends LinearLayout implements
private OnClickListener mOnDone = v -> {
mPressedApply = true;
- // If the user selected Priority, maybe show the priority onboarding.
// If the user selected Priority and the previous selection was not priority, show a
- // People Tile add request. If showing the priority onboarding, however, delay the request
- // to when the onboarding dialog closes.
- if (mSelectedAction == ACTION_FAVORITE && shouldShowPriorityOnboarding()) {
- showPriorityOnboarding();
- } else if (mSelectedAction == ACTION_FAVORITE && getPriority() != mSelectedAction) {
+ // People Tile add request.
+ if (mSelectedAction == ACTION_FAVORITE && getPriority() != mSelectedAction) {
mShadeController.animateCollapsePanels();
mPeopleSpaceWidgetManager.requestPinAppWidget(mShortcutInfo, new Bundle());
}
@@ -229,7 +221,6 @@ public class NotificationConversationInfo extends LinearLayout implements
OnSnoozeClickListener onSnoozeClickListener,
ConversationIconFactory conversationIconFactory,
Context userContext,
- Provider<PriorityOnboardingDialogController.Builder> builderProvider,
boolean isDeviceProvisioned,
@Main Handler mainHandler,
@Background Handler bgHandler,
@@ -258,7 +249,6 @@ public class NotificationConversationInfo extends LinearLayout implements
mBubbleMetadata = bubbleMetadata;
mBubblesManagerOptional = bubblesManagerOptional;
mShadeController = shadeController;
- mBuilderProvider = builderProvider;
mMainHandler = mainHandler;
mBgHandler = bgHandler;
mShortcutManager = shortcutManager;
@@ -342,6 +332,18 @@ public class NotificationConversationInfo extends LinearLayout implements
// bindName();
bindPackage();
bindIcon(mNotificationChannel.isImportantConversation());
+
+ mPriorityDescriptionView = findViewById(R.id.priority_summary);
+ if (willShowAsBubble() && willBypassDnd()) {
+ mPriorityDescriptionView.setText(R.string.notification_channel_summary_priority_all);
+ } else if (willShowAsBubble()) {
+ mPriorityDescriptionView.setText(R.string.notification_channel_summary_priority_bubble);
+ } else if (willBypassDnd()) {
+ mPriorityDescriptionView.setText(R.string.notification_channel_summary_priority_dnd);
+ } else {
+ mPriorityDescriptionView.setText(
+ R.string.notification_channel_summary_priority_baseline);
+ }
}
private void bindIcon(boolean important) {
@@ -428,7 +430,6 @@ public class NotificationConversationInfo extends LinearLayout implements
protected void onFinishInflate() {
super.onFinishInflate();
- mPriorityDescriptionView = findViewById(R.id.priority_summary);
mDefaultDescriptionView = findViewById(R.id.default_summary);
mSilentDescriptionView = findViewById(R.id.silence_summary);
}
@@ -552,51 +553,22 @@ public class NotificationConversationInfo extends LinearLayout implements
StackStateAnimator.ANIMATION_DURATION_STANDARD);
}
- private boolean shouldShowPriorityOnboarding() {
- return !Prefs.getBoolean(mUserContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, false);
- }
-
- private void showPriorityOnboarding() {
- View onboardingView = LayoutInflater.from(mContext)
- .inflate(R.layout.priority_onboarding_half_shell, null);
-
- boolean ignoreDnd = false;
+ private boolean willBypassDnd() {
+ boolean bypassesDnd = false;
try {
- ignoreDnd = mINotificationManager
- .getConsolidatedNotificationPolicy().priorityConversationSenders ==
- NotificationManager.Policy.CONVERSATION_SENDERS_IMPORTANT;
+ int allowedSenders = mINotificationManager
+ .getConsolidatedNotificationPolicy().priorityConversationSenders;
+ bypassesDnd = allowedSenders == CONVERSATION_SENDERS_IMPORTANT
+ || allowedSenders == CONVERSATION_SENDERS_ANYONE;
} catch (RemoteException e) {
Log.e(TAG, "Could not check conversation senders", e);
}
+ return bypassesDnd;
+ }
- boolean showAsBubble = mBubbleMetadata != null
- && mBubbleMetadata.getAutoExpandBubble()
+ private boolean willShowAsBubble() {
+ return mBubbleMetadata != null
&& BubblesManager.areBubblesEnabled(mContext, mSbn.getUser());
-
- Drawable person = mIconFactory.getBaseIconDrawable(mShortcutInfo);
- if (person == null) {
- person = mContext.getDrawable(R.drawable.ic_person).mutate();
- TypedArray ta = mContext.obtainStyledAttributes(new int[]{android.R.attr.colorAccent});
- int colorAccent = ta.getColor(0, 0);
- ta.recycle();
- person.setTint(colorAccent);
- }
-
- PriorityOnboardingDialogController controller = mBuilderProvider.get()
- .setContext(mUserContext)
- .setView(onboardingView)
- .setIgnoresDnd(ignoreDnd)
- .setShowsAsBubble(showAsBubble)
- .setIcon(person)
- .setBadge(mIconFactory.getAppBadge(
- mPackageName, UserHandle.getUserId(mSbn.getUid())))
- .setOnSettingsClick(mOnConversationSettingsClickListener)
- .setPeopleSpaceWidgetManager(mPeopleSpaceWidgetManager)
- .setShadeController(mShadeController)
- .build();
-
- controller.init(mShortcutInfo);
- controller.show();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
index 1a7f5b0bf5af..59b88a53b45e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
@@ -129,7 +129,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
private final LauncherApps mLauncherApps;
private final ShortcutManager mShortcutManager;
private final UserContextProvider mContextTracker;
- private final Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider;
private final UiEventLogger mUiEventLogger;
private final ShadeController mShadeController;
private final AppWidgetManager mAppWidgetManager;
@@ -150,7 +149,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
ShortcutManager shortcutManager,
ChannelEditorDialogController channelEditorDialogController,
UserContextProvider contextTracker,
- Provider<PriorityOnboardingDialogController.Builder> builderProvider,
AssistantFeedbackController assistantFeedbackController,
Optional<BubblesManager> bubblesManagerOptional,
UiEventLogger uiEventLogger,
@@ -168,7 +166,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
mLauncherApps = launcherApps;
mShortcutManager = shortcutManager;
mContextTracker = contextTracker;
- mBuilderProvider = builderProvider;
mChannelEditorDialogController = channelEditorDialogController;
mAssistantFeedbackController = assistantFeedbackController;
mBubblesManagerOptional = bubblesManagerOptional;
@@ -503,7 +500,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
onSnoozeClickListener,
iconFactoryLoader,
mContextTracker.getUserContext(),
- mBuilderProvider,
mDeviceProvisionedController.isDeviceProvisioned(),
mMainHandler,
mBgHandler,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt
deleted file mode 100644
index 270721ffa4b8..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.notification.row
-
-import android.animation.Animator
-import android.animation.AnimatorListenerAdapter
-import android.animation.AnimatorSet
-import android.animation.ValueAnimator
-import android.app.Dialog
-import android.content.Context
-import android.content.pm.ShortcutInfo
-import android.graphics.Color
-import android.graphics.PixelFormat
-import android.graphics.drawable.ColorDrawable
-import android.graphics.drawable.Drawable
-import android.graphics.drawable.GradientDrawable
-import android.os.Bundle
-import android.text.SpannableStringBuilder
-import android.text.style.BulletSpan
-import android.view.Gravity
-import android.view.View
-import android.view.ViewGroup.LayoutParams.MATCH_PARENT
-import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
-import android.view.Window
-import android.view.WindowInsets.Type.statusBars
-import android.view.WindowManager
-import android.view.animation.Interpolator
-import android.view.animation.PathInterpolator
-import android.widget.ImageView
-import android.widget.TextView
-import com.android.systemui.Prefs
-import com.android.systemui.R
-import com.android.systemui.animation.Interpolators.LINEAR_OUT_SLOW_IN
-import com.android.systemui.people.widget.PeopleSpaceWidgetManager
-import com.android.systemui.statusbar.notification.row.NotificationConversationInfo.OnConversationSettingsClickListener
-import com.android.systemui.statusbar.phone.ShadeController
-import javax.inject.Inject
-
-/**
- * Controller to handle presenting the priority conversations onboarding dialog
- */
-class PriorityOnboardingDialogController @Inject constructor(
- val view: View,
- val context: Context,
- private val ignoresDnd: Boolean,
- private val showsAsBubble: Boolean,
- val icon: Drawable,
- private val onConversationSettingsClickListener: OnConversationSettingsClickListener,
- val badge: Drawable,
- private val peopleSpaceWidgetManager: PeopleSpaceWidgetManager,
- private val shadeController: ShadeController
-) {
-
- private lateinit var dialog: Dialog
- private lateinit var shortcutInfo: ShortcutInfo
- private val OVERSHOOT: Interpolator = PathInterpolator(0.4f, 0f, 0.2f, 1.4f)
- private val IMPORTANCE_ANIM_DELAY = 150L
- private val IMPORTANCE_ANIM_GROW_DURATION = 250L
- private val IMPORTANCE_ANIM_SHRINK_DURATION = 200L
- private val IMPORTANCE_ANIM_SHRINK_DELAY = 25L
-
- fun init(info: ShortcutInfo) {
- shortcutInfo = info
- initDialog()
- }
-
- fun show() {
- dialog.show()
- }
-
- private fun done() {
- // Log that the user has seen the onboarding
- Prefs.putBoolean(context, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true)
- dialog.dismiss()
- shadeController.animateCollapsePanels()
- peopleSpaceWidgetManager.requestPinAppWidget(shortcutInfo, Bundle())
- }
-
- private fun settings() {
- // Log that the user has seen the onboarding
- Prefs.putBoolean(context, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true)
- dialog.dismiss()
- onConversationSettingsClickListener?.onClick()
- }
-
- class Builder @Inject constructor() {
- private lateinit var view: View
- private lateinit var context: Context
- private var ignoresDnd = false
- private var showAsBubble = false
- private lateinit var icon: Drawable
- private lateinit var onConversationSettingsClickListener:
- OnConversationSettingsClickListener
- private lateinit var badge: Drawable
- private lateinit var peopleSpaceWidgetManager: PeopleSpaceWidgetManager
- private lateinit var shadeController: ShadeController
-
- fun setView(v: View): Builder {
- view = v
- return this
- }
-
- fun setContext(c: Context): Builder {
- context = c
- return this
- }
-
- fun setIgnoresDnd(ignore: Boolean): Builder {
- ignoresDnd = ignore
- return this
- }
-
- fun setShowsAsBubble(bubble: Boolean): Builder {
- showAsBubble = bubble
- return this
- }
-
- fun setIcon(draw: Drawable): Builder {
- icon = draw
- return this
- }
- fun setBadge(badge: Drawable): Builder {
- this.badge = badge
- return this
- }
-
- fun setOnSettingsClick(onClick: OnConversationSettingsClickListener): Builder {
- onConversationSettingsClickListener = onClick
- return this
- }
-
- fun setShadeController(shadeController: ShadeController): Builder {
- this.shadeController = shadeController
- return this
- }
-
- fun setPeopleSpaceWidgetManager(peopleSpaceWidgetManager: PeopleSpaceWidgetManager):
- Builder {
- this.peopleSpaceWidgetManager = peopleSpaceWidgetManager
- return this
- }
-
- fun build(): PriorityOnboardingDialogController {
- val controller = PriorityOnboardingDialogController(
- view, context, ignoresDnd, showAsBubble, icon,
- onConversationSettingsClickListener, badge, peopleSpaceWidgetManager,
- shadeController)
- return controller
- }
- }
-
- private fun initDialog() {
- dialog = Dialog(context)
-
- if (dialog.window == null) {
- throw IllegalStateException("Need a window for the onboarding dialog to show")
- }
-
- dialog.window?.requestFeature(Window.FEATURE_NO_TITLE)
- // Prevent a11y readers from reading the first element in the dialog twice
- dialog.setTitle("\u00A0")
- dialog.apply {
- setContentView(view)
- setCanceledOnTouchOutside(true)
-
- findViewById<TextView>(R.id.done_button)?.setOnClickListener {
- done()
- }
-
- findViewById<TextView>(R.id.settings_button)?.setOnClickListener {
- settings()
- }
-
- findViewById<ImageView>(R.id.conversation_icon)?.setImageDrawable(icon)
- findViewById<ImageView>(R.id.icon)?.setImageDrawable(badge)
- val mImportanceRingView = findViewById<ImageView>(R.id.conversation_icon_badge_ring)
- val conversationIconBadgeBg = findViewById<ImageView>(R.id.conversation_icon_badge_bg)
-
- val ring: GradientDrawable = mImportanceRingView.drawable as GradientDrawable
- ring.mutate()
- val bg = conversationIconBadgeBg.drawable as GradientDrawable
- bg.mutate()
- val ringColor = context.getResources()
- .getColor(com.android.internal.R.color.conversation_important_highlight)
- val standardThickness = context.resources.getDimensionPixelSize(
- com.android.internal.R.dimen.importance_ring_stroke_width)
- val largeThickness = context.resources.getDimensionPixelSize(
- com.android.internal.R.dimen.importance_ring_anim_max_stroke_width)
- val standardSize = context.resources.getDimensionPixelSize(
- com.android.internal.R.dimen.importance_ring_size)
- val baseSize = standardSize - standardThickness * 2
- val largeSize = baseSize + largeThickness * 2
- val bgSize = context.resources.getDimensionPixelSize(
- com.android.internal.R.dimen.conversation_icon_size_badged)
-
- val animatorUpdateListener: ValueAnimator.AnimatorUpdateListener =
- ValueAnimator.AnimatorUpdateListener { animation ->
- val strokeWidth = animation.animatedValue as Int
- ring.setStroke(strokeWidth, ringColor)
- val newSize = baseSize + strokeWidth * 2
- ring.setSize(newSize, newSize)
- mImportanceRingView.invalidate()
- }
-
- val growAnimation: ValueAnimator = ValueAnimator.ofInt(0, largeThickness)
- growAnimation.interpolator = LINEAR_OUT_SLOW_IN
- growAnimation.duration = IMPORTANCE_ANIM_GROW_DURATION
- growAnimation.addUpdateListener(animatorUpdateListener)
-
- val shrinkAnimation: ValueAnimator =
- ValueAnimator.ofInt(largeThickness, standardThickness)
- shrinkAnimation.duration = IMPORTANCE_ANIM_SHRINK_DURATION
- shrinkAnimation.startDelay = IMPORTANCE_ANIM_SHRINK_DELAY
- shrinkAnimation.interpolator = OVERSHOOT
- shrinkAnimation.addUpdateListener(animatorUpdateListener)
- shrinkAnimation.addListener(object : AnimatorListenerAdapter() {
- override fun onAnimationStart(animation: Animator?) {
- // Shrink the badge bg so that it doesn't peek behind the animation
- bg.setSize(baseSize, baseSize)
- conversationIconBadgeBg.invalidate()
- }
-
- override fun onAnimationEnd(animation: Animator?) {
- // Reset bg back to normal size
- bg.setSize(bgSize, bgSize)
- conversationIconBadgeBg.invalidate()
- }
- })
-
- val anims = AnimatorSet()
- anims.startDelay = IMPORTANCE_ANIM_DELAY
- anims.playSequentially(growAnimation, shrinkAnimation)
-
- val gapWidth = dialog.context.getResources().getDimensionPixelSize(
- R.dimen.conversation_onboarding_bullet_gap_width)
- val description = SpannableStringBuilder()
- description.append(context.getText(R.string.priority_onboarding_show_at_top_text),
- BulletSpan(gapWidth), /* flags */0)
- description.append(System.lineSeparator())
- description.append(context.getText(R.string.priority_onboarding_show_avatar_text),
- BulletSpan(gapWidth), /* flags */0)
- if (showsAsBubble) {
- description.append(System.lineSeparator())
- description.append(context.getText(
- R.string.priority_onboarding_appear_as_bubble_text),
- BulletSpan(gapWidth), /* flags */0)
- }
- if (ignoresDnd) {
- description.append(System.lineSeparator())
- description.append(context.getText(R.string.priority_onboarding_ignores_dnd_text),
- BulletSpan(gapWidth), /* flags */0)
- }
- findViewById<TextView>(R.id.behaviors).setText(description)
-
- window?.apply {
- setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
- addFlags(wmFlags)
- setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL)
- setWindowAnimations(com.android.internal.R.style.Animation_InputMethod)
-
- attributes = attributes.apply {
- format = PixelFormat.TRANSLUCENT
- title = PriorityOnboardingDialogController::class.java.simpleName
- gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL
- fitInsetsTypes = attributes.fitInsetsTypes and statusBars().inv()
- width = MATCH_PARENT
- height = WRAP_CONTENT
- }
- }
- anims.start()
- }
- }
-
- private val wmFlags = (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
- or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)
-}
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 bae44fcaff34..506d8a185adc 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
@@ -1142,16 +1142,18 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
*/
private void updateStackPosition() {
// Consider interpolating from an mExpansionStartY for use on lockscreen and AOD
- final float stackY = MathUtils.lerp(0, mTopPadding, mAmbientState.getExpansionFraction());
+ final float fraction = mAmbientState.getExpansionFraction();
+ final float stackY = MathUtils.lerp(0, mTopPadding, fraction);
mAmbientState.setStackY(stackY);
if (mOnStackYChanged != null) {
mOnStackYChanged.run();
}
- final float shadeBottom = getHeight() - getEmptyBottomMargin();
- mAmbientState.setStackEndHeight(shadeBottom - mTopPadding);
+ final float stackEndHeight = getHeight() - getEmptyBottomMargin() - mTopPadding;
+ mAmbientState.setStackEndHeight(stackEndHeight);
mAmbientState.setStackHeight(
- MathUtils.lerp(0, shadeBottom - mTopPadding, mAmbientState.getExpansionFraction()));
+ MathUtils.lerp(stackEndHeight * StackScrollAlgorithm.START_FRACTION,
+ stackEndHeight, fraction));
}
void setOnStackYChanged(Runnable onStackYChanged) {
@@ -2438,18 +2440,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
}
@ShadeViewRefactor(RefactorComponent.COORDINATOR)
- public int getPeekHeight() {
- final ExpandableView firstChild = getFirstChildNotGone();
- final int firstChildMinHeight = firstChild != null ? firstChild.getCollapsedHeight()
- : mCollapsedSize;
- int shelfHeight = 0;
- if (getLastVisibleSection() != null && mShelf.getVisibility() != GONE) {
- shelfHeight = mShelf.getIntrinsicHeight();
- }
- return mIntrinsicPadding + firstChildMinHeight + shelfHeight;
- }
-
- @ShadeViewRefactor(RefactorComponent.COORDINATOR)
private int clampPadding(int desiredPadding) {
return Math.max(desiredPadding, mIntrinsicPadding);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index b039df3f32af..f7eb574feac3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -1061,10 +1061,6 @@ public class NotificationStackScrollLayoutController {
mView.setUnlockHintRunning(running);
}
- public float getPeekHeight() {
- return mView.getPeekHeight();
- }
-
public boolean isFooterViewNotGone() {
return mView.isFooterViewNotGone();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index c1a5f148d4ca..413048d6ce54 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -42,6 +42,8 @@ import java.util.List;
*/
public class StackScrollAlgorithm {
+ public static final float START_FRACTION = 0.3f;
+
private static final String LOG_TAG = "StackScrollAlgorithm";
private final ViewGroup mHostView;
@@ -442,7 +444,8 @@ public class StackScrollAlgorithm {
maxViewHeight = algorithmState.viewHeightBeforeShelf;
}
}
- viewState.height = (int) MathUtils.lerp(0, maxViewHeight, expansionFraction);
+ viewState.height = (int) MathUtils.lerp(maxViewHeight * START_FRACTION, maxViewHeight,
+ expansionFraction);
}
currentYPosition += viewState.height + expansionFraction * mPaddingBetweenElements;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index 76657ad5ab07..16bed6f3f38d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -43,7 +43,6 @@ import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.events.PrivacyDotViewController;
import com.android.systemui.statusbar.events.SystemStatusAnimationCallback;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
@@ -92,7 +91,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
private CommandQueue mCommandQueue;
private OngoingCallController mOngoingCallController;
private final SystemStatusAnimationScheduler mAnimationScheduler;
- private final PrivacyDotViewController mDotViewController;
+ private final StatusBarLocationPublisher mLocationPublisher;
private NotificationIconAreaController mNotificationIconAreaController;
private List<String> mBlockedIcons = new ArrayList<>();
@@ -120,12 +119,12 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
public CollapsedStatusBarFragment(
OngoingCallController ongoingCallController,
SystemStatusAnimationScheduler animationScheduler,
- PrivacyDotViewController dotViewController,
+ StatusBarLocationPublisher locationPublisher,
NotificationIconAreaController notificationIconAreaController
) {
mOngoingCallController = ongoingCallController;
mAnimationScheduler = animationScheduler;
- mDotViewController = dotViewController;
+ mLocationPublisher = locationPublisher;
mNotificationIconAreaController = notificationIconAreaController;
}
@@ -540,7 +539,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
int leftMargin = left - mStatusBar.getLeft();
int rightMargin = mStatusBar.getRight() - right;
- mDotViewController.setStatusBarMargins(leftMargin, rightMargin);
+ mLocationPublisher.updateStatusBarMargin(leftMargin, rightMargin);
}
// Listen for view end changes of PhoneStatusBarView and publish that to the privacy dot
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
index 0b747f94e935..42f301d2f222 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
@@ -118,7 +118,6 @@ public class HeadsUpTouchHelper implements Gefingerpoken {
mPanel.setPanelScrimMinFraction(maxPanelHeight > 0f
? (float) startHeight / maxPanelHeight : 0f);
mPanel.startExpandMotion(x, y, true /* startTracking */, startHeight);
- mPanel.startExpandingFromPeek();
// This call needs to be after the expansion start otherwise we will get a
// flicker of one frame as it's not expanded yet.
mHeadsUpManager.unpinAll(true);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 56c0bd5c45ab..20b37e26dcee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -2831,15 +2831,6 @@ public class NotificationPanelViewController extends PanelViewController {
}
@Override
- protected float getPeekHeight() {
- if (mNotificationStackScrollLayoutController.getNotGoneChildCount() > 0) {
- return mNotificationStackScrollLayoutController.getPeekHeight();
- } else {
- return mQsMinExpansionHeight;
- }
- }
-
- @Override
protected boolean shouldUseDismissingAnimation() {
return mBarState != StatusBarState.SHADE && (mKeyguardStateController.canDismissLockScreen()
|| !isTracking());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
index 28cfe214dd3a..64e2c1c5d268 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
@@ -212,7 +212,6 @@ public abstract class PanelBar extends FrameLayout {
} else {
pv.resetViews(false /* animate */);
pv.setExpandedFraction(0); // just in case
- pv.cancelPeek();
}
if (DEBUG) LOG("collapsePanel: animate=%s waiting=%s", animate, waiting);
if (!waiting && mState != STATE_CLOSED) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
index 264930972181..f9a644fe2def 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
@@ -68,8 +68,6 @@ import java.util.ArrayList;
public abstract class PanelViewController {
public static final boolean DEBUG = PanelBar.DEBUG;
public static final String TAG = PanelView.class.getSimpleName();
- private static final int INITIAL_OPENING_PEEK_DURATION = 200;
- private static final int PEEK_ANIMATION_DURATION = 360;
private static final int NO_FIXED_DURATION = -1;
private static final long SHADE_OPEN_SPRING_OUT_DURATION = 350L;
private static final long SHADE_OPEN_SPRING_BACK_DURATION = 200L;
@@ -96,7 +94,6 @@ public abstract class PanelViewController {
protected HeadsUpManagerPhone mHeadsUpManager;
protected final StatusBarTouchableRegionManager mStatusBarTouchableRegionManager;
- private float mPeekHeight;
private float mHintDistance;
private float mInitialOffsetOnTouch;
private boolean mCollapsedAndHeadsUpOnDown;
@@ -106,8 +103,6 @@ public abstract class PanelViewController {
private boolean mHasLayoutedSinceDown;
private float mUpdateFlingVelocity;
private boolean mUpdateFlingOnLayout;
- private boolean mPeekTouching;
- private boolean mJustPeeked;
private boolean mClosing;
protected boolean mTracking;
private boolean mTouchSlopExceeded;
@@ -125,7 +120,6 @@ public abstract class PanelViewController {
private boolean mHandlingPointerUp;
private ValueAnimator mHeightAnimator;
- private ObjectAnimator mPeekAnimator;
private final VelocityTracker mVelocityTracker = VelocityTracker.obtain();
private FlingAnimationUtils mFlingAnimationUtils;
private FlingAnimationUtils mFlingAnimationUtilsClosing;
@@ -195,40 +189,6 @@ public abstract class PanelViewController {
}
}
- private void runPeekAnimation(long duration, float peekHeight, boolean collapseWhenFinished) {
- mPeekHeight = peekHeight;
- if (DEBUG) logf("peek to height=%.1f", mPeekHeight);
- if (mHeightAnimator != null) {
- return;
- }
- if (mPeekAnimator != null) {
- mPeekAnimator.cancel();
- }
- mPeekAnimator = ObjectAnimator.ofFloat(this, "expandedHeight", mPeekHeight).setDuration(
- duration);
- mPeekAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
- mPeekAnimator.addListener(new AnimatorListenerAdapter() {
- private boolean mCancelled;
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mCancelled = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- mPeekAnimator = null;
- if (!mCancelled && collapseWhenFinished) {
- mView.postOnAnimation(mPostCollapseRunnable);
- }
-
- }
- });
- notifyExpandingStarted();
- mPeekAnimator.start();
- mJustPeeked = true;
- }
-
protected AmbientState getAmbientState() {
return mAmbientState;
}
@@ -336,8 +296,6 @@ public abstract class PanelViewController {
}
private void startOpening(MotionEvent event) {
- runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(),
- false /* collapseWhenFinished */);
notifyBarPanelExpansionChanged();
maybeVibrateOnOpening();
@@ -375,10 +333,6 @@ public abstract class PanelViewController {
return Math.abs(yDiff) >= Math.abs(xDiff);
}
- protected void startExpandingFromPeek() {
- mStatusBar.handlePeekToExpandTransistion();
- }
-
protected void startExpandMotion(float newX, float newY, boolean startTracking,
float expandedHeight) {
if (!mHandlingPointerUp) {
@@ -442,18 +396,6 @@ public abstract class PanelViewController {
if (mUpdateFlingOnLayout) {
mUpdateFlingVelocity = vel;
}
- } else if (mPanelClosedOnDown && !mHeadsUpManager.hasPinnedHeadsUp() && !mTracking
- && !mStatusBar.isBouncerShowing()
- && !mKeyguardStateController.isKeyguardFadingAway()) {
- long timePassed = SystemClock.uptimeMillis() - mDownTime;
- if (timePassed < ViewConfiguration.getLongPressTimeout()) {
- // Let's show the user that they can actually expand the panel
- runPeekAnimation(
- PEEK_ANIMATION_DURATION, getPeekHeight(), true /* collapseWhenFinished */);
- } else {
- // We need to collapse the panel since we peeked to the small height.
- mView.postOnAnimation(mPostCollapseRunnable);
- }
} else if (!mStatusBar.isBouncerShowing()
&& !mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating()) {
boolean expands = onEmptySpaceClick(mInitialTouchX);
@@ -461,7 +403,6 @@ public abstract class PanelViewController {
}
mVelocityTracker.clear();
- mPeekTouching = false;
}
protected float getCurrentExpandVelocity() {
@@ -582,7 +523,6 @@ public abstract class PanelViewController {
protected void fling(float vel, boolean expand, float collapseSpeedUpFactor,
boolean expandBecauseOfFalsing) {
- cancelPeek();
float target = expand ? getMaxPanelHeight() : 0;
if (!expand) {
mClosing = true;
@@ -724,10 +664,6 @@ public abstract class PanelViewController {
return;
}
- if (mPeekAnimator != null || mPeekTouching) {
- return;
- }
-
if (mTracking && !isTrackingBlocked()) {
return;
}
@@ -890,20 +826,6 @@ public abstract class PanelViewController {
}
};
- public void cancelPeek() {
- boolean cancelled = false;
- if (mPeekAnimator != null) {
- cancelled = true;
- mPeekAnimator.cancel();
- }
-
- if (cancelled) {
- // When peeking, we already tell mBar that we expanded ourselves. Make sure that we also
- // notify mBar that we might have closed ourselves.
- notifyBarPanelExpansionChanged();
- }
- }
-
public void expand(final boolean animate) {
if (!isFullyCollapsed() && !isCollapsing()) {
return;
@@ -913,7 +835,6 @@ public abstract class PanelViewController {
mAnimateAfterExpanding = animate;
mUpdateFlingOnLayout = false;
abortAnimations();
- cancelPeek();
if (mTracking) {
onTrackingStopped(true /* expands */); // The panel is expanded after this call.
}
@@ -964,7 +885,6 @@ public abstract class PanelViewController {
}
private void abortAnimations() {
- cancelPeek();
cancelHeightAnimator();
mView.removeCallbacks(mPostCollapseRunnable);
mView.removeCallbacks(mFlingCollapseRunnable);
@@ -982,7 +902,6 @@ public abstract class PanelViewController {
if (mHeightAnimator != null || mTracking) {
return;
}
- cancelPeek();
notifyExpandingStarted();
startUnlockHintAnimationPhase1(() -> {
notifyExpandingFinished();
@@ -1085,7 +1004,7 @@ public abstract class PanelViewController {
if (mBar != null) {
mBar.panelExpansionChanged(
mExpandedFraction,
- mExpandedFraction > 0f || mPeekAnimator != null || mInstantExpanding
+ mExpandedFraction > 0f || mInstantExpanding
|| isPanelVisibleBecauseOfHeadsUp() || mTracking
|| mHeightAnimator != null);
}
@@ -1125,19 +1044,16 @@ public abstract class PanelViewController {
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(String.format("[PanelView(%s): expandedHeight=%f maxPanelHeight=%d closing=%s"
- + " tracking=%s justPeeked=%s peekAnim=%s%s timeAnim=%s%s "
+ + " tracking=%s timeAnim=%s%s "
+ "touchDisabled=%s" + "]",
this.getClass().getSimpleName(), getExpandedHeight(), getMaxPanelHeight(),
- mClosing ? "T" : "f", mTracking ? "T" : "f", mJustPeeked ? "T" : "f", mPeekAnimator,
- ((mPeekAnimator != null && mPeekAnimator.isStarted()) ? " (started)" : ""),
- mHeightAnimator,
+ mClosing ? "T" : "f", mTracking ? "T" : "f", mHeightAnimator,
((mHeightAnimator != null && mHeightAnimator.isStarted()) ? " (started)" : ""),
mTouchDisabled ? "T" : "f"));
}
public abstract void resetViews(boolean animate);
- protected abstract float getPeekHeight();
/**
* @return whether "Clear all" button will be visible when the panel is fully expanded
@@ -1212,10 +1128,8 @@ public abstract class PanelViewController {
mAnimatingOnDown = mHeightAnimator != null;
mMinExpandHeight = 0.0f;
mDownTime = SystemClock.uptimeMillis();
- if (mAnimatingOnDown && mClosing && !mHintAnimationRunning
- || mPeekAnimator != null) {
+ if (mAnimatingOnDown && mClosing && !mHintAnimationRunning) {
cancelHeightAnimator();
- cancelPeek();
mTouchSlopExceeded = true;
return true;
}
@@ -1223,7 +1137,6 @@ public abstract class PanelViewController {
mInitialTouchX = x;
mTouchStartedInEmptyArea = !isInContentBounds(x, y);
mTouchSlopExceeded = mTouchSlopExceededBeforeDown;
- mJustPeeked = false;
mMotionAborted = false;
mPanelClosedOnDown = isFullyCollapsed();
mCollapsedAndHeadsUpOnDown = false;
@@ -1302,8 +1215,6 @@ public abstract class PanelViewController {
* We capture touch events here and update the expand height here in case according to
* the users fingers. This also handles multi-touch.
*
- * If the user just clicks shortly, we show a quick peek of the shade.
- *
* Flinging is also enabled in order to open or close the shade.
*/
@@ -1323,25 +1234,22 @@ public abstract class PanelViewController {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
startExpandMotion(x, y, false /* startTracking */, mExpandedHeight);
- mJustPeeked = false;
mMinExpandHeight = 0.0f;
mPanelClosedOnDown = isFullyCollapsed();
mHasLayoutedSinceDown = false;
mUpdateFlingOnLayout = false;
mMotionAborted = false;
- mPeekTouching = mPanelClosedOnDown;
mDownTime = SystemClock.uptimeMillis();
mTouchAboveFalsingThreshold = false;
mCollapsedAndHeadsUpOnDown =
isFullyCollapsed() && mHeadsUpManager.hasPinnedHeadsUp();
addMovement(event);
if (!mGestureWaitForTouchSlop || (mHeightAnimator != null
- && !mHintAnimationRunning) || mPeekAnimator != null) {
+ && !mHintAnimationRunning)) {
mTouchSlopExceeded =
(mHeightAnimator != null && !mHintAnimationRunning)
- || mPeekAnimator != null || mTouchSlopExceededBeforeDown;
+ || mTouchSlopExceededBeforeDown;
cancelHeightAnimator();
- cancelPeek();
onTrackingStarted();
}
if (isFullyCollapsed() && !mHeadsUpManager.hasPinnedHeadsUp()
@@ -1381,7 +1289,7 @@ public abstract class PanelViewController {
|| mIgnoreXTouchSlop)) {
mTouchSlopExceeded = true;
if (mGestureWaitForTouchSlop && !mTracking && !mCollapsedAndHeadsUpOnDown) {
- if (!mJustPeeked && mInitialOffsetOnTouch != 0f) {
+ if (mInitialOffsetOnTouch != 0f) {
startExpandMotion(x, y, false /* startTracking */, mExpandedHeight);
h = 0;
}
@@ -1390,26 +1298,12 @@ public abstract class PanelViewController {
}
}
float newHeight = Math.max(0, h + mInitialOffsetOnTouch);
- if (newHeight > mPeekHeight) {
- if (mPeekAnimator != null) {
- mPeekAnimator.cancel();
- }
- mJustPeeked = false;
- } else if (mPeekAnimator == null && mJustPeeked) {
- // The initial peek has finished, but we haven't dragged as far yet, lets
- // speed it up by starting at the peek height.
- mInitialOffsetOnTouch = mExpandedHeight;
- mInitialTouchY = y;
- mMinExpandHeight = mExpandedHeight;
- mJustPeeked = false;
- }
newHeight = Math.max(newHeight, mMinExpandHeight);
if (-h >= getFalsingThreshold()) {
mTouchAboveFalsingThreshold = true;
mUpwardsWhenThresholdReached = isDirectionUpwards(x, y);
}
- if (!mJustPeeked && (!mGestureWaitForTouchSlop || mTracking)
- && !isTrackingBlocked()) {
+ if ((!mGestureWaitForTouchSlop || mTracking) && !isTrackingBlocked()) {
setExpandedHeightInternal(newHeight);
}
break;
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 c09293115492..a952db2a6073 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -163,7 +163,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
private final float mDefaultScrimAlpha;
// Assuming the shade is expanded during initialization
- private float mExpansionFraction = 1f;
+ private float mPanelExpansion = 1f;
private float mQsExpansion;
private boolean mQsBottomVisible;
@@ -487,8 +487,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
if (isNaN(fraction)) {
throw new IllegalArgumentException("Fraction should not be NaN");
}
- if (mExpansionFraction != fraction) {
- mExpansionFraction = fraction;
+ if (mPanelExpansion != fraction) {
+ mPanelExpansion = fraction;
boolean relevantState = (mState == ScrimState.UNLOCKED
|| mState == ScrimState.KEYGUARD
@@ -641,7 +641,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
mBehindTint = Color.BLACK;
} else {
mBehindAlpha = backAlpha;
- mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion);
+ if (mState == ScrimState.SHADE_LOCKED) {
+ // going from KEYGUARD to SHADE_LOCKED state
+ mNotificationsAlpha = getInterpolatedFraction();
+ } else {
+ mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion);
+ }
mBehindTint = backTint;
}
}
@@ -805,7 +810,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
}
private float getInterpolatedFraction() {
- float frac = mExpansionFraction;
+ float frac = mPanelExpansion;
// let's start this 20% of the way down the screen
frac = frac * 1.2f - 0.2f;
if (frac <= 0) {
@@ -1165,7 +1170,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
pw.print(" mDefaultScrimAlpha=");
pw.println(mDefaultScrimAlpha);
pw.print(" mExpansionFraction=");
- pw.println(mExpansionFraction);
+ pw.println(mPanelExpansion);
}
public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index aaef739af8c4..bd17d00063d7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -209,7 +209,6 @@ import com.android.systemui.statusbar.SuperStatusBarViewFactory;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.charging.WiredChargingRippleController;
-import com.android.systemui.statusbar.events.PrivacyDotViewController;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
@@ -429,7 +428,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private NotificationsController mNotificationsController;
private final OngoingCallController mOngoingCallController;
private final SystemStatusAnimationScheduler mAnimationScheduler;
- private final PrivacyDotViewController mDotViewController;
+ private final StatusBarLocationPublisher mStatusBarLocationPublisher;
// expanded notifications
// the sliding/resizing panel within the notification window
@@ -799,7 +798,7 @@ public class StatusBar extends SystemUI implements DemoMode,
WiredChargingRippleController chargingRippleAnimationController,
OngoingCallController ongoingCallController,
SystemStatusAnimationScheduler animationScheduler,
- PrivacyDotViewController dotViewController,
+ StatusBarLocationPublisher locationPublisher,
FeatureFlags featureFlags,
KeyguardUnlockAnimationController keyguardUnlockAnimationController) {
super(context);
@@ -882,7 +881,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mChargingRippleAnimationController = chargingRippleAnimationController;
mOngoingCallController = ongoingCallController;
mAnimationScheduler = animationScheduler;
- mDotViewController = dotViewController;
+ mStatusBarLocationPublisher = locationPublisher;
mFeatureFlags = featureFlags;
mExpansionChangedListeners = new ArrayList<>();
@@ -1175,7 +1174,7 @@ public class StatusBar extends SystemUI implements DemoMode,
new CollapsedStatusBarFragment(
mOngoingCallController,
mAnimationScheduler,
- mDotViewController,
+ mStatusBarLocationPublisher,
mNotificationIconAreaController),
CollapsedStatusBarFragment.TAG)
.commit();
@@ -3095,19 +3094,7 @@ public class StatusBar extends SystemUI implements DemoMode,
}
}
- void handlePeekToExpandTransistion() {
- try {
- // consider the transition from peek to expanded to be a panel open,
- // but not one that clears notification effects.
- int notificationLoad = mNotificationsController.getActiveNotificationsCount();
- mBarService.onPanelRevealed(false, notificationLoad);
- } catch (RemoteException ex) {
- // Won't fail unless the world has ended.
- }
- }
-
// Visibility reporting
-
void handleVisibleToUserChangedImpl(boolean visibleToUser) {
if (visibleToUser) {
/* The LEDs are turned off when the notification panel is shown, even just a little bit.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt
new file mode 100644
index 000000000000..4e5ecfe3f623
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 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 com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.policy.CallbackController
+import java.lang.ref.WeakReference
+import javax.inject.Inject
+
+/**
+ * Publishes updates to the status bar's margins.
+ *
+ * While the status bar view consumes the entire width of the device, the status bar
+ * contents are laid out with margins for rounded corners, padding from the absolute
+ * edges, and potentially display cutouts in the corner.
+ */
+@SysUISingleton
+class StatusBarLocationPublisher @Inject constructor()
+: CallbackController<StatusBarMarginUpdatedListener> {
+ private val listeners = mutableSetOf<WeakReference<StatusBarMarginUpdatedListener>>()
+
+ var marginLeft: Int = 0
+ private set
+ var marginRight: Int = 0
+ private set
+
+ override fun addCallback(listener: StatusBarMarginUpdatedListener) {
+ listeners.add(WeakReference(listener))
+ }
+
+ override fun removeCallback(listener: StatusBarMarginUpdatedListener) {
+ var toRemove: WeakReference<StatusBarMarginUpdatedListener>? = null
+ for (l in listeners) {
+ if (l.get() == listener) {
+ toRemove = l
+ }
+ }
+
+ if (toRemove != null) {
+ listeners.remove(toRemove)
+ }
+ }
+
+ fun updateStatusBarMargin(left: Int, right: Int) {
+ marginLeft = left
+ marginRight = right
+
+ notifyListeners()
+ }
+
+ private fun notifyListeners() {
+ var listenerList: List<WeakReference<StatusBarMarginUpdatedListener>>
+ synchronized(this) {
+ listenerList = listeners.toList()
+ }
+
+ listenerList.forEach { wrapper ->
+ if (wrapper.get() == null) {
+ listeners.remove(wrapper)
+ }
+
+ wrapper.get()?.onStatusBarMarginUpdated(marginLeft, marginRight)
+ }
+ }
+}
+
+interface StatusBarMarginUpdatedListener {
+ fun onStatusBarMarginUpdated(marginLeft: Int, marginRight: Int)
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index 66e1c2e1b571..ae11a74748cd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -62,7 +62,6 @@ import com.android.systemui.statusbar.SuperStatusBarViewFactory;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.charging.WiredChargingRippleController;
-import com.android.systemui.statusbar.events.PrivacyDotViewController;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
@@ -91,6 +90,7 @@ import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
@@ -212,7 +212,7 @@ public interface StatusBarPhoneModule {
WiredChargingRippleController chargingRippleAnimationController,
OngoingCallController ongoingCallController,
SystemStatusAnimationScheduler animationScheduler,
- PrivacyDotViewController dotViewController,
+ StatusBarLocationPublisher locationPublisher,
FeatureFlags featureFlags,
KeyguardUnlockAnimationController keyguardUnlockAnimationController) {
return new StatusBar(
@@ -298,7 +298,7 @@ public interface StatusBarPhoneModule {
chargingRippleAnimationController,
ongoingCallController,
animationScheduler,
- dotViewController,
+ locationPublisher,
featureFlags,
keyguardUnlockAnimationController);
}
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
index b95545576e56..10c4a55ad240 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
@@ -675,7 +675,6 @@ public class BubblesManager implements Dumpable {
}
try {
int flags = Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
- flags |= Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE;
mBarService.onNotificationBubbleChanged(entry.getKey(), true, flags);
} catch (RemoteException e) {
Log.e(TAG, e.getMessage());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java
index 60786f6afe99..1c3922a57368 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java
@@ -29,8 +29,8 @@ import android.view.MotionEvent;
import androidx.test.filters.SmallTest;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.util.DeviceConfigProxyFake;
-import com.android.systemui.util.sensors.ProximitySensor;
import org.junit.After;
import org.junit.Before;
@@ -149,8 +149,17 @@ public class ProximityClassifierTest extends ClassifierTest {
motionEvent.recycle();
}
- private ProximitySensor.ThresholdSensorEvent createSensorEvent(
- boolean covered, long timestampMs) {
- return new ProximitySensor.ThresholdSensorEvent(covered, timestampMs * NS_PER_MS);
+ private FalsingManager.ProximityEvent createSensorEvent(boolean covered, long timestampMs) {
+ return new FalsingManager.ProximityEvent() {
+ @Override
+ public boolean getCovered() {
+ return covered;
+ }
+
+ @Override
+ public long getTimestampNs() {
+ return timestampMs * NS_PER_MS;
+ }
+ };
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index 94252d2b8331..800daa1e96aa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -17,7 +17,6 @@
package com.android.systemui.media
import android.content.Intent
-import android.content.res.ColorStateList
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.graphics.drawable.RippleDrawable
@@ -222,17 +221,6 @@ public class MediaControlPanelTest : SysuiTestCase() {
}
@Test
- fun bindBackgroundColor() {
- player.attachPlayer(holder)
- val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
- emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null)
- player.bindPlayer(state, PACKAGE)
- val list = ArgumentCaptor.forClass(ColorStateList::class.java)
- verify(view).setBackgroundTintList(list.capture())
- assertThat(list.value).isEqualTo(ColorStateList.valueOf(BG_COLOR))
- }
-
- @Test
fun bindDevice() {
player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
index 5d29f520e8a9..e85e19fbd9b8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
@@ -21,6 +21,8 @@ import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_ANYONE;
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_CONVERSATIONS;
import static android.print.PrintManager.PRINT_SPOOLER_PACKAGE_NAME;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
@@ -150,9 +152,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
private ShadeController mShadeController;
@Mock
private ConversationIconFactory mIconFactory;
- @Mock(answer = Answers.RETURNS_SELF)
- private PriorityOnboardingDialogController.Builder mBuilder;
- private Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider = () -> mBuilder;
@Mock
private Notification.BubbleMetadata mBubbleMetadata;
private Handler mTestHandler;
@@ -236,8 +235,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
when(mMockINotificationManager.getConsolidatedNotificationPolicy())
.thenReturn(mock(NotificationManager.Policy.class));
- when(mBuilder.build()).thenReturn(mock(PriorityOnboardingDialogController.class));
-
when(mPeopleSpaceWidgetManager.requestPinAppWidget(any(), any())).thenReturn(true);
}
@@ -258,7 +255,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -285,7 +281,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -340,7 +335,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -368,7 +362,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -395,7 +388,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -433,7 +425,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -464,7 +455,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -493,7 +483,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -523,7 +512,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
false,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -551,7 +539,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -582,7 +569,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -616,7 +602,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -626,6 +611,110 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
assertThat(((TextView) view.findViewById(R.id.default_summary)).getText()).isEqualTo(
mContext.getString(R.string.notification_channel_summary_default_with_bubbles,
"App Name"));
+ assertThat(((TextView) mNotificationInfo.findViewById(R.id.priority_summary)).getText())
+ .isEqualTo(mContext.getString(
+ R.string.notification_channel_summary_priority_bubble));
+ }
+
+ @Test
+ public void testBindNotification_priorityDnd() throws Exception {
+ NotificationManager.Policy policy = new NotificationManager.Policy(
+ PRIORITY_CATEGORY_CONVERSATIONS, 0, 0, 0, CONVERSATION_SENDERS_ANYONE);
+ when(mMockINotificationManager.getConsolidatedNotificationPolicy())
+ .thenReturn(policy);
+ when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
+ mConversationChannel.setImportance(IMPORTANCE_HIGH);
+ mConversationChannel.setImportantConversation(false);
+ mConversationChannel.setAllowBubbles(false);
+ mNotificationInfo.bindNotification(
+ -1,
+ mShortcutManager,
+ mMockPackageManager,
+ mPeopleSpaceWidgetManager,
+ mMockINotificationManager,
+ mOnUserInteractionCallback,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ null,
+ mIconFactory,
+ mContext,
+ true,
+ mTestHandler,
+ mTestHandler, null, Optional.of(mBubblesManager),
+ mShadeController);
+ assertThat(((TextView) mNotificationInfo.findViewById(R.id.priority_summary)).getText())
+ .isEqualTo(mContext.getString(
+ R.string.notification_channel_summary_priority_dnd));
+ }
+
+ @Test
+ public void testBindNotification_priorityBaseline() throws Exception {
+ when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
+ mConversationChannel.setImportance(IMPORTANCE_HIGH);
+ mConversationChannel.setImportantConversation(false);
+ mConversationChannel.setAllowBubbles(false);
+ mNotificationInfo.bindNotification(
+ -1,
+ mShortcutManager,
+ mMockPackageManager,
+ mPeopleSpaceWidgetManager,
+ mMockINotificationManager,
+ mOnUserInteractionCallback,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ null,
+ mIconFactory,
+ mContext,
+ true,
+ mTestHandler,
+ mTestHandler, null, Optional.of(mBubblesManager),
+ mShadeController);
+ assertThat(((TextView) mNotificationInfo.findViewById(R.id.priority_summary)).getText())
+ .isEqualTo(mContext.getString(
+ R.string.notification_channel_summary_priority_baseline));
+ }
+
+ @Test
+ public void testBindNotification_priorityDndAndBubble() throws Exception {
+ NotificationManager.Policy policy = new NotificationManager.Policy(
+ PRIORITY_CATEGORY_CONVERSATIONS, 0, 0, 0, CONVERSATION_SENDERS_ANYONE);
+ when(mMockINotificationManager.getConsolidatedNotificationPolicy())
+ .thenReturn(policy);
+
+ when(mMockINotificationManager.getBubblePreferenceForPackage(anyString(), anyInt()))
+ .thenReturn(BUBBLE_PREFERENCE_ALL);
+ when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
+ mConversationChannel.setImportance(IMPORTANCE_HIGH);
+ mConversationChannel.setImportantConversation(false);
+ mConversationChannel.setAllowBubbles(true);
+ mNotificationInfo.bindNotification(
+ -1,
+ mShortcutManager,
+ mMockPackageManager,
+ mPeopleSpaceWidgetManager,
+ mMockINotificationManager,
+ mOnUserInteractionCallback,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ mBubbleMetadata,
+ null,
+ null,
+ mIconFactory,
+ mContext,
+ true,
+ mTestHandler,
+ mTestHandler, null, Optional.of(mBubblesManager),
+ mShadeController);
+ assertThat(((TextView) mNotificationInfo.findViewById(R.id.priority_summary)).getText())
+ .isEqualTo(mContext.getString(
+ R.string.notification_channel_summary_priority_all));
}
@Test
@@ -649,7 +738,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -696,7 +784,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -742,7 +829,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -789,7 +875,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -829,7 +914,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -868,7 +952,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -911,7 +994,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -944,7 +1026,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -976,7 +1057,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -1015,7 +1095,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -1054,7 +1133,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -1092,7 +1170,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -1129,7 +1206,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -1157,7 +1233,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -1168,97 +1243,8 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
}
@Test
- public void testSelectPriorityPresentsOnboarding_firstTime() {
- // GIVEN pref is false
- Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, false);
-
- // GIVEN the priority onboarding screen is present
- PriorityOnboardingDialogController.Builder b =
- mock(PriorityOnboardingDialogController.Builder.class, Answers.RETURNS_SELF);
- PriorityOnboardingDialogController controller =
- mock(PriorityOnboardingDialogController.class);
- when(b.build()).thenReturn(controller);
-
- // GIVEN the user is changing conversation settings
- mNotificationInfo.bindNotification(
- -1,
- mShortcutManager,
- mMockPackageManager,
- mPeopleSpaceWidgetManager,
- mMockINotificationManager,
- mOnUserInteractionCallback,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mEntry,
- mBubbleMetadata,
- null,
- null,
- mIconFactory,
- mContext,
- () -> b,
- true,
- mTestHandler,
- mTestHandler, null, Optional.of(mBubblesManager),
- mShadeController);
-
- // WHEN user clicks "priority"
- mNotificationInfo.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE);
- verify(controller, never()).show();
-
- // and then done
- mNotificationInfo.findViewById(R.id.done).performClick();
-
- // THEN the user is presented with the priority onboarding screen
- verify(controller, atLeastOnce()).show();
- }
-
- @Test
- public void testSelectPriorityDoesNotShowOnboarding_secondTime() {
- //WHEN pref is true
- Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true);
-
- PriorityOnboardingDialogController.Builder b =
- mock(PriorityOnboardingDialogController.Builder.class, Answers.RETURNS_SELF);
- PriorityOnboardingDialogController controller =
- mock(PriorityOnboardingDialogController.class);
- when(b.build()).thenReturn(controller);
-
- mNotificationInfo.bindNotification(
- -1,
- mShortcutManager,
- mMockPackageManager,
- mPeopleSpaceWidgetManager,
- mMockINotificationManager,
- mOnUserInteractionCallback,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mEntry,
- mBubbleMetadata,
- null,
- null,
- mIconFactory,
- mContext,
- () -> b,
- true,
- mTestHandler,
- mTestHandler, null, Optional.of(mBubblesManager),
- mShadeController);
-
- // WHEN user clicks "priority"
- mNotificationInfo.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE);
- verify(controller, never()).show();
-
- // and then done
- mNotificationInfo.findViewById(R.id.done).performClick();
-
- // THEN the user is presented with the priority onboarding screen
- verify(controller, never()).show();
- }
-
- @Test
public void testSelectPriorityRequestsPinPeopleTile() {
- //WHEN pref is true and channel is default importance
- Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true);
+ //WHEN channel is default importance
mNotificationChannel.setImportantConversation(false);
mNotificationInfo.bindNotification(
-1,
@@ -1275,7 +1261,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -1293,9 +1278,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
@Test
public void testSelectDefaultDoesNotRequestPinPeopleTile() {
- //WHEN pref is true
- Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true);
-
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
@@ -1311,7 +1293,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
@@ -1329,8 +1310,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
@Test
public void testSelectPriority_AlreadyPriority_DoesNotRequestPinPeopleTile() {
- //WHEN pref is true and channel is priority
- Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true);
mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
mConversationChannel.setImportance(IMPORTANCE_HIGH);
mConversationChannel.setImportantConversation(true);
@@ -1350,7 +1329,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
null,
mIconFactory,
mContext,
- mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index bfce2a568c78..9f537f5b6afc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -139,9 +139,6 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
@Mock private BubblesManager mBubblesManager;
@Mock private ShadeController mShadeController;
@Mock private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
- @Mock(answer = Answers.RETURNS_SELF)
- private PriorityOnboardingDialogController.Builder mBuilder;
- private Provider<PriorityOnboardingDialogController.Builder> mProvider = () -> mBuilder;
@Mock private AssistantFeedbackController mAssistantFeedbackController;
@Before
@@ -163,7 +160,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
() -> mStatusBar, mHandler, mHandler, mAccessibilityManager, mHighPriorityProvider,
mINotificationManager, mNotificationEntryManager, mPeopleSpaceWidgetManager,
mLauncherApps, mShortcutManager, mChannelEditorDialogController, mContextTracker,
- mProvider, mAssistantFeedbackController, Optional.of(mBubblesManager),
+ mAssistantFeedbackController, Optional.of(mBubblesManager),
new UiEventLoggerFake(), mOnUserInteractionCallback, mShadeController);
mGutsManager.setUpWithPresenter(mPresenter, mNotificationListContainer,
mCheckSaveListener, mOnSettingsClickListener);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index a01e0b1c3e3a..f485b465e486 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -38,7 +38,6 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.events.PrivacyDotViewController;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
@@ -57,7 +56,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
private StatusBarStateController mStatusBarStateController;
private OngoingCallController mOngoingCallController;
private SystemStatusAnimationScheduler mAnimationScheduler;
- private PrivacyDotViewController mDotViewController;
+ private StatusBarLocationPublisher mLocationPublisher;
public CollapsedStatusBarFragmentTest() {
super(CollapsedStatusBarFragment.class);
@@ -224,12 +223,12 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
protected Fragment instantiate(Context context, String className, Bundle arguments) {
mOngoingCallController = mock(OngoingCallController.class);
mAnimationScheduler = mock(SystemStatusAnimationScheduler.class);
- mDotViewController = mock(PrivacyDotViewController.class);
+ mLocationPublisher = mock(StatusBarLocationPublisher.class);
setUpNotificationIconAreaController();
return new CollapsedStatusBarFragment(
mOngoingCallController,
mAnimationScheduler,
- mDotViewController,
+ mLocationPublisher,
mMockNotificationAreaController);
}
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 b6eb4923ee4a..f98f00cd9187 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
@@ -20,6 +20,7 @@ import static com.android.systemui.statusbar.phone.ScrimController.OPAQUE;
import static com.android.systemui.statusbar.phone.ScrimController.SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT;
+import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -165,7 +166,7 @@ public class ScrimControllerTest extends SysuiTestCase {
endAnimation(mScrimInFront);
endAnimation(mScrimForBubble);
- Assert.assertEquals("Animators did not finish",
+ assertEquals("Animators did not finish",
mAnimatorListener.getNumStarts(), mAnimatorListener.getNumEnds());
}
@@ -422,7 +423,7 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately();
mScrimController.setAodFrontScrimAlpha(0.3f);
- Assert.assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f);
+ assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f);
Assert.assertNotEquals(0.3f, mScrimInFront.getViewAlpha(), 0.001f);
}
@@ -601,13 +602,13 @@ public class ScrimControllerTest extends SysuiTestCase {
));
// Front scrim should be transparent
- Assert.assertEquals(ScrimController.TRANSPARENT,
+ assertEquals(ScrimController.TRANSPARENT,
mScrimInFront.getViewAlpha(), 0.0f);
// Back scrim should be visible
- Assert.assertEquals(ScrimController.BUSY_SCRIM_ALPHA,
+ assertEquals(ScrimController.BUSY_SCRIM_ALPHA,
mScrimBehind.getViewAlpha(), 0.0f);
// Bubble scrim should be visible
- Assert.assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA,
+ assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA,
mScrimForBubble.getViewAlpha(), 0.0f);
}
@@ -615,15 +616,15 @@ public class ScrimControllerTest extends SysuiTestCase {
public void scrimStateCallback() {
mScrimController.transitionTo(ScrimState.UNLOCKED);
finishAnimationsImmediately();
- Assert.assertEquals(mScrimState, ScrimState.UNLOCKED);
+ assertEquals(mScrimState, ScrimState.UNLOCKED);
mScrimController.transitionTo(ScrimState.BOUNCER);
finishAnimationsImmediately();
- Assert.assertEquals(mScrimState, ScrimState.BOUNCER);
+ assertEquals(mScrimState, ScrimState.BOUNCER);
mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
finishAnimationsImmediately();
- Assert.assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED);
+ assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED);
}
@Test
@@ -638,13 +639,13 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.setPanelExpansion(1.0f);
finishAnimationsImmediately();
- Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
+ assertEquals("Scrim alpha should change after setPanelExpansion",
mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
mScrimController.setPanelExpansion(0f);
finishAnimationsImmediately();
- Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
+ assertEquals("Scrim alpha should change after setPanelExpansion",
mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
}
@@ -698,7 +699,7 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.setExpansionAffectsAlpha(false);
mScrimController.setPanelExpansion(0.8f);
verifyZeroInteractions(mScrimBehind);
- Assert.assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha "
+ assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha "
+ "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
mScrimController.setExpansionAffectsAlpha(true);
@@ -801,9 +802,9 @@ public class ScrimControllerTest extends SysuiTestCase {
}
});
finishAnimationsImmediately();
- Assert.assertEquals("onStart called in wrong order", 1, callOrder[0]);
- Assert.assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]);
- Assert.assertEquals("onFinished called in wrong order", 3, callOrder[2]);
+ assertEquals("onStart called in wrong order", 1, callOrder[0]);
+ assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]);
+ assertEquals("onFinished called in wrong order", 3, callOrder[2]);
}
@Test
@@ -911,7 +912,7 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.transitionTo(ScrimState.UNLOCKED);
finishAnimationsImmediately();
- Assert.assertEquals("Scrim expansion opacity wasn't conserved when transitioning back",
+ assertEquals("Scrim expansion opacity wasn't conserved when transitioning back",
expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f);
}
@@ -981,7 +982,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
mScrimController.transitionTo(state);
finishAnimationsImmediately();
- Assert.assertEquals("Should be clickable unless AOD or PULSING, was: " + state,
+ assertEquals("Should be clickable unless AOD or PULSING, was: " + state,
mScrimBehind.getViewAlpha() != 0 && !eatsTouches.contains(state),
mScrimBehind.isClickable());
}
@@ -1035,9 +1036,9 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.setQsPosition(0, 300);
finishAnimationsImmediately();
- Assert.assertEquals("Behind scrim should be opaque",
+ assertEquals("Behind scrim should be opaque",
mScrimBehind.getViewAlpha(), 1, 0.0);
- Assert.assertEquals("Notifications scrim should be opaque",
+ assertEquals("Notifications scrim should be opaque",
mNotificationsScrim.getViewAlpha(), 1, 0.0);
}
@@ -1093,6 +1094,40 @@ public class ScrimControllerTest extends SysuiTestCase {
mNotificationsScrim, TRANSPARENT));
}
+ @Test
+ public void testNotificationScrimVisible_afterOpeningShadeFromLockscreen() {
+ mScrimController.setPanelExpansion(1);
+ mScrimController.transitionTo(ScrimState.SHADE_LOCKED);
+ finishAnimationsImmediately();
+
+ assertScrimAlpha(Map.of(
+ mScrimBehind, OPAQUE,
+ mNotificationsScrim, OPAQUE));
+ }
+
+ @Test
+ public void testNotificationTransparency_followsPanelExpansionInShadeLockedState() {
+ mScrimController.transitionTo(ScrimState.SHADE_LOCKED);
+
+ assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.8f);
+ assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.2f);
+ }
+
+ @Test
+ public void testNotificationTransparency_inKeyguardState() {
+ mScrimController.transitionTo(ScrimState.KEYGUARD);
+
+ assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.8f);
+ assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.2f);
+ }
+
+ private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) {
+ mScrimController.setPanelExpansion(expansion);
+ finishAnimationsImmediately();
+ // alpha is not changing linearly thus 0.2 of leeway when asserting
+ assertEquals(expectedAlpha, mNotificationsScrim.getViewAlpha(), 0.2);
+ }
+
private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) {
scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint));
}
@@ -1101,7 +1136,7 @@ public class ScrimControllerTest extends SysuiTestCase {
String message = "Tint test failed at state " + mScrimController.getState()
+ " with scrim: " + getScrimName(scrim) + " and tint: "
+ Integer.toHexString(scrim.getTint());
- Assert.assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT);
+ assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT);
}
private String getScrimName(ScrimView scrim) {
@@ -1146,13 +1181,13 @@ public class ScrimControllerTest extends SysuiTestCase {
} else {
visibility = TRANSPARENT;
}
- Assert.assertEquals("Invalid visibility.",
+ assertEquals("Invalid visibility.",
visibility /* expected */,
mScrimVisibility);
}
private void assertScrimAlpha(ScrimView scrim, int expectedAlpha) {
- Assert.assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: "
+ assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: "
+ scrim.getViewAlpha(),
expectedAlpha != TRANSPARENT /* expected */,
scrim.getViewAlpha() > TRANSPARENT /* actual */);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 545e2e08ec07..b2487e8e2444 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -115,7 +115,6 @@ import com.android.systemui.statusbar.StatusBarStateControllerImpl;
import com.android.systemui.statusbar.SuperStatusBarViewFactory;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.charging.WiredChargingRippleController;
-import com.android.systemui.statusbar.events.PrivacyDotViewController;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
@@ -267,7 +266,7 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private WiredChargingRippleController mWiredChargingRippleController;
@Mock private OngoingCallController mOngoingCallController;
@Mock private SystemStatusAnimationScheduler mAnimationScheduler;
- @Mock private PrivacyDotViewController mDotViewController;
+ @Mock private StatusBarLocationPublisher mLocationPublisher;
@Mock private FeatureFlags mFeatureFlags;
@Mock private IWallpaperManager mWallpaperManager;
@Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
@@ -437,7 +436,7 @@ public class StatusBarTest extends SysuiTestCase {
mWiredChargingRippleController,
mOngoingCallController,
mAnimationScheduler,
- mDotViewController,
+ mLocationPublisher,
mFeatureFlags,
mKeyguardUnlockAnimationController);
when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), any(ViewGroup.class),
diff --git a/services/Android.bp b/services/Android.bp
index 2281a159f6f7..1dd219264575 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -190,13 +190,13 @@ droidstubs {
defaults: ["services-stubs-default"],
check_api: {
current: {
- api_file: "api/non-updatable-current.txt",
- removed_api_file: "api/non-updatable-removed.txt",
+ api_file: "api/current.txt",
+ removed_api_file: "api/removed.txt",
},
api_lint: {
enabled: true,
new_since: ":android-non-updatable.api.system-server.latest",
- baseline_file: "api/non-updatable-lint-baseline.txt",
+ baseline_file: "api/lint-baseline.txt",
},
},
dists: [
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
index 61de53a2a483..7403af7605bc 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -16,6 +16,9 @@
package com.android.server.accessibility;
+import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY;
+import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
+
import android.annotation.MainThread;
import android.content.Context;
import android.graphics.Region;
@@ -557,12 +560,16 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
MagnificationGestureHandler magnificationGestureHandler;
if (mAms.getMagnificationMode(displayId)
== Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
- magnificationGestureHandler = new WindowMagnificationGestureHandler(displayContext,
+ final Context uiContext = displayContext.createWindowContext(
+ TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, null /* options */);
+ magnificationGestureHandler = new WindowMagnificationGestureHandler(uiContext,
mAms.getWindowMagnificationMgr(), mAms.getMagnificationController(),
detectControlGestures, triggerable,
displayId);
} else {
- magnificationGestureHandler = new FullScreenMagnificationGestureHandler(displayContext,
+ final Context uiContext = displayContext.createWindowContext(
+ TYPE_MAGNIFICATION_OVERLAY, null /* options */);
+ magnificationGestureHandler = new FullScreenMagnificationGestureHandler(uiContext,
mAms.getFullScreenMagnificationController(), mAms.getMagnificationController(),
detectControlGestures, triggerable,
new WindowMagnificationPromptController(displayContext, mUserId), displayId);
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
index 2434e2ca0b54..f7d1b9a311ba 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
@@ -34,6 +34,7 @@ import static java.util.Arrays.copyOfRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UiContext;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -139,7 +140,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
private PointerCoords[] mTempPointerCoords;
private PointerProperties[] mTempPointerProperties;
- public FullScreenMagnificationGestureHandler(Context context,
+ public FullScreenMagnificationGestureHandler(@UiContext Context context,
FullScreenMagnificationController fullScreenMagnificationController,
Callback callback,
boolean detectTripleTap,
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java
index 07f22dcb2c95..c5495d98226e 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java
@@ -19,6 +19,7 @@ package com.android.server.accessibility.magnification;
import static java.lang.Math.abs;
import android.annotation.NonNull;
+import android.annotation.UiContext;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
@@ -63,8 +64,8 @@ class PanningScalingHandler extends
private boolean mScaling;
private boolean mEnable;
- PanningScalingHandler(Context context, float maxScale, float minScale, boolean blockScroll,
- @NonNull MagnificationDelegate magnificationDelegate) {
+ PanningScalingHandler(@UiContext Context context, float maxScale, float minScale,
+ boolean blockScroll, @NonNull MagnificationDelegate magnificationDelegate) {
mDisplayId = context.getDisplayId();
mMaxScale = maxScale;
mMinScale = minScale;
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
index fa3406217fa8..4fb9a03b8ac1 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
@@ -24,6 +24,7 @@ import static java.util.Arrays.asList;
import static java.util.Arrays.copyOfRange;
import android.annotation.Nullable;
+import android.annotation.UiContext;
import android.content.Context;
import android.graphics.Point;
import android.provider.Settings;
@@ -86,7 +87,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
private final Context mContext;
private final Point mTempPoint = new Point();
- public WindowMagnificationGestureHandler(Context context,
+ public WindowMagnificationGestureHandler(@UiContext Context context,
WindowMagnificationManager windowMagnificationMgr,
Callback callback,
boolean detectTripleTap, boolean detectShortcutTrigger, int displayId) {
@@ -342,7 +343,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
*/
private final boolean mDetectTripleTap;
- DetectingState(Context context, boolean detectTripleTap) {
+ DetectingState(@UiContext Context context, boolean detectTripleTap) {
mDetectTripleTap = detectTripleTap;
final MultiTap multiTap = new MultiTap(context, mDetectTripleTap ? 3 : 1,
mDetectTripleTap
diff --git a/services/api/Android.bp b/services/api/Android.bp
index bbc8c72b2eef..ee7d49fc99c8 100644
--- a/services/api/Android.bp
+++ b/services/api/Android.bp
@@ -24,12 +24,12 @@ package {
filegroup {
name: "non-updatable-system-server-current.txt",
- srcs: ["non-updatable-current.txt"],
+ srcs: ["current.txt"],
visibility: ["//frameworks/base/api"],
}
filegroup {
name: "non-updatable-system-server-removed.txt",
- srcs: ["non-updatable-removed.txt"],
+ srcs: ["removed.txt"],
visibility: ["//frameworks/base/api"],
}
diff --git a/services/api/current.txt b/services/api/current.txt
index a0b1e3349e77..475dcf5eb20e 100644
--- a/services/api/current.txt
+++ b/services/api/current.txt
@@ -1,57 +1,4 @@
// Signature format: 2.0
-package com.android.permission.persistence {
-
- public interface RuntimePermissionsPersistence {
- method @NonNull public static com.android.permission.persistence.RuntimePermissionsPersistence createInstance();
- method public void deleteForUser(@NonNull android.os.UserHandle);
- method @Nullable public com.android.permission.persistence.RuntimePermissionsState readForUser(@NonNull android.os.UserHandle);
- method public void writeForUser(@NonNull com.android.permission.persistence.RuntimePermissionsState, @NonNull android.os.UserHandle);
- }
-
- public final class RuntimePermissionsState {
- ctor public RuntimePermissionsState(int, @Nullable String, @NonNull java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>>, @NonNull java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>>);
- method @Nullable public String getFingerprint();
- method @NonNull public java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>> getPackagePermissions();
- method @NonNull public java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>> getSharedUserPermissions();
- method public int getVersion();
- field public static final int NO_VERSION = -1; // 0xffffffff
- }
-
- public static final class RuntimePermissionsState.PermissionState {
- ctor public RuntimePermissionsState.PermissionState(@NonNull String, boolean, int);
- method public int getFlags();
- method @NonNull public String getName();
- method public boolean isGranted();
- }
-
-}
-
-package com.android.role {
-
- public interface RoleManagerLocal {
- method @NonNull public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getRolesAndHolders(int);
- }
-
-}
-
-package com.android.role.persistence {
-
- public interface RolesPersistence {
- method @NonNull public static com.android.role.persistence.RolesPersistence createInstance();
- method public void deleteForUser(@NonNull android.os.UserHandle);
- method @Nullable public com.android.role.persistence.RolesState readForUser(@NonNull android.os.UserHandle);
- method public void writeForUser(@NonNull com.android.role.persistence.RolesState, @NonNull android.os.UserHandle);
- }
-
- public final class RolesState {
- ctor public RolesState(int, @Nullable String, @NonNull java.util.Map<java.lang.String,java.util.Set<java.lang.String>>);
- method @Nullable public String getPackagesHash();
- method @NonNull public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getRoles();
- method public int getVersion();
- }
-
-}
-
package com.android.server {
public final class LocalManagerRegistry {
diff --git a/services/api/lint-baseline.txt b/services/api/lint-baseline.txt
index e985ddb5352b..b46d21edd44c 100644
--- a/services/api/lint-baseline.txt
+++ b/services/api/lint-baseline.txt
@@ -1,4 +1,8 @@
// Baseline format: 1.0
+NotCloseable: com.android.server.wifi.SupplicantManager:
+ Classes that release resources (stop()) should implement AutoClosable and CloseGuard: class com.android.server.wifi.SupplicantManager
+
+
ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder):
Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder)}
ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder, boolean):
diff --git a/services/api/non-updatable-current.txt b/services/api/non-updatable-current.txt
deleted file mode 100644
index 475dcf5eb20e..000000000000
--- a/services/api/non-updatable-current.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-// Signature format: 2.0
-package com.android.server {
-
- public final class LocalManagerRegistry {
- method public static <T> void addManager(@NonNull Class<T>, @NonNull T);
- method @Nullable public static <T> T getManager(@NonNull Class<T>);
- }
-
- public abstract class SystemService {
- ctor public SystemService(@NonNull android.content.Context);
- method @NonNull public final android.content.Context getContext();
- method public boolean isUserSupported(@NonNull com.android.server.SystemService.TargetUser);
- method public void onBootPhase(int);
- method public abstract void onStart();
- method public void onUserStarting(@NonNull com.android.server.SystemService.TargetUser);
- method public void onUserStopped(@NonNull com.android.server.SystemService.TargetUser);
- method public void onUserStopping(@NonNull com.android.server.SystemService.TargetUser);
- method public void onUserSwitching(@Nullable com.android.server.SystemService.TargetUser, @NonNull com.android.server.SystemService.TargetUser);
- method public void onUserUnlocked(@NonNull com.android.server.SystemService.TargetUser);
- method public void onUserUnlocking(@NonNull com.android.server.SystemService.TargetUser);
- method protected final void publishBinderService(@NonNull String, @NonNull android.os.IBinder);
- method protected final void publishBinderService(@NonNull String, @NonNull android.os.IBinder, boolean);
- field public static final int PHASE_ACTIVITY_MANAGER_READY = 550; // 0x226
- field public static final int PHASE_BOOT_COMPLETED = 1000; // 0x3e8
- field public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520; // 0x208
- field public static final int PHASE_LOCK_SETTINGS_READY = 480; // 0x1e0
- field public static final int PHASE_SYSTEM_SERVICES_READY = 500; // 0x1f4
- field public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600; // 0x258
- field public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; // 0x64
- }
-
- public static final class SystemService.TargetUser {
- method @NonNull public android.os.UserHandle getUserHandle();
- }
-
-}
-
-package com.android.server.am {
-
- public interface ActivityManagerLocal {
- method public boolean canStartForegroundService(int, int, @NonNull String);
- }
-
-}
-
-package com.android.server.role {
-
- public interface RoleServicePlatformHelper {
- method @NonNull public String computePackageStateHash(int);
- method @NonNull public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getLegacyRoleState(int);
- }
-
-}
-
-package com.android.server.stats {
-
- public final class StatsHelper {
- method public static void sendStatsdReadyBroadcast(@NonNull android.content.Context);
- }
-
-}
-
-package com.android.server.wifi {
-
- public class SupplicantManager {
- method public static void start();
- method public static void stop();
- }
-
-}
-
diff --git a/services/api/non-updatable-lint-baseline.txt b/services/api/non-updatable-lint-baseline.txt
deleted file mode 100644
index b46d21edd44c..000000000000
--- a/services/api/non-updatable-lint-baseline.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-// Baseline format: 1.0
-NotCloseable: com.android.server.wifi.SupplicantManager:
- Classes that release resources (stop()) should implement AutoClosable and CloseGuard: class com.android.server.wifi.SupplicantManager
-
-
-ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder):
- Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder)}
-ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder, boolean):
- Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder,boolean)}
diff --git a/services/api/non-updatable-removed.txt b/services/api/non-updatable-removed.txt
deleted file mode 100644
index d802177e249b..000000000000
--- a/services/api/non-updatable-removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 816c50dde2a8..76a6c0eecd3e 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -1133,7 +1133,7 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP
* @param handler to use for postponed calculations.
*/
public abstract void requestChecksums(@NonNull String packageName, boolean includeSplits,
- @Checksum.Type int optional, @Checksum.Type int required,
+ @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
@Nullable List trustedInstallers,
@NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
@NonNull Executor executor, @NonNull Handler handler);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 9aedf1504df5..d526ebc8e581 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -14831,7 +14831,7 @@ public class ActivityManagerService extends IActivityManager.Stub
throw new IllegalArgumentException("null fd");
}
- synchronized (mProcLock) {
+ synchronized (this) {
ProcessRecord proc = findProcessLOSP(process, userId, "dumpHeap");
IApplicationThread thread;
if (proc == null || (thread = proc.getThread()) == null) {
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index b7ef10a5d45d..d2c6c6c620dd 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -56,6 +56,7 @@ import android.os.ShellCallback;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig.Properties;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.KeyValueListParser;
import android.util.Slog;
@@ -180,9 +181,14 @@ public final class GameManagerService extends IGameManagerService.Stub {
break;
}
case POPULATE_GAME_MODE_SETTINGS: {
+ // Scan all game packages and re-enforce the configured compat mode overrides
+ // as the DeviceConfig may have be wiped/since last reboot and we can't risk
+ // having overrides configured for packages that no longer have any DeviceConfig
+ // and thus any way to escape compat mode.
removeMessages(POPULATE_GAME_MODE_SETTINGS, msg.obj);
- loadDeviceConfigLocked();
- break;
+ final int userId = (int) msg.obj;
+ final String[] packageNames = getInstalledGamePackageNames(userId);
+ updateConfigsForUser(userId, packageNames);
}
}
}
@@ -198,28 +204,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
@Override
public void onPropertiesChanged(Properties properties) {
- synchronized (mDeviceConfigLock) {
- for (final String packageName : properties.getKeyset()) {
- try {
- // Check if the package is installed before caching it.
- mPackageManager.getPackageInfo(packageName, 0);
- final GamePackageConfiguration config =
- GamePackageConfiguration.fromProperties(packageName, properties);
- if (config.isValid()) {
- putConfig(config);
- } else {
- // This means that we received a bad config, or the config was deleted.
- Slog.i(TAG, "Removing config for: " + packageName);
- mConfigs.remove(packageName);
- disableCompatScale(packageName);
- }
- } catch (PackageManager.NameNotFoundException e) {
- if (DEBUG) {
- Slog.v(TAG, "Package name not found", e);
- }
- }
- }
- }
+ final String[] packageNames = properties.getKeyset().toArray(new String[0]);
+ updateConfigsForUser(mContext.getUserId(), packageNames);
}
@Override
@@ -228,80 +214,166 @@ public final class GameManagerService extends IGameManagerService.Stub {
}
}
- private static class GameModeConfiguration {
- public static final String TAG = "GameManagerService_GameModeConfiguration";
- public static final String MODE_KEY = "mode";
- public static final String SCALING_KEY = "downscaleFactor";
+ /**
+ * GamePackageConfiguration manages all game mode config details for its associated package.
+ */
+ @VisibleForTesting
+ public class GamePackageConfiguration {
+ public static final String TAG = "GameManagerService_GamePackageConfiguration";
- private final @GameMode int mGameMode;
- private final String mScaling;
+ /**
+ * Metadata that can be included in the app manifest to allow/disallow any window manager
+ * downscaling interventions. Default value is TRUE.
+ */
+ public static final String METADATA_WM_ALLOW_DOWNSCALE =
+ "com.android.graphics.intervention.wm.allowDownscale";
- private GameModeConfiguration(@NonNull int gameMode,
- @NonNull String scaling) {
- mGameMode = gameMode;
- mScaling = scaling;
- }
+ /**
+ * Metadata that needs to be included in the app manifest to OPT-IN to PERFORMANCE mode.
+ * This means the app will assume full responsibility for the experience provided by this
+ * mode and the system will enable no window manager downscaling.
+ * Default value is FALSE
+ */
+ public static final String METADATA_PERFORMANCE_MODE_ENABLE =
+ "com.android.app.gamemode.performance.enabled";
- public static GameModeConfiguration fromKeyValueListParser(KeyValueListParser parser) {
- return new GameModeConfiguration(
- parser.getInt(MODE_KEY, GameManager.GAME_MODE_UNSUPPORTED),
- parser.getString(SCALING_KEY, "1.0")
- );
- }
+ /**
+ * Metadata that needs to be included in the app manifest to OPT-IN to BATTERY mode.
+ * This means the app will assume full responsibility for the experience provided by this
+ * mode and the system will enable no window manager downscaling.
+ * Default value is FALSE
+ */
+ public static final String METADATA_BATTERY_MODE_ENABLE =
+ "com.android.app.gamemode.battery.enabled";
- public int getGameMode() {
- return mGameMode;
- }
+ private final String mPackageName;
+ private final ArrayMap<Integer, GameModeConfiguration> mModeConfigs;
+ private boolean mPerfModeOptedIn;
+ private boolean mBatteryModeOptedIn;
+ private boolean mAllowDownscale;
- public String getScaling() {
- return mScaling;
+ GamePackageConfiguration(String packageName, int userId) {
+ mPackageName = packageName;
+ mModeConfigs = new ArrayMap<>();
+ try {
+ final ApplicationInfo ai = mPackageManager.getApplicationInfoAsUser(packageName,
+ PackageManager.GET_META_DATA, userId);
+ if (ai.metaData != null) {
+ mPerfModeOptedIn = ai.metaData.getBoolean(METADATA_PERFORMANCE_MODE_ENABLE);
+ mBatteryModeOptedIn = ai.metaData.getBoolean(METADATA_BATTERY_MODE_ENABLE);
+ mAllowDownscale = ai.metaData.getBoolean(METADATA_WM_ALLOW_DOWNSCALE, true);
+ } else {
+ mPerfModeOptedIn = false;
+ mBatteryModeOptedIn = false;
+ mAllowDownscale = true;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(TAG, "Failed to get package metadata", e);
+ }
+ final String configString = DeviceConfig.getProperty(
+ DeviceConfig.NAMESPACE_GAME_OVERLAY, packageName);
+ if (configString != null) {
+ final String[] gameModeConfigStrings = configString.split(":");
+ for (String gameModeConfigString : gameModeConfigStrings) {
+ try {
+ final KeyValueListParser parser = new KeyValueListParser(',');
+ parser.setString(gameModeConfigString);
+ addModeConfig(new GameModeConfiguration(parser));
+ } catch (IllegalArgumentException e) {
+ Slog.e(TAG, "Invalid config string");
+ }
+ }
+ }
}
- public boolean isValid() {
- return (mGameMode == GameManager.GAME_MODE_PERFORMANCE
- || mGameMode == GameManager.GAME_MODE_BATTERY) && getCompatChangeId() != 0;
- }
+ /**
+ * GameModeConfiguration contains all the values for all the interventions associated with
+ * a game mode.
+ */
+ @VisibleForTesting
+ public class GameModeConfiguration {
+ public static final String TAG = "GameManagerService_GameModeConfiguration";
+ public static final String MODE_KEY = "mode";
+ public static final String SCALING_KEY = "downscaleFactor";
+ public static final String DEFAULT_SCALING = "1.0";
+
+ private final @GameMode int mGameMode;
+ private final String mScaling;
+
+ GameModeConfiguration(KeyValueListParser parser) {
+ mGameMode = parser.getInt(MODE_KEY, GameManager.GAME_MODE_UNSUPPORTED);
+ mScaling = !mAllowDownscale || isGameModeOptedIn(mGameMode)
+ ? DEFAULT_SCALING : parser.getString(SCALING_KEY, DEFAULT_SCALING);
+ }
- public String toString() {
- return "[Game Mode:" + mGameMode + ",Scaling:" + mScaling + "]";
- }
+ public int getGameMode() {
+ return mGameMode;
+ }
- public long getCompatChangeId() {
- switch (mScaling) {
- case "0.5":
- return DOWNSCALE_50;
- case "0.6":
- return DOWNSCALE_60;
- case "0.7":
- return DOWNSCALE_70;
- case "0.8":
- return DOWNSCALE_80;
- case "0.9":
- return DOWNSCALE_90;
+ public String getScaling() {
+ return mScaling;
}
- return 0;
- }
- }
- private static class GamePackageConfiguration {
- public static final String TAG = "GameManagerService_GamePackageConfiguration";
+ public boolean isValid() {
+ return (mGameMode == GameManager.GAME_MODE_PERFORMANCE
+ || mGameMode == GameManager.GAME_MODE_BATTERY)
+ && (!mAllowDownscale || getCompatChangeId() != 0);
+ }
- private final String mPackageName;
- private final ArrayMap<Integer, GameModeConfiguration> mModeConfigs;
+ /**
+ * @hide
+ */
+ public String toString() {
+ return "[Game Mode:" + mGameMode + ",Scaling:" + mScaling + "]";
+ }
- private GamePackageConfiguration(String packageName) {
- mPackageName = packageName;
- mModeConfigs = new ArrayMap<>();
+ /**
+ * Get the corresponding compat change id for the current scaling string.
+ */
+ public long getCompatChangeId() {
+ switch (mScaling) {
+ case "0.5":
+ return DOWNSCALE_50;
+ case "0.6":
+ return DOWNSCALE_60;
+ case "0.7":
+ return DOWNSCALE_70;
+ case "0.8":
+ return DOWNSCALE_80;
+ case "0.9":
+ return DOWNSCALE_90;
+ }
+ return 0;
+ }
}
public String getPackageName() {
return mPackageName;
}
+ /**
+ * Gets whether a package has opted into a game mode via its manifest.
+ *
+ * @return True if the app package has specified in its metadata either:
+ * "com.android.app.gamemode.performance.enabled" or
+ * "com.android.app.gamemode.battery.enabled" with a value of "true"
+ */
+ public boolean isGameModeOptedIn(@GameMode int gameMode) {
+ return (mBatteryModeOptedIn && gameMode == GameManager.GAME_MODE_BATTERY)
+ || (mPerfModeOptedIn && gameMode == GameManager.GAME_MODE_PERFORMANCE);
+ }
+
public @GameMode int[] getAvailableGameModes() {
- if (mModeConfigs.keySet().size() > 0) {
- return mModeConfigs.keySet().stream()
- .mapToInt(Integer::intValue).toArray();
+ ArraySet<Integer> modeSet = new ArraySet<>(mModeConfigs.keySet());
+ if (mBatteryModeOptedIn) {
+ modeSet.add(GameManager.GAME_MODE_BATTERY);
+ }
+ if (mPerfModeOptedIn) {
+ modeSet.add(GameManager.GAME_MODE_PERFORMANCE);
+ }
+ if (modeSet.size() > 0) {
+ modeSet.add(GameManager.GAME_MODE_STANDARD);
+ return modeSet.stream().mapToInt(Integer::intValue).toArray();
}
return new int[]{GameManager.GAME_MODE_UNSUPPORTED};
}
@@ -327,30 +399,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
}
}
- /**
- * Create a new instance from a package name and DeviceConfig.Properties instance
- */
- public static GamePackageConfiguration fromProperties(String key,
- Properties properties) {
- final GamePackageConfiguration packageConfig = new GamePackageConfiguration(key);
- final String configString = properties.getString(key, "");
- final String[] gameModeConfigStrings = configString.split(":");
- for (String gameModeConfigString : gameModeConfigStrings) {
- try {
- final KeyValueListParser parser = new KeyValueListParser(',');
- parser.setString(gameModeConfigString);
- final GameModeConfiguration config =
- GameModeConfiguration.fromKeyValueListParser(parser);
- packageConfig.addModeConfig(config);
- } catch (IllegalArgumentException e) {
- Slog.e(TAG, "Invalid config string");
- }
- }
- return packageConfig;
- }
-
public boolean isValid() {
- return mModeConfigs.size() > 0;
+ return mModeConfigs.size() > 0 || mBatteryModeOptedIn || mPerfModeOptedIn;
}
public String toString() {
@@ -534,8 +584,6 @@ public final class GameManagerService extends IGameManagerService.Stub {
@VisibleForTesting
void onBootCompleted() {
Slog.d(TAG, "onBootCompleted");
- final Message msg = mHandler.obtainMessage(POPULATE_GAME_MODE_SETTINGS);
- mHandler.sendMessage(msg);
}
void onUserStarting(int userId) {
@@ -549,6 +597,9 @@ public final class GameManagerService extends IGameManagerService.Stub {
mSettings.put(userId, userSettings);
userSettings.readPersistentDataLocked();
}
+ final Message msg = mHandler.obtainMessage(POPULATE_GAME_MODE_SETTINGS);
+ msg.obj = userId;
+ mHandler.sendMessage(msg);
}
void onUserStopping(int userId) {
@@ -562,24 +613,14 @@ public final class GameManagerService extends IGameManagerService.Stub {
}
}
- void loadDeviceConfigLocked() {
- final List<PackageInfo> packages = mPackageManager.getInstalledPackages(0);
- final String[] packageNames = packages.stream().map(e -> e.packageName)
- .toArray(String[]::new);
- synchronized (mDeviceConfigLock) {
- final Properties properties = DeviceConfig.getProperties(
- DeviceConfig.NAMESPACE_GAME_OVERLAY, packageNames);
- for (String key : properties.getKeyset()) {
- final GamePackageConfiguration config =
- GamePackageConfiguration.fromProperties(key, properties);
- putConfig(config);
- }
- }
- }
-
- private void disableCompatScale(String packageName) {
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ public void disableCompatScale(String packageName) {
final long uid = Binder.clearCallingIdentity();
try {
+ Slog.i(TAG, "Disabling downscale for " + packageName);
final ArrayMap<Long, PackageOverride> overrides = new ArrayMap<>();
overrides.put(DOWNSCALED, COMPAT_DISABLED);
final CompatibilityOverrideConfig changeConfig = new CompatibilityOverrideConfig(
@@ -597,6 +638,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
private void enableCompatScale(String packageName, long scaleId) {
final long uid = Binder.clearCallingIdentity();
try {
+ Slog.i(TAG, "Enabling downscale: " + scaleId + " for " + packageName);
final ArrayMap<Long, PackageOverride> overrides = new ArrayMap<>();
overrides.put(DOWNSCALED, COMPAT_ENABLED);
overrides.put(DOWNSCALE_50, COMPAT_DISABLED);
@@ -622,21 +664,25 @@ public final class GameManagerService extends IGameManagerService.Stub {
if (gameMode == GameManager.GAME_MODE_STANDARD
|| gameMode == GameManager.GAME_MODE_UNSUPPORTED) {
disableCompatScale(packageName);
- Slog.v(TAG, "Disabling downscale");
+ return;
+ }
+ final GamePackageConfiguration packageConfig = mConfigs.get(packageName);
+ if (packageConfig == null) {
+ disableCompatScale(packageName);
+ Slog.v(TAG, "Package configuration not found for " + packageName);
return;
}
if (DEBUG) {
Slog.v(TAG, dumpDeviceConfigs());
}
- final GamePackageConfiguration packageConfig = mConfigs.get(packageName);
- if (packageConfig == null) {
- Slog.w(TAG, "Package configuration not found for " + packageName);
+ if (packageConfig.isGameModeOptedIn(gameMode)) {
+ disableCompatScale(packageName);
return;
}
- final GameModeConfiguration modeConfig = packageConfig.getGameModeConfiguration(
- gameMode);
+ final GamePackageConfiguration.GameModeConfiguration modeConfig =
+ packageConfig.getGameModeConfiguration(gameMode);
if (modeConfig == null) {
- Slog.w(TAG, "Game mode " + gameMode + " not found for " + packageName);
+ Slog.i(TAG, "Game mode " + gameMode + " not found for " + packageName);
return;
}
long scaleId = modeConfig.getCompatChangeId();
@@ -645,23 +691,64 @@ public final class GameManagerService extends IGameManagerService.Stub {
+ packageName);
return;
}
- Slog.i(TAG, "Enabling downscale: " + scaleId + " for " + packageName);
+
enableCompatScale(packageName, scaleId);
}
}
- private void putConfig(GamePackageConfiguration config) {
- if (config.isValid()) {
- if (DEBUG) {
- Slog.i(TAG, "Adding config: " + config.toString());
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ public void updateConfigsForUser(int userId, String ...packageNames) {
+ try {
+ synchronized (mDeviceConfigLock) {
+ for (String packageName : packageNames) {
+ GamePackageConfiguration config =
+ new GamePackageConfiguration(packageName, userId);
+ if (config.isValid()) {
+ if (DEBUG) {
+ Slog.i(TAG, "Adding config: " + config.toString());
+ }
+ mConfigs.put(packageName, config);
+ } else {
+ Slog.w(TAG, "Invalid package config for "
+ + config.getPackageName() + ":" + config.toString());
+ mConfigs.remove(packageName);
+ }
+ }
}
- mConfigs.put(config.getPackageName(), config);
- } else {
- Slog.w(TAG, "Invalid package config for "
- + config.getPackageName() + ":" + config.toString());
+ for (String packageName : packageNames) {
+ synchronized (mLock) {
+ if (mSettings.containsKey(userId)) {
+ GameManagerSettings userSettings = mSettings.get(userId);
+ updateCompatModeDownscale(packageName,
+ userSettings.getGameModeLocked(packageName));
+ }
+ }
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, "Failed to update compat modes for user: " + userId);
}
}
+ private String[] getInstalledGamePackageNames(int userId) {
+ final List<PackageInfo> packages =
+ mPackageManager.getInstalledPackagesAsUser(0, userId);
+ return packages.stream().filter(e -> e.applicationInfo != null && e.applicationInfo.category
+ == ApplicationInfo.CATEGORY_GAME)
+ .map(e -> e.packageName)
+ .toArray(String[]::new);
+ }
+
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ public GamePackageConfiguration getConfig(String packageName) {
+ return mConfigs.get(packageName);
+ }
+
private void registerPackageReceiver() {
final IntentFilter packageFilter = new IntentFilter();
packageFilter.addAction(ACTION_PACKAGE_ADDED);
@@ -677,16 +764,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
switch (intent.getAction()) {
case ACTION_PACKAGE_ADDED:
case ACTION_PACKAGE_CHANGED:
- synchronized (mDeviceConfigLock) {
- Properties properties = DeviceConfig.getProperties(
- DeviceConfig.NAMESPACE_GAME_OVERLAY, packageName);
- for (String key : properties.getKeyset()) {
- GamePackageConfiguration config =
- GamePackageConfiguration.fromProperties(key,
- properties);
- putConfig(config);
- }
- }
+ updateConfigsForUser(mContext.getUserId(), packageName);
break;
case ACTION_PACKAGE_REMOVED:
disableCompatScale(packageName);
diff --git a/services/core/java/com/android/server/appop/DiscreteRegistry.java b/services/core/java/com/android/server/appop/DiscreteRegistry.java
index 63b41b789280..e9b61b3ab7fb 100644
--- a/services/core/java/com/android/server/appop/DiscreteRegistry.java
+++ b/services/core/java/com/android/server/appop/DiscreteRegistry.java
@@ -69,18 +69,47 @@ import java.util.Date;
import java.util.List;
/**
- * This class manages information about recent accesses to ops for
- * permission usage timeline.
+ * This class manages information about recent accesses to ops for permission usage timeline.
*
- * The timeline history is kept for limited time (initial default is 24 hours) and
- * discarded after that.
+ * The discrete history is kept for limited time (initial default is 24 hours, set in
+ * {@link DiscreteRegistry#sDiscreteHistoryCutoff) and discarded after that.
+ *
+ * Discrete history is quantized to reduce resources footprint. By default quantization is set to
+ * one minute in {@link DiscreteRegistry#sDiscreteHistoryQuantization}. All access times are aligned
+ * to the closest quantized time. All durations (except -1, meaning no duration) are rounded up to
+ * the closest quantized interval.
+ *
+ * When data is queried through API, events are deduplicated and for every time quant there can
+ * be only one {@link AppOpsManager.AttributedOpEntry}. Each entry contains information about
+ * different accesses which happened in specified time quant - across dimensions of
+ * {@link AppOpsManager.UidState} and {@link AppOpsManager.OpFlags}. For each dimension
+ * it is only possible to know if at least one access happened in the time quant.
*
* Every time state is saved (default is 30 minutes), memory state is dumped to a
* new file and memory state is cleared. Files older than time limit are deleted
* during the process.
*
* When request comes in, files are read and requested information is collected
- * and delivered.
+ * and delivered. Information is cached in memory until the next state save (up to 30 minutes), to
+ * avoid reading disk if more API calls come in a quick succession.
+ *
+ * THREADING AND LOCKING:
+ * For in-memory transactions this class relies on {@link DiscreteRegistry#mInMemoryLock}. It is
+ * assumed that the same lock is used for in-memory transactions in {@link AppOpsService},
+ * {@link HistoricalRegistry}, and {@link DiscreteRegistry}.
+ * {@link DiscreteRegistry#recordDiscreteAccess(int, String, int, String, int, int, long, long)}
+ * must only be called while holding this lock.
+ * {@link DiscreteRegistry#mOnDiskLock} is used when disk transactions are performed.
+ * It is very important to release {@link DiscreteRegistry#mInMemoryLock} as soon as possible, as
+ * no AppOps related transactions across the system can be performed while it is held.
+ *
+ * INITIALIZATION: We can initialize persistence only after the system is ready
+ * as we need to check the optional configuration override from the settings
+ * database which is not initialized at the time the app ops service is created. This class
+ * relies on {@link HistoricalRegistry} for controlling that no calls are allowed until then. All
+ * outside calls are going through {@link HistoricalRegistry}, where
+ * {@link HistoricalRegistry#isPersistenceInitializedMLocked()} check is done.
+ *
*/
final class DiscreteRegistry {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 9fd79cefa19c..0840e75823b5 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -123,7 +123,7 @@ import static com.android.server.utils.PriorityDump.PRIORITY_ARG_NORMAL;
import android.Manifest;
import android.Manifest.permission;
-import android.annotation.CallbackExecutor;
+import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -492,7 +492,7 @@ public class NotificationManagerService extends SystemService {
private DeviceIdleManager mDeviceIdleManager;
private IUriGrantsManager mUgm;
private UriGrantsManagerInternal mUgmInternal;
- private RoleObserver mRoleObserver;
+ private volatile RoleObserver mRoleObserver;
private UserManager mUm;
private IPlatformCompat mPlatformCompat;
private ShortcutHelper mShortcutHelper;
@@ -2651,6 +2651,11 @@ public class NotificationManagerService extends SystemService {
@Override
public void onBootPhase(int phase) {
+ onBootPhase(phase, Looper.getMainLooper());
+ }
+
+ @VisibleForTesting
+ void onBootPhase(int phase, Looper mainLooper) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
// no beeping until we're basically done booting
mSystemReady = true;
@@ -2660,9 +2665,11 @@ public class NotificationManagerService extends SystemService {
mAudioManagerInternal = getLocalService(AudioManagerInternal.class);
mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
mZenModeHelper.onSystemReady();
- mRoleObserver = new RoleObserver(getContext().getSystemService(RoleManager.class),
- mPackageManager, getContext().getMainExecutor());
- mRoleObserver.init();
+ RoleObserver roleObserver = new RoleObserver(getContext(),
+ getContext().getSystemService(RoleManager.class),
+ mPackageManager, mainLooper);
+ roleObserver.init();
+ mRoleObserver = roleObserver;
LauncherApps launcherApps =
(LauncherApps) getContext().getSystemService(Context.LAUNCHER_APPS_SERVICE);
mShortcutHelper = new ShortcutHelper(launcherApps, mShortcutListener, getLocalService(
@@ -10688,26 +10695,40 @@ public class NotificationManagerService extends SystemService {
// Role name : user id : list of approved packages
private ArrayMap<String, ArrayMap<Integer, ArraySet<String>>> mNonBlockableDefaultApps;
+ /**
+ * Writes should be pretty rare (only when default browser changes) and reads are done
+ * during activity start code-path, so we're optimizing for reads. This means this set is
+ * immutable once written and we'll recreate the set every time there is a role change and
+ * then assign that new set to the volatile below, so reads can be done without needing to
+ * hold a lock. Every write is done on the main-thread, so write atomicity is guaranteed.
+ *
+ * Didn't use unmodifiable set to enforce immutability to avoid iterating via iterators.
+ */
+ private volatile ArraySet<Integer> mTrampolineExemptUids = new ArraySet<>();
+
private final RoleManager mRm;
private final IPackageManager mPm;
private final Executor mExecutor;
+ private final Looper mMainLooper;
- RoleObserver(@NonNull RoleManager roleManager,
- @NonNull IPackageManager pkgMgr,
- @NonNull @CallbackExecutor Executor executor) {
+ RoleObserver(Context context, @NonNull RoleManager roleManager,
+ @NonNull IPackageManager pkgMgr, @NonNull Looper mainLooper) {
mRm = roleManager;
mPm = pkgMgr;
- mExecutor = executor;
+ mExecutor = context.getMainExecutor();
+ mMainLooper = mainLooper;
}
+ /** Should be called from the main-thread. */
+ @MainThread
public void init() {
- List<UserInfo> users = mUm.getUsers();
+ List<UserHandle> users = mUm.getUserHandles(/* excludeDying */ true);
mNonBlockableDefaultApps = new ArrayMap<>();
for (int i = 0; i < NON_BLOCKABLE_DEFAULT_ROLES.length; i++) {
final ArrayMap<Integer, ArraySet<String>> userToApprovedList = new ArrayMap<>();
mNonBlockableDefaultApps.put(NON_BLOCKABLE_DEFAULT_ROLES[i], userToApprovedList);
for (int j = 0; j < users.size(); j++) {
- Integer userId = users.get(j).getUserHandle().getIdentifier();
+ Integer userId = users.get(j).getIdentifier();
ArraySet<String> approvedForUserId = new ArraySet<>(mRm.getRoleHoldersAsUser(
NON_BLOCKABLE_DEFAULT_ROLES[i], UserHandle.of(userId)));
ArraySet<Pair<String, Integer>> approvedAppUids = new ArraySet<>();
@@ -10718,7 +10739,7 @@ public class NotificationManagerService extends SystemService {
mPreferencesHelper.updateDefaultApps(userId, null, approvedAppUids);
}
}
-
+ updateTrampolineExemptUidsForUsers(users.toArray(new UserHandle[0]));
mRm.addOnRoleHoldersChangedListenerAsUser(mExecutor, this, UserHandle.ALL);
}
@@ -10727,6 +10748,11 @@ public class NotificationManagerService extends SystemService {
return mNonBlockableDefaultApps.get(role).get(userId).contains(pkg);
}
+ @VisibleForTesting
+ public boolean isUidExemptFromTrampolineRestrictions(int uid) {
+ return mTrampolineExemptUids.contains(uid);
+ }
+
/**
* Convert the assistant-role holder into settings. The rest of the system uses the
* settings.
@@ -10736,6 +10762,12 @@ public class NotificationManagerService extends SystemService {
*/
@Override
public void onRoleHoldersChanged(@NonNull String roleName, @NonNull UserHandle user) {
+ onRoleHoldersChangedForNonBlockableDefaultApps(roleName, user);
+ onRoleHoldersChangedForTrampolines(roleName, user);
+ }
+
+ private void onRoleHoldersChangedForNonBlockableDefaultApps(@NonNull String roleName,
+ @NonNull UserHandle user) {
// we only care about a couple of the roles they'll tell us about
boolean relevantChange = false;
for (int i = 0; i < NON_BLOCKABLE_DEFAULT_ROLES.length; i++) {
@@ -10783,6 +10815,41 @@ public class NotificationManagerService extends SystemService {
// write of the notification policy xml for this change
}
+ private void onRoleHoldersChangedForTrampolines(@NonNull String roleName,
+ @NonNull UserHandle user) {
+ if (!RoleManager.ROLE_BROWSER.equals(roleName)) {
+ return;
+ }
+ updateTrampolineExemptUidsForUsers(user);
+ }
+
+ private void updateTrampolineExemptUidsForUsers(UserHandle... users) {
+ Preconditions.checkState(mMainLooper.isCurrentThread());
+ ArraySet<Integer> oldUids = mTrampolineExemptUids;
+ ArraySet<Integer> newUids = new ArraySet<>();
+ // Add the uids from previous set for the users that we won't update.
+ for (int i = 0, n = oldUids.size(); i < n; i++) {
+ int uid = oldUids.valueAt(i);
+ UserHandle user = UserHandle.of(UserHandle.getUserId(uid));
+ if (!ArrayUtils.contains(users, user)) {
+ newUids.add(uid);
+ }
+ }
+ // Now lookup the new uids for the users that we want to update.
+ for (int i = 0, n = users.length; i < n; i++) {
+ UserHandle user = users[i];
+ for (String pkg : mRm.getRoleHoldersAsUser(RoleManager.ROLE_BROWSER, user)) {
+ int uid = getUidForPackage(pkg, user.getIdentifier());
+ if (uid != -1) {
+ newUids.add(uid);
+ } else {
+ Slog.e(TAG, "Bad uid (-1) for browser package " + pkg);
+ }
+ }
+ }
+ mTrampolineExemptUids = newUids;
+ }
+
private int getUidForPackage(String pkg, int userId) {
try {
return mPm.getPackageUid(pkg, MATCH_ALL, userId);
@@ -10947,7 +11014,7 @@ public class NotificationManagerService extends SystemService {
}
String logcatMessage =
"Indirect notification activity start (trampoline) from " + packageName;
- if (CompatChanges.isChangeEnabled(NOTIFICATION_TRAMPOLINE_BLOCK, uid)) {
+ if (blockTrampoline(uid)) {
// Post toast() call to mHandler to offload PM lookup from the activity start path
mHandler.post(() -> toast(packageName, uid));
Slog.e(TAG, logcatMessage + " blocked");
@@ -10958,6 +11025,13 @@ public class NotificationManagerService extends SystemService {
}
}
+ private boolean blockTrampoline(int uid) {
+ if (mRoleObserver != null && mRoleObserver.isUidExemptFromTrampolineRestrictions(uid)) {
+ return false;
+ }
+ return CompatChanges.isChangeEnabled(NOTIFICATION_TRAMPOLINE_BLOCK, uid);
+ }
+
@Override
public boolean canCloseSystemDialogs(Collection<IBinder> tokens, int uid) {
// If the start is allowed via notification, we allow the app to close system dialogs
diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java
index afce23fe7647..28511070fc8e 100644
--- a/services/core/java/com/android/server/pm/ApkChecksums.java
+++ b/services/core/java/com/android/server/pm/ApkChecksums.java
@@ -303,8 +303,8 @@ public class ApkChecksums {
* @param onChecksumsReadyListener to receive the resulting checksums
*/
public static void getChecksums(List<Pair<String, File>> filesToChecksum,
- @Checksum.Type int optional,
- @Checksum.Type int required,
+ @Checksum.TypeMask int optional,
+ @Checksum.TypeMask int required,
@Nullable String installerPackageName,
@Nullable Certificate[] trustedInstallers,
@NonNull IOnChecksumsReadyListener onChecksumsReadyListener,
@@ -331,7 +331,7 @@ public class ApkChecksums {
private static void processRequiredChecksums(List<Pair<String, File>> filesToChecksum,
List<Map<Integer, ApkChecksum>> result,
- @Checksum.Type int required,
+ @Checksum.TypeMask int required,
@NonNull IOnChecksumsReadyListener onChecksumsReadyListener,
@NonNull Injector injector,
long startTime) {
@@ -382,7 +382,7 @@ public class ApkChecksums {
* @param checksums resulting checksums
*/
private static void getAvailableApkChecksums(String split, File file,
- @Checksum.Type int types,
+ @Checksum.TypeMask int types,
@Nullable String installerPackageName,
@Nullable Certificate[] trustedInstallers,
Map<Integer, ApkChecksum> checksums,
@@ -415,7 +415,7 @@ public class ApkChecksums {
}
private static void getInstallerChecksums(String split, File file,
- @Checksum.Type int types,
+ @Checksum.TypeMask int types,
@Nullable String installerPackageName,
@Nullable Certificate[] trustedInstallers,
Map<Integer, ApkChecksum> checksums,
@@ -523,7 +523,7 @@ public class ApkChecksums {
* Whether the file is available for checksumming or we need to wait.
*/
private static boolean needToWait(File file,
- @Checksum.Type int types,
+ @Checksum.TypeMask int types,
Map<Integer, ApkChecksum> checksums,
@NonNull Injector injector) throws IOException {
if (!isRequired(TYPE_WHOLE_MERKLE_ROOT_4K_SHA256, types, checksums)
@@ -564,7 +564,7 @@ public class ApkChecksums {
* @param checksums resulting checksums
*/
private static void getRequiredApkChecksums(String split, File file,
- @Checksum.Type int types,
+ @Checksum.TypeMask int types,
Map<Integer, ApkChecksum> checksums) {
final String filePath = file.getAbsolutePath();
@@ -596,7 +596,7 @@ public class ApkChecksums {
}
private static boolean isRequired(@Checksum.Type int type,
- @Checksum.Type int types, Map<Integer, ApkChecksum> checksums) {
+ @Checksum.TypeMask int types, Map<Integer, ApkChecksum> checksums) {
if ((types & type) == 0) {
return false;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 51288de09c0d..3fc9ac2d9378 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -5707,8 +5707,8 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public void requestChecksums(@NonNull String packageName, boolean includeSplits,
- @Checksum.Type int optional,
- @Checksum.Type int required, @Nullable List trustedInstallers,
+ @Checksum.TypeMask int optional,
+ @Checksum.TypeMask int required, @Nullable List trustedInstallers,
@NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId) {
requestChecksumsInternal(packageName, includeSplits, optional, required, trustedInstallers,
onChecksumsReadyListener, userId, mInjector.getBackgroundExecutor(),
@@ -5716,7 +5716,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
private void requestChecksumsInternal(@NonNull String packageName, boolean includeSplits,
- @Checksum.Type int optional, @Checksum.Type int required,
+ @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
@Nullable List trustedInstallers,
@NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
@NonNull Executor executor, @NonNull Handler handler) {
@@ -26033,18 +26033,29 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public String[] getNamesForUids(int[] uids) throws RemoteException {
- if (uids == null || uids.length == 0) {
- return null;
- }
- final String[] names = PackageManagerService.this.getNamesForUids(uids);
- final String[] results = (names != null) ? names : new String[uids.length];
- // massage results so they can be parsed by the native binder
- for (int i = results.length - 1; i >= 0; --i) {
- if (results[i] == null) {
- results[i] = "";
+ String[] names = null;
+ String[] results = null;
+ try {
+ if (uids == null || uids.length == 0) {
+ return null;
+ }
+ names = PackageManagerService.this.getNamesForUids(uids);
+ results = (names != null) ? names : new String[uids.length];
+ // massage results so they can be parsed by the native binder
+ for (int i = results.length - 1; i >= 0; --i) {
+ if (results[i] == null) {
+ results[i] = "";
+ }
}
+ return results;
+ } catch (Throwable t) {
+ // STOPSHIP(186558987): revert addition of try/catch/log
+ Slog.e(TAG, "uids: " + Arrays.toString(uids));
+ Slog.e(TAG, "names: " + Arrays.toString(names));
+ Slog.e(TAG, "results: " + Arrays.toString(results));
+ Slog.e(TAG, "throwing exception", t);
+ throw t;
}
- return results;
}
// NB: this differentiates between preloads and sideloads
@@ -27239,7 +27250,7 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public void requestChecksums(@NonNull String packageName, boolean includeSplits,
- @Checksum.Type int optional, @Checksum.Type int required,
+ @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
@Nullable List trustedInstallers,
@NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
@NonNull Executor executor, @NonNull Handler handler) {
diff --git a/services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java b/services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java
index c8c828f10ad3..27b50d892144 100644
--- a/services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java
+++ b/services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java
@@ -89,8 +89,6 @@ public final class MetricsTimeZoneDetectorState {
@Nullable TelephonyTimeZoneSuggestion latestTelephonySuggestion,
@Nullable GeolocationTimeZoneSuggestion latestGeolocationSuggestion) {
- // TODO(b/172934905) Add logic to canonicalize the time zone IDs to Android's preferred IDs
- // so that the ordinals will match even when the ID is not identical, just equivalent.
int deviceTimeZoneIdOrdinal =
tzIdOrdinalGenerator.ordinal(Objects.requireNonNull(deviceTimeZoneId));
MetricsTimeZoneSuggestion latestObfuscatedManualSuggestion =
diff --git a/services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java b/services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java
index a448773c40d5..50875308db7d 100644
--- a/services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java
+++ b/services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java
@@ -15,9 +15,12 @@
*/
package com.android.server.timezonedetector;
+import android.annotation.NonNull;
import android.util.ArraySet;
import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
/**
* A helper class that turns a set of objects into ordinal values, i.e. each object is offered
@@ -30,11 +33,19 @@ import java.util.List;
class OrdinalGenerator<T> {
private final ArraySet<T> mKnownIds = new ArraySet<>();
+ private final @NonNull Function<T, T> mCanonicalizationFunction;
+
+ OrdinalGenerator(@NonNull Function<T, T> canonicalizationFunction) {
+ mCanonicalizationFunction = Objects.requireNonNull(canonicalizationFunction);
+ }
+
int ordinal(T object) {
- int ordinal = mKnownIds.indexOf(object);
+ T canonical = mCanonicalizationFunction.apply(object);
+
+ int ordinal = mKnownIds.indexOf(canonical);
if (ordinal < 0) {
ordinal = mKnownIds.size();
- mKnownIds.add(object);
+ mKnownIds.add(canonical);
}
return ordinal;
}
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneCanonicalizer.java b/services/core/java/com/android/server/timezonedetector/TimeZoneCanonicalizer.java
new file mode 100644
index 000000000000..bdbf60712008
--- /dev/null
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneCanonicalizer.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2021 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.timezonedetector;
+
+import com.android.i18n.timezone.TimeZoneFinder;
+
+import java.util.function.Function;
+
+/**
+ * Returns preferred time zone ID if {@code timeZoneId} was deprecated. For example, returns
+ * America/Nuuk for America/Godthab.
+ */
+final class TimeZoneCanonicalizer implements Function<String, String> {
+ @Override
+ public String apply(String timeZoneId) {
+ String canonicialZoneId = TimeZoneFinder.getInstance().getCountryZonesFinder()
+ .findCanonicalTimeZoneId(timeZoneId);
+
+ return canonicialZoneId == null ? timeZoneId : canonicialZoneId;
+ }
+}
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java
index c34a7d37ba24..ab2a88b44a87 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java
@@ -383,7 +383,8 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
bestQualifiedTelephonySuggestion == null
? null : bestQualifiedTelephonySuggestion.suggestion;
// A new generator is created each time: we don't want / require consistency.
- OrdinalGenerator<String> tzIdOrdinalGenerator = new OrdinalGenerator<>();
+ OrdinalGenerator<String> tzIdOrdinalGenerator =
+ new OrdinalGenerator<>(new TimeZoneCanonicalizer());
return MetricsTimeZoneDetectorState.create(
tzIdOrdinalGenerator,
getConfigurationInternal(currentUserId),
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 800f7addbd65..f92db86bb880 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -52,7 +52,8 @@ java_library {
libs: [
"unsupportedappusage",
"framework-wifi-util-lib",
- "framework-connectivity"
+ "framework-connectivity",
+ "modules-utils-build_system",
],
static_libs: [
// All the classes in netd_aidl_interface must be jarjar so they do not conflict with the
@@ -60,6 +61,7 @@ java_library {
"netd_aidl_interface-V3-java",
"netlink-client",
"networkstack-client",
+ "modules-utils-build_system",
],
apex_available: [
"com.android.wifi",
@@ -80,7 +82,7 @@ filegroup {
],
visibility: [
"//frameworks/base/packages/Tethering",
- "//packages/modules/Connectivity/Tethering"
+ "//packages/modules/Connectivity/Tethering",
],
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java
index a8d8a90e8935..96495701811e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java
@@ -19,6 +19,7 @@ package com.android.server.app;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -32,8 +33,10 @@ import android.content.ContextWrapper;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.os.Bundle;
import android.platform.test.annotations.Presubmit;
import android.provider.DeviceConfig;
+import android.util.ArraySet;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -140,15 +143,19 @@ public class GameManagerServiceTests {
applicationInfo.category = ApplicationInfo.CATEGORY_GAME;
final PackageInfo pi = new PackageInfo();
pi.packageName = mPackageName;
+ pi.applicationInfo = applicationInfo;
final List<PackageInfo> packages = new ArrayList<>();
packages.add(pi);
- when(mMockPackageManager.getInstalledPackages(anyInt())).thenReturn(packages);
+ when(mMockPackageManager.getInstalledPackagesAsUser(anyInt(), anyInt()))
+ .thenReturn(packages);
when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
.thenReturn(applicationInfo);
}
@After
public void tearDown() throws Exception {
+ GameManagerService gameManagerService = new GameManagerService(mMockContext);
+ gameManagerService.disableCompatScale(mPackageName);
if (mMockingSession != null) {
mMockingSession.finishMocking();
}
@@ -165,57 +172,95 @@ public class GameManagerServiceTests {
}
private void mockDeviceConfigDefault() {
- DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder(
- DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, "").build();
- when(DeviceConfig.getProperties(anyString(), anyString()))
- .thenReturn(properties);
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn("");
}
private void mockDeviceConfigNone() {
- DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder(
- DeviceConfig.NAMESPACE_GAME_OVERLAY).build();
- when(DeviceConfig.getProperties(anyString(), anyString()))
- .thenReturn(properties);
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(null);
}
private void mockDeviceConfigPerformance() {
String configString = "mode=2,downscaleFactor=0.5";
- DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder(
- DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build();
- when(DeviceConfig.getProperties(anyString(), anyString()))
- .thenReturn(properties);
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configString);
}
private void mockDeviceConfigBattery() {
String configString = "mode=3,downscaleFactor=0.7";
- DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder(
- DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build();
- when(DeviceConfig.getProperties(anyString(), anyString()))
- .thenReturn(properties);
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configString);
}
private void mockDeviceConfigAll() {
String configString = "mode=3,downscaleFactor=0.7:mode=2,downscaleFactor=0.5";
- DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder(
- DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build();
- when(DeviceConfig.getProperties(anyString(), anyString()))
- .thenReturn(properties);
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configString);
}
private void mockDeviceConfigInvalid() {
String configString = "mode=2,downscaleFactor=0.55";
- DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder(
- DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build();
- when(DeviceConfig.getProperties(anyString(), anyString()))
- .thenReturn(properties);
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configString);
}
private void mockDeviceConfigMalformed() {
String configString = "adsljckv=nin3rn9hn1231245:8795tq=21ewuydg";
- DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder(
- DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build();
- when(DeviceConfig.getProperties(anyString(), anyString()))
- .thenReturn(properties);
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configString);
+ }
+
+ private void mockGameModeOptInAll() throws Exception {
+ final ApplicationInfo applicationInfo = new ApplicationInfo();
+ Bundle metaDataBundle = new Bundle();
+ metaDataBundle.putBoolean(
+ GameManagerService.GamePackageConfiguration.METADATA_PERFORMANCE_MODE_ENABLE, true);
+ metaDataBundle.putBoolean(
+ GameManagerService.GamePackageConfiguration.METADATA_BATTERY_MODE_ENABLE, true);
+ applicationInfo.metaData = metaDataBundle;
+ when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
+ .thenReturn(applicationInfo);
+ }
+
+ private void mockGameModeOptInPerformance() throws Exception {
+ final ApplicationInfo applicationInfo = new ApplicationInfo();
+ Bundle metaDataBundle = new Bundle();
+ metaDataBundle.putBoolean(
+ GameManagerService.GamePackageConfiguration.METADATA_PERFORMANCE_MODE_ENABLE, true);
+ applicationInfo.metaData = metaDataBundle;
+ when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
+ .thenReturn(applicationInfo);
+ }
+
+ private void mockGameModeOptInBattery() throws Exception {
+ final ApplicationInfo applicationInfo = new ApplicationInfo();
+ Bundle metaDataBundle = new Bundle();
+ metaDataBundle.putBoolean(
+ GameManagerService.GamePackageConfiguration.METADATA_BATTERY_MODE_ENABLE, true);
+ applicationInfo.metaData = metaDataBundle;
+ when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
+ .thenReturn(applicationInfo);
+ }
+
+ private void mockInterventionAllowDownscaleTrue() throws Exception {
+ final ApplicationInfo applicationInfo = new ApplicationInfo();
+ Bundle metaDataBundle = new Bundle();
+ metaDataBundle.putBoolean(
+ GameManagerService.GamePackageConfiguration.METADATA_WM_ALLOW_DOWNSCALE, true);
+ applicationInfo.metaData = metaDataBundle;
+ when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
+ .thenReturn(applicationInfo);
+ }
+
+ private void mockInterventionAllowDownscaleFalse() throws Exception {
+ final ApplicationInfo applicationInfo = new ApplicationInfo();
+ Bundle metaDataBundle = new Bundle();
+ metaDataBundle.putBoolean(
+ GameManagerService.GamePackageConfiguration.METADATA_WM_ALLOW_DOWNSCALE, false);
+ applicationInfo.metaData = metaDataBundle;
+ when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
+ .thenReturn(applicationInfo);
}
/**
@@ -353,136 +398,209 @@ public class GameManagerServiceTests {
gameManagerService.getGameMode(mPackageName, USER_ID_2));
}
+ private void checkReportedModes(int ...requiredModes) {
+ GameManagerService gameManagerService = new GameManagerService(mMockContext);
+ gameManagerService.onUserStarting(USER_ID_1);
+ gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName);
+ ArraySet<Integer> reportedModes = new ArraySet<>();
+ int[] modes = gameManagerService.getAvailableGameModes(mPackageName);
+ for (int mode : modes) {
+ reportedModes.add(mode);
+ }
+ assertEquals(requiredModes.length, reportedModes.size());
+ for (int requiredMode : reportedModes) {
+ assertTrue("Required game mode not supported: " + requiredMode,
+ reportedModes.contains(requiredMode));
+ }
+ }
+
+ private void checkDownscaling(int gameMode, String scaling) {
+ GameManagerService gameManagerService = new GameManagerService(mMockContext);
+ gameManagerService.onUserStarting(USER_ID_1);
+ gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName);
+ GameManagerService.GamePackageConfiguration config =
+ gameManagerService.getConfig(mPackageName);
+ assertEquals(config.getGameModeConfiguration(gameMode).getScaling(), scaling);
+ }
+
/**
- * Phonesky device config exists, but is only propagating the default value.
+ * Phenotype device config exists, but is only propagating the default value.
*/
@Test
public void testDeviceConfigDefault() {
mockDeviceConfigDefault();
mockModifyGameModeGranted();
- GameManagerService gameManagerService = new GameManagerService(mMockContext);
- gameManagerService.onUserStarting(USER_ID_1);
- gameManagerService.loadDeviceConfigLocked();
-
- int[] modes = gameManagerService.getAvailableGameModes(mPackageName);
- assertEquals(modes.length, 1);
- assertEquals(modes[0], GameManager.GAME_MODE_UNSUPPORTED);
+ checkReportedModes(GameManager.GAME_MODE_UNSUPPORTED);
}
/**
- * Phonesky device config does not exists.
+ * Phenotype device config does not exists.
*/
@Test
public void testDeviceConfigNone() {
mockDeviceConfigNone();
mockModifyGameModeGranted();
- GameManagerService gameManagerService = new GameManagerService(mMockContext);
- gameManagerService.onUserStarting(USER_ID_1);
- gameManagerService.loadDeviceConfigLocked();
-
- int[] modes = gameManagerService.getAvailableGameModes(mPackageName);
- assertEquals(modes.length, 1);
- assertEquals(modes[0], GameManager.GAME_MODE_UNSUPPORTED);
+ checkReportedModes(GameManager.GAME_MODE_UNSUPPORTED);
}
/**
- * Phonesky device config for performance mode exists and is valid.
+ * Phenotype device config for performance mode exists and is valid.
*/
@Test
public void testDeviceConfigPerformance() {
mockDeviceConfigPerformance();
mockModifyGameModeGranted();
- GameManagerService gameManagerService = new GameManagerService(mMockContext);
- gameManagerService.onUserStarting(USER_ID_1);
- gameManagerService.loadDeviceConfigLocked();
-
- boolean perfModeExists = false;
- int[] modes = gameManagerService.getAvailableGameModes(mPackageName);
- for (int mode : modes) {
- if (mode == GameManager.GAME_MODE_PERFORMANCE) {
- perfModeExists = true;
- }
- }
- assertEquals(modes.length, 1);
- assertTrue(perfModeExists);
+ checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_STANDARD);
}
/**
- * Phonesky device config for battery mode exists and is valid.
+ * Phenotype device config for battery mode exists and is valid.
*/
@Test
public void testDeviceConfigBattery() {
mockDeviceConfigBattery();
mockModifyGameModeGranted();
- GameManagerService gameManagerService = new GameManagerService(mMockContext);
- gameManagerService.onUserStarting(USER_ID_1);
- gameManagerService.loadDeviceConfigLocked();
-
- boolean batteryModeExists = false;
- int[] modes = gameManagerService.getAvailableGameModes(mPackageName);
- for (int mode : modes) {
- if (mode == GameManager.GAME_MODE_BATTERY) {
- batteryModeExists = true;
- }
- }
- assertEquals(modes.length, 1);
- assertTrue(batteryModeExists);
+ checkReportedModes(GameManager.GAME_MODE_BATTERY, GameManager.GAME_MODE_STANDARD);
}
/**
- * Phonesky device configs for both battery and performance modes exists and are valid.
+ * Phenotype device configs for both battery and performance modes exists and are valid.
*/
@Test
public void testDeviceConfigAll() {
mockDeviceConfigAll();
mockModifyGameModeGranted();
- GameManagerService gameManagerService = new GameManagerService(mMockContext);
- gameManagerService.onUserStarting(USER_ID_1);
- gameManagerService.loadDeviceConfigLocked();
-
- boolean batteryModeExists = false;
- boolean perfModeExists = false;
- int[] modes = gameManagerService.getAvailableGameModes(mPackageName);
- for (int mode : modes) {
- if (mode == GameManager.GAME_MODE_BATTERY) {
- batteryModeExists = true;
- } else if (mode == GameManager.GAME_MODE_PERFORMANCE) {
- perfModeExists = true;
- }
- }
- assertTrue(batteryModeExists);
- assertTrue(perfModeExists);
+ checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_BATTERY,
+ GameManager.GAME_MODE_STANDARD);
}
/**
- * Phonesky device config contains values that parse correctly but are not valid in game mode.
+ * Phenotype device config contains values that parse correctly but are not valid in game mode.
*/
@Test
public void testDeviceConfigInvalid() {
mockDeviceConfigInvalid();
mockModifyGameModeGranted();
- GameManagerService gameManagerService = new GameManagerService(mMockContext);
- gameManagerService.onUserStarting(USER_ID_1);
- gameManagerService.loadDeviceConfigLocked();
-
- int[] modes = gameManagerService.getAvailableGameModes(mPackageName);
- assertEquals(modes.length, 1);
- assertEquals(modes[0], GameManager.GAME_MODE_UNSUPPORTED);
+ checkReportedModes(GameManager.GAME_MODE_UNSUPPORTED);
}
/**
- * Phonesky device config is garbage.
+ * Phenotype device config is garbage.
*/
@Test
public void testDeviceConfigMalformed() {
mockDeviceConfigMalformed();
mockModifyGameModeGranted();
+ checkReportedModes(GameManager.GAME_MODE_UNSUPPORTED);
+ }
+
+ /**
+ * Game modes are made available only through app manifest opt-in.
+ */
+ @Test
+ public void testGameModeOptInAll() throws Exception {
+ mockGameModeOptInAll();
+ mockDeviceConfigNone();
+ mockModifyGameModeGranted();
+ checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_BATTERY,
+ GameManager.GAME_MODE_STANDARD);
+ }
+
+ /**
+ * BATTERY game mode is available through the app manifest opt-in.
+ */
+ @Test
+ public void testGameModeOptInBattery() throws Exception {
+ mockGameModeOptInBattery();
+ mockDeviceConfigNone();
+ mockModifyGameModeGranted();
+ checkReportedModes(GameManager.GAME_MODE_BATTERY, GameManager.GAME_MODE_STANDARD);
+ }
+
+ /**
+ * PERFORMANCE game mode is available through the app manifest opt-in.
+ */
+ @Test
+ public void testGameModeOptInPerformance() throws Exception {
+ mockGameModeOptInPerformance();
+ mockDeviceConfigNone();
+ mockModifyGameModeGranted();
+ checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_STANDARD);
+ }
+
+ /**
+ * BATTERY game mode is available through the app manifest opt-in and PERFORMANCE game mode is
+ * available through Phenotype.
+ */
+ @Test
+ public void testGameModeOptInBatteryMixed() throws Exception {
+ mockGameModeOptInBattery();
+ mockDeviceConfigPerformance();
+ mockModifyGameModeGranted();
+ checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_BATTERY,
+ GameManager.GAME_MODE_STANDARD);
+ }
+
+ /**
+ * PERFORMANCE game mode is available through the app manifest opt-in and BATTERY game mode is
+ * available through Phenotype.
+ */
+ @Test
+ public void testGameModeOptInPerformanceMixed() throws Exception {
+ mockGameModeOptInPerformance();
+ mockDeviceConfigBattery();
+ mockModifyGameModeGranted();
+ checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_BATTERY,
+ GameManager.GAME_MODE_STANDARD);
+ }
+
+ /**
+ * PERFORMANCE game mode is configured through Phenotype. The app hasn't specified any metadata.
+ */
+ @Test
+ public void testInterventionAllowScalingDefault() throws Exception {
+ mockDeviceConfigPerformance();
+ mockModifyGameModeGranted();
+ checkDownscaling(GameManager.GAME_MODE_PERFORMANCE, "0.5");
+ }
+
+ /**
+ * PERFORMANCE game mode is configured through Phenotype. The app has opted-out of scaling.
+ */
+ @Test
+ public void testInterventionAllowDownscaleFalse() throws Exception {
+ mockDeviceConfigPerformance();
+ mockInterventionAllowDownscaleFalse();
+ mockModifyGameModeGranted();
+ checkDownscaling(GameManager.GAME_MODE_PERFORMANCE, "1.0");
+ }
+
+ /**
+ * PERFORMANCE game mode is configured through Phenotype. The app has redundantly specified
+ * the downscaling metadata default value of "true".
+ */
+ @Test
+ public void testInterventionAllowDownscaleTrue() throws Exception {
+ mockDeviceConfigPerformance();
+ mockInterventionAllowDownscaleTrue();
+ mockModifyGameModeGranted();
+ checkDownscaling(GameManager.GAME_MODE_PERFORMANCE, "0.5");
+ }
+
+ /**
+ * PERFORMANCE game mode is configured through Phenotype, but the app has also opted into the
+ * same mode. No interventions for this game mode should be available in this case.
+ */
+ @Test
+ public void testDeviceConfigOptInOverlap() throws Exception {
+ mockDeviceConfigPerformance();
+ mockGameModeOptInPerformance();
+ mockModifyGameModeGranted();
GameManagerService gameManagerService = new GameManagerService(mMockContext);
gameManagerService.onUserStarting(USER_ID_1);
- gameManagerService.loadDeviceConfigLocked();
-
- int[] modes = gameManagerService.getAvailableGameModes(mPackageName);
- assertEquals(modes.length, 1);
- assertEquals(modes[0], GameManager.GAME_MODE_UNSUPPORTED);
+ gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName);
+ GameManagerService.GamePackageConfiguration config =
+ gameManagerService.getConfig(mPackageName);
+ assertNull(config.getGameModeConfiguration(GameManager.GAME_MODE_PERFORMANCE));
}
}
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java
index af954d599334..3fdac66225a8 100644
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java
@@ -25,13 +25,14 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
+import java.util.function.Function;
@RunWith(AndroidJUnit4.class)
public class OrdinalGeneratorTest {
@Test
- public void testOrdinal() {
- OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>();
+ public void testOrdinal_withIdentityFunction() {
+ OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(Function.identity());
int oneOrd = ordinalGenerator.ordinal("One");
int twoOrd = ordinalGenerator.ordinal("Two");
assertNotEquals(oneOrd, twoOrd);
@@ -45,8 +46,8 @@ public class OrdinalGeneratorTest {
}
@Test
- public void testOrdinals() {
- OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>();
+ public void testOrdinals_withIdentityFunction() {
+ OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(Function.identity());
int[] oneTwoOrds = ordinalGenerator.ordinals(Arrays.asList("One", "Two"));
int[] twoThreeOrds = ordinalGenerator.ordinals(Arrays.asList("Two", "Three"));
assertEquals(oneTwoOrds[0], ordinalGenerator.ordinal("One"));
@@ -54,4 +55,33 @@ public class OrdinalGeneratorTest {
assertEquals(twoThreeOrds[0], ordinalGenerator.ordinal("Two"));
assertEquals(twoThreeOrds[1], ordinalGenerator.ordinal("Three"));
}
+
+ @Test
+ public void testOrdinal_withCanonicalizationFunction() {
+ OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(String::toLowerCase);
+
+ int oneOrd = ordinalGenerator.ordinal("One");
+ int twoOrd = ordinalGenerator.ordinal("Two");
+ assertNotEquals(oneOrd, twoOrd);
+
+ assertEquals(oneOrd, ordinalGenerator.ordinal("ONE"));
+ assertEquals(twoOrd, ordinalGenerator.ordinal("two"));
+
+ int threeOrd = ordinalGenerator.ordinal("Three");
+ assertNotEquals(oneOrd, threeOrd);
+ assertNotEquals(twoOrd, threeOrd);
+ }
+
+ @Test
+ public void testOrdinals_withCanonicalizationFunction() {
+ OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(String::toLowerCase);
+
+ int[] oneTwoOrds = ordinalGenerator.ordinals(Arrays.asList("One", "Two"));
+ int[] twoThreeOrds = ordinalGenerator.ordinals(Arrays.asList("Two", "Three"));
+
+ assertEquals(oneTwoOrds[0], ordinalGenerator.ordinal("ONE"));
+ assertEquals(oneTwoOrds[1], ordinalGenerator.ordinal("two"));
+ assertEquals(twoThreeOrds[0], ordinalGenerator.ordinal("TWO"));
+ assertEquals(twoThreeOrds[1], ordinalGenerator.ordinal("threE"));
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneCanonicalizerTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneCanonicalizerTest.java
new file mode 100644
index 000000000000..0c78f5b85fac
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneCanonicalizerTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2021 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.timezonedetector;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class TimeZoneCanonicalizerTest {
+
+ TimeZoneCanonicalizer mFunction = new TimeZoneCanonicalizer();
+
+ @Test
+ public void deprecatedTimeZonesAreEqualToCanonical() {
+ assertThat(mFunction.apply("America/Godthab")).isEqualTo("America/Nuuk");
+ assertThat(mFunction.apply("Australia/Currie")).isEqualTo("Australia/Hobart");
+ }
+
+ @Test
+ public void wellKnownCanonicalIDs() {
+ assertThat(mFunction.apply("America/Detroit")).isEqualTo("America/Detroit");
+ assertThat(mFunction.apply("Europe/London")).isEqualTo("Europe/London");
+ assertThat(mFunction.apply("America/New_York")).isEqualTo("America/New_York");
+ assertThat(mFunction.apply("Europe/Volgograd")).isEqualTo("Europe/Volgograd");
+ }
+
+ @Test
+ public void timeZonesAsGmtOffsetsTreatedAsCanonical() {
+ assertThat(mFunction.apply("Etc/GMT-11")).isEqualTo("Etc/GMT-11");
+ }
+
+ @Test
+ public void nonExistingOneMappedToThemselves() {
+ assertThat(mFunction.apply("Mars/Base")).isEqualTo("Mars/Base");
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
index 47475a66c0d5..331f76cf7dc2 100644
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
@@ -56,6 +56,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Function;
/**
* White-box unit tests for {@link TimeZoneDetectorStrategyImpl}.
@@ -1008,7 +1009,7 @@ public class TimeZoneDetectorStrategyImplTest {
// Check the various feature state values are what we expect.
assertFeatureStateMatchesConfig(expectedInternalConfig, actualState, expectedDetectionMode);
- OrdinalGenerator<String> tzIdOrdinalGenerator = new OrdinalGenerator<>();
+ OrdinalGenerator<String> tzIdOrdinalGenerator = new OrdinalGenerator<>(Function.identity());
MetricsTimeZoneDetectorState expectedState =
MetricsTimeZoneDetectorState.create(
tzIdOrdinalGenerator, expectedInternalConfig, expectedDeviceTimeZoneId,
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 537bc2c7d52c..c33287c57377 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -141,6 +141,7 @@ import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.Looper;
import android.os.Parcel;
import android.os.Process;
import android.os.RemoteException;
@@ -267,6 +268,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
RankingHandler mRankingHandler;
@Mock
ActivityManagerInternal mAmi;
+ @Mock
+ private Looper mMainLooper;
@Mock
IIntentSender pi1;
@@ -514,7 +517,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mAppUsageStats, mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal,
mAppOpsManager, mUm, mHistoryManager, mStatsManager, mock(TelephonyManager.class),
mAmi, mToastRateLimiter);
- mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
+ // Return first true for RoleObserver main-thread check
+ when(mMainLooper.isCurrentThread()).thenReturn(true).thenReturn(false);
+ mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY, mMainLooper);
mService.setAudioManager(mAudioManager);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
index 4ce237e3aadc..27ae46c87b28 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
@@ -16,6 +16,7 @@
package com.android.server.notification;
+import static android.app.role.RoleManager.ROLE_BROWSER;
import static android.app.role.RoleManager.ROLE_DIALER;
import static android.app.role.RoleManager.ROLE_EMERGENCY;
import static android.content.pm.PackageManager.MATCH_ALL;
@@ -23,6 +24,7 @@ import static android.content.pm.PackageManager.MATCH_ALL;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
@@ -31,6 +33,8 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import static java.util.Arrays.asList;
+
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
@@ -44,7 +48,6 @@ import android.companion.ICompanionDeviceManager;
import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
import android.os.Looper;
import android.os.UserHandle;
import android.os.UserManager;
@@ -80,7 +83,6 @@ import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.Executor;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -98,13 +100,13 @@ public class RoleObserverTest extends UiServiceTestCase {
@Mock
private UserManager mUm;
@Mock
- private Executor mExecutor;
- @Mock
private RoleManager mRoleManager;
+ @Mock
+ private Looper mMainLooper;
NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake();
private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake(
1 << 30);
- private List<UserInfo> mUsers;
+ private List<UserHandle> mUsers;
private static class TestableNotificationManagerService extends NotificationManagerService {
TestableNotificationManagerService(Context context,
@@ -133,13 +135,15 @@ public class RoleObserverTest extends UiServiceTestCase {
mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
mUsers = new ArrayList<>();
- mUsers.add(new UserInfo(0, "system", 0));
- mUsers.add(new UserInfo(10, "second", 0));
- when(mUm.getUsers()).thenReturn(mUsers);
+ mUsers.add(new UserHandle(0));
+ mUsers.add(new UserHandle(10));
+ when(mUm.getUserHandles(anyBoolean())).thenReturn(mUsers);
+
+ when(mMainLooper.isCurrentThread()).thenReturn(true);
mService = new TestableNotificationManagerService(mContext, mNotificationRecordLogger,
mNotificationInstanceIdSequence);
- mRoleObserver = mService.new RoleObserver(mRoleManager, mPm, mExecutor);
+ mRoleObserver = mService.new RoleObserver(mContext, mRoleManager, mPm, mMainLooper);
try {
mService.init(mService.new WorkerHandler(mock(Looper.class)),
@@ -174,7 +178,7 @@ public class RoleObserverTest extends UiServiceTestCase {
}
@Test
- public void testInit() throws Exception {
+ public void testInit_forNonBlockableDefaultApps() throws Exception {
List<String> dialer0 = new ArrayList<>();
dialer0.add("dialer");
List<String> emer0 = new ArrayList<>();
@@ -191,29 +195,29 @@ public class RoleObserverTest extends UiServiceTestCase {
when(mRoleManager.getRoleHoldersAsUser(
ROLE_DIALER,
- mUsers.get(0).getUserHandle())).
- thenReturn(dialer0);
+ mUsers.get(0)))
+ .thenReturn(dialer0);
when(mRoleManager.getRoleHoldersAsUser(
ROLE_EMERGENCY,
- mUsers.get(0).getUserHandle())).
- thenReturn(emer0);
+ mUsers.get(0)))
+ .thenReturn(emer0);
mRoleObserver.init();
// verify internal records of current state of the world
assertTrue(mRoleObserver.isApprovedPackageForRoleForUser(
- ROLE_DIALER, dialer0.get(0), mUsers.get(0).id));
+ ROLE_DIALER, dialer0.get(0), mUsers.get(0).getIdentifier()));
assertFalse(mRoleObserver.isApprovedPackageForRoleForUser(
- ROLE_DIALER, dialer0.get(0), mUsers.get(1).id));
+ ROLE_DIALER, dialer0.get(0), mUsers.get(1).getIdentifier()));
assertTrue(mRoleObserver.isApprovedPackageForRoleForUser(
- ROLE_EMERGENCY, emer0.get(0), mUsers.get(0).id));
+ ROLE_EMERGENCY, emer0.get(0), mUsers.get(0).getIdentifier()));
assertFalse(mRoleObserver.isApprovedPackageForRoleForUser(
- ROLE_EMERGENCY, emer0.get(0), mUsers.get(1).id));
+ ROLE_EMERGENCY, emer0.get(0), mUsers.get(1).getIdentifier()));
// make sure we're listening to updates
verify(mRoleManager, times(1)).addOnRoleHoldersChangedListenerAsUser(
- eq(mExecutor), any(), eq(UserHandle.ALL));
+ any(), any(), eq(UserHandle.ALL));
// make sure we told pref helper about the state of the world
verify(mPreferencesHelper, times(1)).updateDefaultApps(0, null, dialer0Pair);
@@ -221,14 +225,31 @@ public class RoleObserverTest extends UiServiceTestCase {
}
@Test
- public void testSwapDefault() throws Exception {
+ public void testInit_forTrampolines() throws Exception {
+ when(mPm.getPackageUid("com.browser", MATCH_ALL, 0)).thenReturn(30);
+ when(mRoleManager.getRoleHoldersAsUser(
+ ROLE_BROWSER,
+ mUsers.get(0)))
+ .thenReturn(asList("com.browser"));
+
+ mRoleObserver.init();
+
+ assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(30));
+
+ // make sure we're listening to updates
+ verify(mRoleManager, times(1)).addOnRoleHoldersChangedListenerAsUser(any(), any(),
+ eq(UserHandle.ALL));
+ }
+
+ @Test
+ public void testSwapDefault_forNonBlockableDefaultApps() throws Exception {
List<String> dialer0 = new ArrayList<>();
dialer0.add("dialer");
when(mRoleManager.getRoleHoldersAsUser(
ROLE_DIALER,
- mUsers.get(0).getUserHandle())).
- thenReturn(dialer0);
+ mUsers.get(0)))
+ .thenReturn(dialer0);
mRoleObserver.init();
@@ -241,8 +262,8 @@ public class RoleObserverTest extends UiServiceTestCase {
when(mRoleManager.getRoleHoldersAsUser(
ROLE_DIALER,
- mUsers.get(0).getUserHandle())).
- thenReturn(newDefault);
+ mUsers.get(0)))
+ .thenReturn(newDefault);
mRoleObserver.onRoleHoldersChanged(ROLE_DIALER, UserHandle.of(0));
@@ -251,15 +272,39 @@ public class RoleObserverTest extends UiServiceTestCase {
}
@Test
- public void testSwapDefault_multipleOverlappingApps() throws Exception {
+ public void testSwapDefault_forTrampolines() throws Exception {
+ List<String> dialer0 = new ArrayList<>();
+ when(mPm.getPackageUid("com.browser", MATCH_ALL, 0)).thenReturn(30);
+ when(mPm.getPackageUid("com.browser2", MATCH_ALL, 0)).thenReturn(31);
+ when(mRoleManager.getRoleHoldersAsUser(
+ ROLE_BROWSER,
+ mUsers.get(0)))
+ .thenReturn(asList("com.browser"));
+ mRoleObserver.init();
+ assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(30));
+ assertFalse(mRoleObserver.isUidExemptFromTrampolineRestrictions(31));
+ // Default changed
+ when(mRoleManager.getRoleHoldersAsUser(
+ ROLE_BROWSER,
+ mUsers.get(0)))
+ .thenReturn(asList("com.browser2"));
+ mRoleObserver.onRoleHoldersChanged(ROLE_BROWSER, UserHandle.of(0));
+
+ assertFalse(mRoleObserver.isUidExemptFromTrampolineRestrictions(30));
+ assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(31));
+ }
+
+ @Test
+ public void testSwapDefault_multipleOverlappingApps_forNonBlockableDefaultApps()
+ throws Exception {
List<String> dialer0 = new ArrayList<>();
dialer0.add("dialer");
dialer0.add("phone");
when(mRoleManager.getRoleHoldersAsUser(
ROLE_DIALER,
- mUsers.get(0).getUserHandle())).
- thenReturn(dialer0);
+ mUsers.get(0)))
+ .thenReturn(dialer0);
mRoleObserver.init();
@@ -273,8 +318,8 @@ public class RoleObserverTest extends UiServiceTestCase {
when(mRoleManager.getRoleHoldersAsUser(
ROLE_DIALER,
- mUsers.get(0).getUserHandle())).
- thenReturn(newDefault);
+ mUsers.get(0)))
+ .thenReturn(newDefault);
ArraySet<String> expectedRemove = new ArraySet<>();
expectedRemove.add("dialer");
@@ -294,14 +339,14 @@ public class RoleObserverTest extends UiServiceTestCase {
}
@Test
- public void testSwapDefault_newUser() throws Exception {
+ public void testSwapDefault_newUser_forNonBlockableDefaultApps() throws Exception {
List<String> dialer0 = new ArrayList<>();
dialer0.add("dialer");
when(mRoleManager.getRoleHoldersAsUser(
ROLE_DIALER,
- mUsers.get(0).getUserHandle())).
- thenReturn(dialer0);
+ mUsers.get(0)))
+ .thenReturn(dialer0);
mRoleObserver.init();
@@ -310,8 +355,8 @@ public class RoleObserverTest extends UiServiceTestCase {
when(mRoleManager.getRoleHoldersAsUser(
ROLE_DIALER,
- mUsers.get(1).getUserHandle())).
- thenReturn(dialer10);
+ mUsers.get(1)))
+ .thenReturn(dialer10);
ArraySet<Pair<String, Integer>> expectedAddPair = new ArraySet<>();
expectedAddPair.add(new Pair("phone", 30));
@@ -329,4 +374,27 @@ public class RoleObserverTest extends UiServiceTestCase {
assertTrue(mRoleObserver.isApprovedPackageForRoleForUser(ROLE_DIALER, "phone", 10));
assertTrue(mRoleObserver.isApprovedPackageForRoleForUser(ROLE_DIALER, "dialer", 0));
}
+
+ @Test
+ public void testSwapDefault_newUser_forTrampolines() throws Exception {
+ List<String> dialer0 = new ArrayList<>();
+ when(mPm.getPackageUid("com.browser", MATCH_ALL, 0)).thenReturn(30);
+ when(mPm.getPackageUid("com.browser2", MATCH_ALL, 10)).thenReturn(1031);
+ when(mRoleManager.getRoleHoldersAsUser(
+ ROLE_BROWSER,
+ mUsers.get(0)))
+ .thenReturn(asList("com.browser"));
+ mRoleObserver.init();
+ assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(30));
+ assertFalse(mRoleObserver.isUidExemptFromTrampolineRestrictions(1031));
+ // New user
+ when(mRoleManager.getRoleHoldersAsUser(
+ ROLE_BROWSER,
+ mUsers.get(1)))
+ .thenReturn(asList("com.browser2"));
+ mRoleObserver.onRoleHoldersChanged(ROLE_BROWSER, UserHandle.of(10));
+
+ assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(30));
+ assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(1031));
+ }
}
diff --git a/test-mock/Android.bp b/test-mock/Android.bp
index a2447d71c3bd..b83bce654a85 100644
--- a/test-mock/Android.bp
+++ b/test-mock/Android.bp
@@ -38,6 +38,7 @@ java_sdk_library {
],
libs: [
"framework",
+ "framework-annotations-lib",
"app-compat-annotations",
"unsupportedappusage",
],
diff --git a/tests/UpdatableSystemFontTest/Android.bp b/tests/UpdatableSystemFontTest/Android.bp
index 8b0ae5c37bae..ea5a43104bba 100644
--- a/tests/UpdatableSystemFontTest/Android.bp
+++ b/tests/UpdatableSystemFontTest/Android.bp
@@ -21,16 +21,15 @@ package {
default_applicable_licenses: ["frameworks_base_license"],
}
-java_test_host {
+android_test {
name: "UpdatableSystemFontTest",
srcs: ["src/**/*.java"],
- libs: [
- "tradefed",
- "compatibility-tradefed",
- "compatibility-host-util",
- ],
+ libs: ["android.test.runner"],
static_libs: [
- "frameworks-base-hostutils",
+ "androidx.test.ext.junit",
+ "compatibility-device-util-axt",
+ "platform-test-annotations",
+ "truth-prebuilt",
],
test_suites: [
"general-tests",
@@ -47,4 +46,5 @@ java_test_host {
":UpdatableSystemFontTestNotoColorEmojiVPlus2Ttf",
":UpdatableSystemFontTestNotoColorEmojiVPlus2TtfFsvSig",
],
+ sdk_version: "test_current",
}
diff --git a/tests/UpdatableSystemFontTest/AndroidManifest.xml b/tests/UpdatableSystemFontTest/AndroidManifest.xml
new file mode 100644
index 000000000000..531ee981a92c
--- /dev/null
+++ b/tests/UpdatableSystemFontTest/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.updatablesystemfont">
+
+ <application android:label="UpdatableSystemFontTest">
+ <uses-library android:name="android.test.runner"/>
+ </application>
+
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:label="UpdatableSystemFontTest"
+ android:targetPackage="com.android.updatablesystemfont">
+ </instrumentation>
+
+</manifest>
diff --git a/tests/UpdatableSystemFontTest/AndroidTest.xml b/tests/UpdatableSystemFontTest/AndroidTest.xml
index 4f116698ba72..4f6487e7e953 100644
--- a/tests/UpdatableSystemFontTest/AndroidTest.xml
+++ b/tests/UpdatableSystemFontTest/AndroidTest.xml
@@ -21,6 +21,7 @@
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="UpdatableSystemFontTest.apk" />
<option name="test-file-name" value="EmojiRenderingTestApp.apk" />
</target_preparer>
@@ -37,7 +38,7 @@
<option name="push" value="UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf.fsv_sig->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf.fsv_sig" />
</target_preparer>
- <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
- <option name="jar" value="UpdatableSystemFontTest.jar" />
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+ <option name="package" value="com.android.updatablesystemfont" />
</test>
</configuration>
diff --git a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
index 74f6bca4d7a0..9793c3447ff2 100644
--- a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
+++ b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
@@ -16,44 +16,59 @@
package com.android.updatablesystemfont;
+import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
+
import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.junit.Assume.assumeTrue;
import static java.util.concurrent.TimeUnit.SECONDS;
+import android.app.UiAutomation;
+import android.content.Context;
+import android.graphics.fonts.FontFamilyUpdateRequest;
+import android.graphics.fonts.FontFileUpdateRequest;
+import android.graphics.fonts.FontManager;
+import android.os.ParcelFileDescriptor;
import android.platform.test.annotations.RootPermissionTest;
+import android.security.FileIntegrityManager;
+import android.text.FontConfig;
+import android.util.Log;
+import android.util.Pair;
-import com.android.fsverity.AddFsVerityCertRule;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
-import com.android.tradefed.util.CommandResult;
-import com.android.tradefed.util.CommandStatus;
+import androidx.annotation.Nullable;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.StreamUtil;
+import com.android.compatibility.common.util.SystemUtil;
import org.junit.After;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
/**
- * Tests if fonts can be updated by 'cmd font'.
+ * Tests if fonts can be updated by {@link FontManager} API.
*/
@RootPermissionTest
-@RunWith(DeviceJUnit4ClassRunner.class)
-public class UpdatableSystemFontTest extends BaseHostJUnit4Test {
+@RunWith(AndroidJUnit4.class)
+public class UpdatableSystemFontTest {
+ private static final String TAG = "UpdatableSystemFontTest";
private static final String SYSTEM_FONTS_DIR = "/system/fonts/";
private static final String DATA_FONTS_DIR = "/data/fonts/files/";
-
private static final String CERT_PATH = "/data/local/tmp/UpdatableSystemFontTestCert.der";
-
- private static final Pattern PATTERN_FONT = Pattern.compile("path = ([^, \n]*)");
- private static final String NOTO_COLOR_EMOJI_TTF = "NotoColorEmoji.ttf";
+ private static final String NOTO_COLOR_EMOJI_POSTSCRIPT_NAME = "NotoColorEmoji";
private static final String ORIGINAL_NOTO_COLOR_EMOJI_TTF =
"/data/local/tmp/NotoColorEmoji.ttf";
@@ -80,64 +95,75 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test {
EMOJI_RENDERING_TEST_APP_ID + "/.EmojiRenderingTestActivity";
private static final long ACTIVITY_TIMEOUT_MILLIS = SECONDS.toMillis(10);
- private interface ThrowingSupplier<T> {
- T get() throws Exception;
- }
-
- @Rule
- public final AddFsVerityCertRule mAddFsverityCertRule =
- new AddFsVerityCertRule(this, CERT_PATH);
+ private String mKeyId;
+ private FontManager mFontManager;
@Before
public void setUp() throws Exception {
- expectRemoteCommandToSucceed("cmd font clear");
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ // Run tests only if updatable system font is enabled.
+ FileIntegrityManager fim = context.getSystemService(FileIntegrityManager.class);
+ assumeTrue(fim != null);
+ assumeTrue(fim.isApkVeritySupported());
+ mKeyId = insertCert(CERT_PATH);
+ mFontManager = context.getSystemService(FontManager.class);
+ expectCommandToSucceed("cmd font clear");
}
@After
public void tearDown() throws Exception {
- expectRemoteCommandToSucceed("cmd font clear");
+ expectCommandToSucceed("cmd font clear");
+ if (mKeyId != null) {
+ expectCommandToSucceed("mini-keyctl unlink " + mKeyId + " .fs-verity");
+ }
}
@Test
public void updateFont() throws Exception {
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
- String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_SUCCESS);
+ String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
assertThat(fontPath).startsWith(DATA_FONTS_DIR);
// The updated font should be readable and unmodifiable.
- expectRemoteCommandToSucceed("cat " + fontPath + " > /dev/null");
- expectRemoteCommandToFail("echo -n '' >> " + fontPath);
+ expectCommandToSucceed("dd status=none if=" + fontPath + " of=/dev/null");
+ expectCommandToFail("dd status=none if=" + CERT_PATH + " of=" + fontPath);
}
@Test
public void updateFont_twice() throws Exception {
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
- String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG));
- String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_SUCCESS);
+ String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_SUCCESS);
+ String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
assertThat(fontPath2).startsWith(DATA_FONTS_DIR);
assertThat(fontPath2).isNotEqualTo(fontPath);
// The new file should be readable.
- expectRemoteCommandToSucceed("cat " + fontPath2 + " > /dev/null");
+ expectCommandToSucceed("dd status=none if=" + fontPath2 + " of=/dev/null");
// The old file should be still readable.
- expectRemoteCommandToSucceed("cat " + fontPath + " > /dev/null");
+ expectCommandToSucceed("dd status=none if=" + fontPath + " of=/dev/null");
}
@Test
public void updateFont_allowSameVersion() throws Exception {
// Update original font to the same version
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- ORIGINAL_NOTO_COLOR_EMOJI_TTF, ORIGINAL_NOTO_COLOR_EMOJI_TTF_FSV_SIG));
- String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
- String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ assertThat(updateFontFile(
+ ORIGINAL_NOTO_COLOR_EMOJI_TTF, ORIGINAL_NOTO_COLOR_EMOJI_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_SUCCESS);
+ String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_SUCCESS);
+ String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
// Update updated font to the same version
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
- String fontPath3 = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_SUCCESS);
+ String fontPath3 = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
assertThat(fontPath).startsWith(DATA_FONTS_DIR);
assertThat(fontPath2).isNotEqualTo(fontPath);
assertThat(fontPath2).startsWith(DATA_FONTS_DIR);
@@ -147,134 +173,171 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test {
@Test
public void updateFont_invalidCert() throws Exception {
- expectRemoteCommandToFail(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG));
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_ERROR_VERIFICATION_FAILURE);
}
@Test
public void updateFont_downgradeFromSystem() throws Exception {
- expectRemoteCommandToFail(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_V0_TTF, TEST_NOTO_COLOR_EMOJI_V0_TTF_FSV_SIG));
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_V0_TTF, TEST_NOTO_COLOR_EMOJI_V0_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_ERROR_DOWNGRADING);
}
@Test
public void updateFont_downgradeFromData() throws Exception {
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG));
- expectRemoteCommandToFail(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_SUCCESS);
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_ERROR_DOWNGRADING);
}
@Test
public void launchApp() throws Exception {
- String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
assertThat(fontPath).startsWith(SYSTEM_FONTS_DIR);
startActivity(EMOJI_RENDERING_TEST_APP_ID, EMOJI_RENDERING_TEST_ACTIVITY);
- waitUntil(ACTIVITY_TIMEOUT_MILLIS, () ->
- isFileOpenedBy(fontPath, EMOJI_RENDERING_TEST_APP_ID));
+ SystemUtil.eventually(
+ () -> assertThat(isFileOpenedBy(fontPath, EMOJI_RENDERING_TEST_APP_ID)).isTrue(),
+ ACTIVITY_TIMEOUT_MILLIS);
}
@Test
public void launchApp_afterUpdateFont() throws Exception {
- String originalFontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ String originalFontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
assertThat(originalFontPath).startsWith(SYSTEM_FONTS_DIR);
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
- TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
- String updatedFontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ assertThat(updateFontFile(
+ TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG))
+ .isEqualTo(FontManager.RESULT_SUCCESS);
+ String updatedFontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
assertThat(updatedFontPath).startsWith(DATA_FONTS_DIR);
startActivity(EMOJI_RENDERING_TEST_APP_ID, EMOJI_RENDERING_TEST_ACTIVITY);
// The original font should NOT be opened by the app.
- waitUntil(ACTIVITY_TIMEOUT_MILLIS, () ->
- isFileOpenedBy(updatedFontPath, EMOJI_RENDERING_TEST_APP_ID)
- && !isFileOpenedBy(originalFontPath, EMOJI_RENDERING_TEST_APP_ID));
+ SystemUtil.eventually(() -> {
+ assertThat(isFileOpenedBy(updatedFontPath, EMOJI_RENDERING_TEST_APP_ID)).isTrue();
+ assertThat(isFileOpenedBy(originalFontPath, EMOJI_RENDERING_TEST_APP_ID)).isFalse();
+ }, ACTIVITY_TIMEOUT_MILLIS);
}
@Test
public void reboot() throws Exception {
- expectRemoteCommandToSucceed(String.format("cmd font update %s %s",
+ expectCommandToSucceed(String.format("cmd font update %s %s",
TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
- String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
assertThat(fontPath).startsWith(DATA_FONTS_DIR);
// Emulate reboot by 'cmd font restart'.
- expectRemoteCommandToSucceed("cmd font restart");
- String fontPathAfterReboot = getFontPath(NOTO_COLOR_EMOJI_TTF);
+ expectCommandToSucceed("cmd font restart");
+ String fontPathAfterReboot = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME);
assertThat(fontPathAfterReboot).isEqualTo(fontPath);
}
- private String getFontPath(String fontFileName) throws Exception {
- // TODO: add a dedicated command for testing.
- String lines = expectRemoteCommandToSucceed("cmd font dump");
- for (String line : lines.split("\n")) {
- Matcher m = PATTERN_FONT.matcher(line);
- if (m.find() && m.group(1).endsWith(fontFileName)) {
- return m.group(1);
- }
+ private static String insertCert(String certPath) throws Exception {
+ Pair<String, String> result;
+ try (InputStream is = new FileInputStream(certPath)) {
+ result = runShellCommand("mini-keyctl padd asymmetric fsv_test .fs-verity", is);
+ }
+ // Assert that there are no errors.
+ assertThat(result.second).isEmpty();
+ String keyId = result.first.trim();
+ assertThat(keyId).matches("^\\d+$");
+ return keyId;
+ }
+
+ private int updateFontFile(String fontPath, String signaturePath) throws IOException {
+ byte[] signature = Files.readAllBytes(Paths.get(signaturePath));
+ try (ParcelFileDescriptor fd =
+ ParcelFileDescriptor.open(new File(fontPath), MODE_READ_ONLY)) {
+ return SystemUtil.runWithShellPermissionIdentity(() -> {
+ FontConfig fontConfig = mFontManager.getFontConfig();
+ return mFontManager.updateFontFamily(
+ new FontFamilyUpdateRequest.Builder()
+ .addFontFileUpdateRequest(new FontFileUpdateRequest(fd, signature))
+ .build(),
+ fontConfig.getConfigVersion());
+ });
}
- CLog.e("Font not found: " + fontFileName);
- return null;
}
- private void startActivity(String appId, String activityId) throws Exception {
- // Make sure that the app is installed and enabled.
- waitUntil(ACTIVITY_TIMEOUT_MILLIS, () -> {
- String packageInfo = expectRemoteCommandToSucceed(
- "pm list packages -e " + EMOJI_RENDERING_TEST_APP_ID);
- return !packageInfo.isEmpty();
+ private String getFontPath(String psName) {
+ return SystemUtil.runWithShellPermissionIdentity(() -> {
+ FontConfig fontConfig = mFontManager.getFontConfig();
+ for (FontConfig.FontFamily family : fontConfig.getFontFamilies()) {
+ for (FontConfig.Font font : family.getFontList()) {
+ if (psName.equals(font.getPostScriptName())) {
+ return font.getFile().getAbsolutePath();
+ }
+ }
+ }
+ throw new AssertionError("Font not found: " + psName);
});
- expectRemoteCommandToSucceed("am force-stop " + EMOJI_RENDERING_TEST_APP_ID);
- expectRemoteCommandToSucceed("am start-activity -n " + EMOJI_RENDERING_TEST_ACTIVITY);
}
- private String expectRemoteCommandToSucceed(String cmd) throws Exception {
- CommandResult result = getDevice().executeShellV2Command(cmd);
- assertWithMessage("`" + cmd + "` failed: " + result.getStderr())
- .that(result.getStatus())
- .isEqualTo(CommandStatus.SUCCESS);
- return result.getStdout();
+ private static void startActivity(String appId, String activityId) throws Exception {
+ expectCommandToSucceed("am force-stop " + appId);
+ expectCommandToSucceed("am start-activity -n " + activityId);
+ }
+
+ private static String expectCommandToSucceed(String cmd) throws IOException {
+ Pair<String, String> result = runShellCommand(cmd, null);
+ // UiAutomation.runShellCommand() does not return exit code.
+ // Assume that the command fails if stderr is not empty.
+ assertThat(result.second.trim()).isEmpty();
+ return result.first;
}
- private void expectRemoteCommandToFail(String cmd) throws Exception {
- CommandResult result = getDevice().executeShellV2Command(cmd);
- assertWithMessage("Unexpected success from `" + cmd + "`: " + result.getStderr())
- .that(result.getStatus())
- .isNotEqualTo(CommandStatus.SUCCESS);
+ private static void expectCommandToFail(String cmd) throws IOException {
+ Pair<String, String> result = runShellCommand(cmd, null);
+ // UiAutomation.runShellCommand() does not return exit code.
+ // Assume that the command fails if stderr is not empty.
+ assertThat(result.second.trim()).isNotEmpty();
}
- private void waitUntil(long timeoutMillis, ThrowingSupplier<Boolean> func) {
- long untilMillis = System.currentTimeMillis() + timeoutMillis;
- do {
- try {
- if (func.get()) return;
- Thread.sleep(100);
- } catch (InterruptedException e) {
- throw new AssertionError("Interrupted", e);
- } catch (Exception e) {
- throw new AssertionError("Unexpected exception", e);
+ /** Runs a command and returns (stdout, stderr). */
+ private static Pair<String, String> runShellCommand(String cmd, @Nullable InputStream input)
+ throws IOException {
+ Log.i(TAG, "runShellCommand: " + cmd);
+ UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ ParcelFileDescriptor[] rwe = automation.executeShellCommandRwe(cmd);
+ // executeShellCommandRwe returns [stdout, stdin, stderr].
+ try (ParcelFileDescriptor outFd = rwe[0];
+ ParcelFileDescriptor inFd = rwe[1];
+ ParcelFileDescriptor errFd = rwe[2]) {
+ if (input != null) {
+ try (OutputStream os = new FileOutputStream(inFd.getFileDescriptor())) {
+ StreamUtil.copyStreams(input, os);
+ }
}
- } while (System.currentTimeMillis() < untilMillis);
- throw new AssertionError("Timed out");
+ // We have to close stdin before reading stdout and stderr.
+ // It's safe to close ParcelFileDescriptor multiple times.
+ inFd.close();
+ String stdout;
+ try (InputStream is = new FileInputStream(outFd.getFileDescriptor())) {
+ stdout = StreamUtil.readInputStream(is);
+ }
+ Log.i(TAG, "stdout = " + stdout);
+ String stderr;
+ try (InputStream is = new FileInputStream(errFd.getFileDescriptor())) {
+ stderr = StreamUtil.readInputStream(is);
+ }
+ Log.i(TAG, "stderr = " + stderr);
+ return new Pair<>(stdout, stderr);
+ }
}
- private boolean isFileOpenedBy(String path, String appId) throws DeviceNotAvailableException {
+ private static boolean isFileOpenedBy(String path, String appId) throws Exception {
String pid = pidOf(appId);
if (pid.isEmpty()) {
return false;
}
- CommandResult result = getDevice().executeShellV2Command(
- String.format("lsof -t -p %s '%s'", pid, path));
- if (result.getStatus() != CommandStatus.SUCCESS) {
- return false;
- }
- // The file is open if the output of lsof is non-empty.
- return !result.getStdout().trim().isEmpty();
+ String cmd = String.format("lsof -t -p %s %s", pid, path);
+ return !expectCommandToSucceed(cmd).trim().isEmpty();
}
- private String pidOf(String appId) throws DeviceNotAvailableException {
- CommandResult result = getDevice().executeShellV2Command("pidof " + appId);
- if (result.getStatus() != CommandStatus.SUCCESS) {
- return "";
- }
- return result.getStdout().trim();
+ private static String pidOf(String appId) throws Exception {
+ return expectCommandToSucceed("pidof " + appId).trim();
}
}
diff --git a/tools/aapt/Android.bp b/tools/aapt/Android.bp
index c75ba71c4432..a19d183d617b 100644
--- a/tools/aapt/Android.bp
+++ b/tools/aapt/Android.bp
@@ -124,6 +124,9 @@ cc_binary_host {
srcs: ["Main.cpp"],
use_version_lib: true,
static_libs: ["libaapt"],
+ dist: {
+ targets: ["aapt2_artifacts"],
+ },
}
// ==========================================================
diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp
index f29c9185cafa..61ba09b6a3c9 100644
--- a/tools/aapt2/dump/DumpManifest.cpp
+++ b/tools/aapt2/dump/DumpManifest.cpp
@@ -132,6 +132,12 @@ class ManifestExtractor {
/** Adds an element to the list of children of the element. */
void AddChild(std::unique_ptr<Element>& child) { children_.push_back(std::move(child)); }
+ template <typename Predicate>
+ void Filter(Predicate&& func) {
+ children_.erase(std::remove_if(children_.begin(), children_.end(),
+ [&](const auto& e) { return func(e.get()); }));
+ }
+
/** Retrieves the list of children of the element. */
const std::vector<std::unique_ptr<Element>>& children() const {
return children_;
@@ -1963,6 +1969,21 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) {
// Extract badging information
auto root = Visit(element);
+ // Filter out all "uses-sdk" tags besides the very last tag. The android runtime only uses the
+ // attribute values from the last defined tag.
+ std::vector<UsesSdkBadging*> filtered_uses_sdk_tags;
+ for (const auto& child : root->children()) {
+ if (auto uses_sdk = ElementCast<UsesSdkBadging>(child.get())) {
+ filtered_uses_sdk_tags.emplace_back(uses_sdk);
+ }
+ }
+ filtered_uses_sdk_tags.pop_back();
+
+ root->Filter([&](const ManifestExtractor::Element* e) {
+ return std::find(filtered_uses_sdk_tags.begin(), filtered_uses_sdk_tags.end(), e) !=
+ filtered_uses_sdk_tags.end();
+ });
+
// Print the elements in order seen
Print(root.get(), printer);