summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp4
-rw-r--r--apex/extservices/Android.bp37
-rw-r--r--apex/extservices/apex_manifest.json4
-rw-r--r--apex/extservices/com.android.extservices.avbpubkeybin0 -> 1032 bytes
-rw-r--r--apex/extservices/com.android.extservices.pem51
-rw-r--r--apex/extservices/com.android.extservices.pk8bin0 -> 2376 bytes
-rw-r--r--apex/extservices/com.android.extservices.x509.pem36
-rw-r--r--api/current.txt219
-rw-r--r--api/lint-baseline.txt8
-rwxr-xr-xapi/system-current.txt497
-rw-r--r--api/test-current.txt57
-rw-r--r--core/java/android/app/ActivityManager.java24
-rw-r--r--core/java/android/app/IActivityManager.aidl6
-rw-r--r--core/java/android/app/SharedPreferencesImpl.java5
-rw-r--r--core/java/android/app/SystemServiceRegistry.java8
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java2
-rw-r--r--core/java/android/content/Context.java8
-rw-r--r--core/java/android/content/pm/ActivityInfo.java11
-rw-r--r--core/java/android/content/pm/IPackageInstallerSession.aidl2
-rw-r--r--core/java/android/content/pm/PackageInstaller.java113
-rw-r--r--core/java/android/content/pm/PackageParser.java6
-rw-r--r--core/java/android/content/pm/parsing/ApkParseUtils.java1
-rw-r--r--core/java/android/content/pm/parsing/ComponentParseUtils.java7
-rw-r--r--core/java/android/content/pm/parsing/PackageInfoUtils.java1
-rw-r--r--core/java/android/hardware/display/DisplayManager.java11
-rw-r--r--core/java/android/hardware/display/DisplayManagerGlobal.java13
-rw-r--r--core/java/android/hardware/display/IDisplayManager.aidl3
-rw-r--r--core/java/android/net/NetworkAgent.java163
-rw-r--r--core/java/android/net/NetworkAgentConfig.java3
-rw-r--r--core/java/android/os/ISystemConfig.aidl33
-rw-r--r--core/java/android/os/SystemConfigManager.java91
-rw-r--r--core/java/android/os/storage/IStorageManager.aidl1
-rw-r--r--core/java/android/provider/Settings.java21
-rw-r--r--core/java/android/provider/Telephony.java6
-rw-r--r--core/java/android/service/autofill/FillResponse.java8
-rw-r--r--core/java/android/view/DisplayInfo.java2
-rw-r--r--core/java/android/view/InsetsAnimationControlImpl.java3
-rw-r--r--core/java/android/view/InsetsController.java52
-rw-r--r--core/java/android/view/InsetsSourceConsumer.java11
-rw-r--r--core/java/android/view/InsetsState.java8
-rw-r--r--core/java/android/view/ViewRootImpl.java54
-rw-r--r--core/java/android/view/WindowInsets.java43
-rw-r--r--core/java/android/view/WindowManager.java61
-rw-r--r--core/java/android/widget/Editor.java12
-rw-r--r--core/java/android/widget/WidgetFlags.java40
-rw-r--r--core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java119
-rw-r--r--core/java/com/android/internal/policy/DecorView.java3
-rw-r--r--core/java/com/android/internal/policy/PhoneWindow.java4
-rw-r--r--core/jni/com_android_internal_os_Zygote.cpp29
-rw-r--r--core/proto/android/app/settings_enums.proto5
-rw-r--r--core/proto/android/providers/settings/secure.proto1
-rw-r--r--core/res/AndroidManifest.xml8
-rwxr-xr-xcore/res/res/drawable-hdpi/ic_accessibility_magnification.pngbin4018 -> 0 bytes
-rwxr-xr-xcore/res/res/drawable-mdpi/ic_accessibility_magnification.pngbin2573 -> 0 bytes
-rwxr-xr-xcore/res/res/drawable-xhdpi/ic_accessibility_magnification.pngbin5547 -> 0 bytes
-rwxr-xr-xcore/res/res/drawable-xxhdpi/ic_accessibility_magnification.pngbin8939 -> 0 bytes
-rwxr-xr-xcore/res/res/drawable-xxxhdpi/ic_accessibility_magnification.pngbin12945 -> 0 bytes
-rw-r--r--core/res/res/drawable/ic_accessibility_color_correction.xml15
-rw-r--r--core/res/res/drawable/ic_accessibility_color_inversion.xml15
-rw-r--r--core/res/res/drawable/ic_accessibility_magnification.xml114
-rw-r--r--core/res/res/values/attrs.xml10
-rw-r--r--core/res/res/values/config.xml12
-rw-r--r--core/res/res/values/strings.xml6
-rw-r--r--core/res/res/values/symbols.xml3
-rw-r--r--core/tests/coretests/res/values/styles.xml3
-rw-r--r--core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java59
-rw-r--r--core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java2
-rw-r--r--core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java10
-rw-r--r--core/tests/coretests/src/android/view/InsetsControllerTest.java2
-rw-r--r--core/tests/coretests/src/android/view/InsetsStateTest.java30
-rw-r--r--core/tests/coretests/src/android/view/WindowInsetsTest.java15
-rw-r--r--core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java10
-rw-r--r--data/etc/privapp-permissions-platform.xml2
-rw-r--r--media/java/android/media/IMediaRouterService.aidl1
-rw-r--r--media/java/android/media/MediaCas.java322
-rw-r--r--media/java/android/media/MediaCasException.java13
-rw-r--r--media/java/android/media/MediaCasStateException.java90
-rw-r--r--media/java/android/media/MediaRoute2Info.java58
-rw-r--r--media/java/android/media/MediaRoute2ProviderService.java28
-rw-r--r--media/java/android/media/MediaRouter2.java371
-rw-r--r--media/java/android/media/MediaRouter2Utils.java7
-rw-r--r--media/java/android/media/RoutingSessionInfo.java27
-rw-r--r--media/java/android/media/tv/TvInputManager.java95
-rwxr-xr-xmedia/java/android/media/tv/TvInputService.java50
-rw-r--r--media/java/android/media/tv/tuner/DemuxCapabilities.java11
-rw-r--r--media/java/android/media/tv/tuner/Descrambler.java5
-rw-r--r--media/java/android/media/tv/tuner/Lnb.java7
-rw-r--r--media/java/android/media/tv/tuner/LnbCallback.java5
-rw-r--r--media/java/android/media/tv/tuner/Tuner.java110
-rw-r--r--media/java/android/media/tv/tuner/TunerConstants.java44
-rw-r--r--media/java/android/media/tv/tuner/dvr/Dvr.java104
-rw-r--r--media/java/android/media/tv/tuner/dvr/DvrPlayback.java106
-rw-r--r--media/java/android/media/tv/tuner/dvr/DvrRecorder.java60
-rw-r--r--media/java/android/media/tv/tuner/dvr/DvrSettings.java89
-rw-r--r--media/java/android/media/tv/tuner/dvr/OnPlaybackStatusChangedListener.java (renamed from media/java/android/media/tv/tuner/dvr/DvrCallback.java)14
-rw-r--r--media/java/android/media/tv/tuner/dvr/OnRecordStatusChangedListener.java33
-rw-r--r--media/java/android/media/tv/tuner/filter/AlpFilterConfiguration.java7
-rw-r--r--media/java/android/media/tv/tuner/filter/AudioDescriptor.java5
-rw-r--r--media/java/android/media/tv/tuner/filter/AvSettings.java2
-rw-r--r--media/java/android/media/tv/tuner/filter/DownloadEvent.java3
-rw-r--r--media/java/android/media/tv/tuner/filter/DownloadSettings.java3
-rw-r--r--media/java/android/media/tv/tuner/filter/Filter.java70
-rw-r--r--media/java/android/media/tv/tuner/filter/FilterCallback.java5
-rw-r--r--media/java/android/media/tv/tuner/filter/FilterConfiguration.java48
-rw-r--r--media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java13
-rw-r--r--media/java/android/media/tv/tuner/filter/IpPayloadEvent.java3
-rw-r--r--media/java/android/media/tv/tuner/filter/MediaEvent.java11
-rw-r--r--media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java15
-rw-r--r--media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java17
-rw-r--r--media/java/android/media/tv/tuner/filter/PesEvent.java3
-rw-r--r--media/java/android/media/tv/tuner/filter/RecordSettings.java16
-rw-r--r--media/java/android/media/tv/tuner/filter/SectionEvent.java1
-rw-r--r--media/java/android/media/tv/tuner/filter/SectionSettings.java3
-rw-r--r--media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java12
-rw-r--r--media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java3
-rw-r--r--media/java/android/media/tv/tuner/filter/Settings.java3
-rw-r--r--media/java/android/media/tv/tuner/filter/TemiEvent.java7
-rw-r--r--media/java/android/media/tv/tuner/filter/TimeFilter.java37
-rw-r--r--media/java/android/media/tv/tuner/filter/TlvFilterConfiguration.java7
-rw-r--r--media/java/android/media/tv/tuner/filter/TsFilterConfiguration.java2
-rw-r--r--media/java/android/media/tv/tuner/filter/TsRecordEvent.java23
-rw-r--r--media/java/android/media/tv/tuner/frontend/AnalogFrontendSettings.java55
-rw-r--r--media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java287
-rw-r--r--media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java22
-rw-r--r--packages/CarSystemUI/res/layout/super_notification_shade.xml111
-rw-r--r--packages/CarSystemUI/res/layout/super_status_bar.xml118
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java2
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarShadeControllerImpl.java12
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java26
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java6
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java6
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java1
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java1
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java3
-rw-r--r--packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java3
-rw-r--r--packages/Shell/AndroidManifest.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-af/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-am/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ar/strings.xml43
-rw-r--r--packages/SystemUI/res-keyguard/values-as/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-az/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-be/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-bg/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-bn/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-bs/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ca/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-cs/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-da/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-de/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-el/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rAU/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rGB/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rIN/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rXC/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-es-rUS/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-es/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-et/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-eu/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fa/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fi/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-gl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-gu/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-hi/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-hr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-hu/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-hy/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-in/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-is/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-it/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-iw/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ja/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ka/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-kk/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-km/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-kn/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ko/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ky/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-lo/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-lt/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-lv/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-mk/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ml/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-mn/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-mr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ms/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-my/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-nb/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ne/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-nl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-or/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pa/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pt/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ro/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ru/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-si/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sk/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sq/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sv/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sw/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ta/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-te/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-th/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-tl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-tr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-uk/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ur/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-uz/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-vi/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-zu/strings.xml3
-rw-r--r--packages/SystemUI/res/layout/super_notification_shade.xml104
-rw-r--r--packages/SystemUI/res/layout/super_status_bar.xml81
-rw-r--r--packages/SystemUI/res/values-af/strings.xml23
-rw-r--r--packages/SystemUI/res/values-am/strings.xml12
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml36
-rw-r--r--packages/SystemUI/res/values-as/strings.xml26
-rw-r--r--packages/SystemUI/res/values-az/strings.xml26
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml12
-rw-r--r--packages/SystemUI/res/values-be/strings.xml26
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml12
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml28
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml12
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml12
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml12
-rw-r--r--packages/SystemUI/res/values-da/strings.xml12
-rw-r--r--packages/SystemUI/res/values-de/strings.xml26
-rw-r--r--packages/SystemUI/res/values-el/strings.xml12
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml14
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml14
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml14
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml14
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml12
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml12
-rw-r--r--packages/SystemUI/res/values-es/strings.xml16
-rw-r--r--packages/SystemUI/res/values-et/strings.xml23
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml29
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml23
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml23
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml12
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml14
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml15
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml33
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml28
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml12
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml12
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml26
-rw-r--r--packages/SystemUI/res/values-in/strings.xml15
-rw-r--r--packages/SystemUI/res/values-is/strings.xml12
-rw-r--r--packages/SystemUI/res/values-it/strings.xml12
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml23
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml26
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml26
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml26
-rw-r--r--packages/SystemUI/res/values-km/strings.xml26
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml28
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml26
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml26
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml26
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml12
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml26
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml12
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml26
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml23
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml26
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml23
-rw-r--r--packages/SystemUI/res/values-my/strings.xml26
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml26
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml23
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml12
-rw-r--r--packages/SystemUI/res/values-or/strings.xml26
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml26
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml23
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml12
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml18
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml12
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml26
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml26
-rw-r--r--packages/SystemUI/res/values-si/strings.xml26
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml12
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml26
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml23
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml12
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml12
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml26
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml35
-rw-r--r--packages/SystemUI/res/values-te/strings.xml26
-rw-r--r--packages/SystemUI/res/values-th/strings.xml26
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml26
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml26
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml23
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml23
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml15
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml26
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml26
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml23
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml26
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml12
-rw-r--r--packages/SystemUI/src/com/android/systemui/Dependency.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorations.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java50
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java719
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java614
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java)49
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java162
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java32
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java92
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java673
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java588
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java28
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java)29
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java)11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java18
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java3
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java1
-rw-r--r--services/accessibility/java/com/android/server/accessibility/FullScreenMagnificationGestureHandler.java (renamed from services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java)95
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGestureHandler.java30
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java18
-rw-r--r--services/core/java/com/android/server/TestNetworkService.java4
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerConstants.java60
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java22
-rw-r--r--services/core/java/com/android/server/am/CoreSettingsObserver.java57
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java300
-rw-r--r--services/core/java/com/android/server/connectivity/Vpn.java6
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java64
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java18
-rw-r--r--services/core/java/com/android/server/media/BluetoothRouteProvider.java14
-rw-r--r--services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java45
-rw-r--r--services/core/java/com/android/server/media/MediaRouterService.java6
-rw-r--r--services/core/java/com/android/server/media/SystemMediaRoute2Provider.java68
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java131
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java20
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java42
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java5
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java12
-rw-r--r--services/core/java/com/android/server/wm/AppTransitionController.java36
-rw-r--r--services/core/java/com/android/server/wm/Dimmer.java7
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java20
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java142
-rw-r--r--services/core/java/com/android/server/wm/InputMonitor.java3
-rw-r--r--services/core/java/com/android/server/wm/InsetsPolicy.java31
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java3
-rw-r--r--services/core/java/com/android/server/wm/StatusBarController.java6
-rw-r--r--services/core/java/com/android/server/wm/SurfaceAnimator.java31
-rw-r--r--services/core/java/com/android/server/wm/Task.java13
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java22
-rw-r--r--services/core/java/com/android/server/wm/WindowContainerThumbnail.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java3
-rw-r--r--services/java/com/android/server/SystemConfigService.java62
-rw-r--r--services/java/com/android/server/SystemServer.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/FullScreenMagnificationGestureHandlerTest.java (renamed from services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java)20
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DimmerTests.java17
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java25
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java25
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java4
-rw-r--r--telephony/java/android/telephony/PinResult.java12
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java29
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java54
-rw-r--r--telephony/java/android/telephony/ims/ImsException.java12
-rw-r--r--telephony/java/android/telephony/ims/ImsMmTelManager.java264
-rw-r--r--telephony/java/android/telephony/ims/RegistrationManager.java20
-rw-r--r--telephony/java/android/telephony/ims/feature/ImsFeature.java24
-rw-r--r--telephony/java/android/telephony/ims/feature/MmTelFeature.java108
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl17
-rw-r--r--tests/net/integration/util/com/android/server/NetworkAgentWrapper.java2
-rw-r--r--tests/net/java/com/android/server/ConnectivityServiceTest.java2
-rw-r--r--wifi/java/android/net/wifi/ScanResult.aidl2
-rw-r--r--wifi/java/android/net/wifi/ScanResult.java79
-rw-r--r--wifi/java/android/net/wifi/SoftApConfiguration.java55
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java4
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java56
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkSuggestion.java58
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java25
-rw-r--r--wifi/java/android/net/wifi/wificond/DeviceWiphyCapabilities.java116
-rw-r--r--wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java40
-rw-r--r--wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java69
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java6
-rw-r--r--wifi/tests/src/android/net/wifi/wificond/DeviceWiphyCapabilitiesTest.java29
-rw-r--r--wifi/tests/src/android/net/wifi/wificond/WifiCondManagerTest.java4
430 files changed, 9448 insertions, 3700 deletions
diff --git a/Android.bp b/Android.bp
index 5fcefa64a92f..dd46108b8576 100644
--- a/Android.bp
+++ b/Android.bp
@@ -53,6 +53,7 @@ filegroup {
"core/java/android/view/DisplayAdjustments.java",
],
path: "core/java",
+ visibility: ["//frameworks/base/test-mock"],
}
filegroup {
@@ -326,8 +327,9 @@ java_library {
"framework-protos",
"game-driver-protos",
"android.hidl.base-V1.0-java",
- "android.hardware.cas-V1.1-java",
"android.hardware.cas-V1.0-java",
+ "android.hardware.cas-V1.1-java",
+ "android.hardware.cas-V1.2-java",
"android.hardware.contexthub-V1.0-java",
"android.hardware.gnss-V1.0-java",
"android.hardware.health-V1.0-java-constants",
diff --git a/apex/extservices/Android.bp b/apex/extservices/Android.bp
new file mode 100644
index 000000000000..c89f694c09d2
--- /dev/null
+++ b/apex/extservices/Android.bp
@@ -0,0 +1,37 @@
+// 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.
+
+apex {
+ name: "com.android.extservices",
+ defaults: ["com.android.extservices-defaults"],
+ manifest: "apex_manifest.json",
+}
+
+apex_defaults {
+ name: "com.android.extservices-defaults",
+ key: "com.android.extservices.key",
+ certificate: ":com.android.extservices.certificate",
+ apps: ["ExtServices"],
+}
+
+apex_key {
+ name: "com.android.extservices.key",
+ public_key: "com.android.extservices.avbpubkey",
+ private_key: "com.android.extservices.pem",
+}
+
+android_app_certificate {
+ name: "com.android.extservices.certificate",
+ certificate: "com.android.extservices",
+}
diff --git a/apex/extservices/apex_manifest.json b/apex/extservices/apex_manifest.json
new file mode 100644
index 000000000000..7ba21575df4a
--- /dev/null
+++ b/apex/extservices/apex_manifest.json
@@ -0,0 +1,4 @@
+{
+ "name": "com.android.extservices",
+ "version": 1
+}
diff --git a/apex/extservices/com.android.extservices.avbpubkey b/apex/extservices/com.android.extservices.avbpubkey
new file mode 100644
index 000000000000..f37d3e4a14d4
--- /dev/null
+++ b/apex/extservices/com.android.extservices.avbpubkey
Binary files differ
diff --git a/apex/extservices/com.android.extservices.pem b/apex/extservices/com.android.extservices.pem
new file mode 100644
index 000000000000..7bfbd34ff9b9
--- /dev/null
+++ b/apex/extservices/com.android.extservices.pem
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKAIBAAKCAgEAuYshVDiRkt3tmBhqcWkKOm5GcviKpLbHSPpYQDHGDwS0dqqL
+SqAd1/BgT/bVVtUkAciFApPnXn96WhNYCypptyC5FHCxM21uBCGmow+3WermD++w
+5dQk4QP2ONPIpG+KzOWBl9SiBud4SpOHDyr0JycBsrXS89Tln9kAsTDuDEFfXL/J
+8cX/S3IUwhPV0pAlgUIHdDp0DGFjZaJlEZBZ+HmImriC/AUNUMVb5lfbczXOEZPF
+0A9+JzYschfXUxn8nu1N7RN5GDbq+chszx1FMVhuFUheukkd4dLNSDl0O0RlUnD+
+C/xz1ilDzEVZhnMtMnxS9oJ8bA/HUVMfsFnaQbgGmQ0CcxFxnfbYyGXGG1H+b8vA
+MTVQi5rZXG2p+VgHIAKVrYmpETVnRPgoMqp18KuGtp5SDngi13G3YEzS7iFbqfYh
+6iW2G974nD/Dq0cSire8Oljd9PEaMCMZiP5PTFJp0G/mtw7ROoyZqsSM6rX3XVTo
+Y5dBmBMctSJ8rgDMi0ZNvRH+rq/E5+RT6yMAJ7DDbOJzBnQ3IIoGn8NzUT3P1FCB
+HYEp1U2N7QNirIQMAuVz3IlHae9N1kl3eGAO6f2CjV7vZmFpDeWw+KSYs71mRkOb
+WBgl6D9FFq4u1azrU3AwV0dj3x1eU6yVnKUy1J7ppF/mcR+VzH7ThzTdV7cCAwEA
+AQKCAgEApWFU2Mv/PYhg0bPZlLLKsiA+3RWaBo0AfpTd+oIjBpnr/OWweFjVoPcZ
+8cyShe4/RPOlUxHgJcO8m/MoA/PO/LLHJWf5GlzMthQEgs1sYVJVtBiydXitUn+E
+hUyIR8FAV7et1lZqAXtqJhbvSF7B9u/2vIMCv+GgtuTmkAmL9RKD3Jj6eG1CS84o
+oICrkx52v4rKOBgt/icEQMAKFCi1eRti3n3eCqK6JqdzbZIcAcoQnmw34mccy/im
+jx+fBuxf1oywa8NyqVmyAehazBVL6lrm7ENwY9zuLK4H2fuUFYu2QFCEsMxZt6da
+TgX2cTfSLnDQRfcyzeMWhu9vjHHabjpLNjiCKhIhGyO0rO1rtea8ajZHgM/2sxXq
+6gLynW0dlatlxmjANlN9WQPGNdzvcIFJ0TLnI4mlJnWpqCsN9iW1d4ey13WiZUVR
+DgtnR60zao+LRCCM4D3cuVLq0DjL2BlHGXnOPK/LpQG1LbI1TroZpgSEHSZlQRzT
+ql9txgNqTHxijXuPL2VhhwhW7cqDoO8sLwV3BqDMIH56U0cbUBiSA/G9fKeI/DEG
+i7LcrMgrBk+xnuAWoFHuzfBMAdD9i3kYyk+41tOmcza2TNJgxadVYp5woHFvYvS/
+GKaNiRz0XmcijO5Ir0yxgCq21BdkWzo5zVrTFABiKeR7YXiee8kCggEBAOeULWgR
+spolJJrACWJspRvKb9FGnbGiYOnCGJoAc751kuXmNxoyWnEwgcjrSEoayNPUfOtz
+IgA+twqjgl0Zec2XFPfUcgWUBrrvvUEV4NIH5ibaR7ezHGeovCWs9XoDyzHHvhDr
+c6T5kXFZ60rS5h6LGUnE1hkHFJoHuTIBbn9j7eIbri8S71i7HWQ04s4KuQ+Bwbxm
+UnkEhbc+zMWHXfXy7rx4/eEZcZwtEybIORcHXYNPGeqMfOlcEMHpKEOi+NvDA6cp
+vTaTSwJ6ZBgYh7Tw3bNgRxSknaIhcGwMD0ojStjC5xzXT1Zr2Z3GXwYvOGcq3MeZ
+z+V2cx5xuwyp7R0CggEBAM0cKKNZEZwi/1zBPUDMFB4iJoX12BxQX6e5wdlHGXgF
+XeZwCnaIxOxMDxH79M5Svmpdu/jkUijI/pRvcE1iohFyIBvTUSDmlAoy4keXqMEQ
+M2hA+TwVA3JLmMcV8HKy/MFlwwKJB1JDcoxGjnXsM5UjVTD2jilO7vlJZs3+0ws0
+R7qzRT3ED25QTpZyDYcKE2otc5bzIZG3yAaJtWd3NugWsKpxDgr2RFUGJiHBq72n
+48FkSjfgaDTn83zYcPvS0Uykb2ho8G/N+EurstL41n3nQo0I7FLbyptOopDDwsSp
+Ndejn08NVAQ+xFAafOyqHkA3Ytpl0QCZDpMBuLdvw+MCggEAOVMt1kgjPRMat4/4
+ArxANtvqyBRB7vnyIYthiaW5ARmbrntJgpuaVdCbIABWGbn9oqpD7gjHDuZ3axPE
+roUi6KiQkTSusQDOlbHI2Haw+2znJRD9ldSpoGNdh7oD3htYTk9Sll+ideEthrCq
+lRAV1NO8A83M7c8Z43Mr/dvq3XAAL+uIN7DpPL687NRGnJh87QDC039ExR5Ad3b9
+O5xhvwNO46rTtcgVnoJt7ji8IR46oMmQ8cWrGh0nLMkppWyPS98/ZT7ozryxYcCo
+TGquFTVWvBOGJO8G8l5ytNxbYI/R9Exy52nJAuyZpvu3BBHmVWt/0Y0asIOcxZmD
+owPhZQKCAQAfWAFBzReq05JQe1s/7q/YVwGqEQKgeQvVFsbvzDSxKajK0S5YJNhq
+/8iByA4GBZEBsidKhqGjh+uXhVwVB1Ca9+S+O9G3BGV1FYeMxzlLn40rjlpH+zIW
+okTLj6e5724+o61kUspioNn9Y77beGf9j3OyUsswttZAFB54tktL+AZKGqEnKjHt
+eqo3xWAZ1clXvXBfjfIAUaRok1y8XfRvDSCcO0CZHj8c+x6SpAT5q5FbeVb6KPnj
+s9p6ppzFbtb7Llm0C+1KOKCL98YRBWPJw7Bg2w86LkpM53xiQPgfk3gd5uwuaWwA
+ZhMb5qBWjjynNY+OrmZ8/+bBQk8XASZfAoIBAFkHOnZOD1JJQ0QvaJ9tuCgHi216
+I8QPMMTdm3ZEDHSYMNwl7ayeseBcmB2zaqBKYz75qcU0SK4lnZkR2wIpbsHZNSVM
+J0WpN6r9G4JdnVi11J04RsfSMjCUr/PTVMmPvw8xPHrCxkJmB+d56olSE80I1Jrx
+djCv1LtSsT10W7FIcY82/cOi4xxGLOA70lDCf+szofQgVP8WvuOA1YaFw98ca8zc
+A401CyNexk24/c3d6C19YW/MppdE0uGMxL/oHsPgwkZAf6LmvF/UF71PsBUEniLc
+YFaJl3wn1cPfBBo9L4sZzyP2qokL8YHdg+wW7b4IOsYwbeqceBvqPtcUUPs=
+-----END RSA PRIVATE KEY-----
diff --git a/apex/extservices/com.android.extservices.pk8 b/apex/extservices/com.android.extservices.pk8
new file mode 100644
index 000000000000..59585a212592
--- /dev/null
+++ b/apex/extservices/com.android.extservices.pk8
Binary files differ
diff --git a/apex/extservices/com.android.extservices.x509.pem b/apex/extservices/com.android.extservices.x509.pem
new file mode 100644
index 000000000000..e0343b81d279
--- /dev/null
+++ b/apex/extservices/com.android.extservices.x509.pem
@@ -0,0 +1,36 @@
+-----BEGIN CERTIFICATE-----
+MIIGLTCCBBWgAwIBAgIUdqdMmx/5OsCP3Ew3/hcr7+1ACHEwDQYJKoZIhvcNAQEL
+BQAwgaQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH
+DA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRy
+b2lkMSAwHgYDVQQDDBdjb20uYW5kcm9pZC5leHRzZXJ2aWNlczEiMCAGCSqGSIb3
+DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAgFw0yMDAxMTcxMDIxMzZaGA80NzU3
+MTIxMzEwMjEzNlowgaQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlh
+MRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYD
+VQQLDAdBbmRyb2lkMSAwHgYDVQQDDBdjb20uYW5kcm9pZC5leHRzZXJ2aWNlczEi
+MCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBANKaSeLGaFRRt779vAtTfG3t2aQZrWOByUYc7yUN
+RdmJqWxU47OL5urYmanWPbz2f972Q9oi8x+8y4ny9SEY3wg0pUbzvKNTXpkxWyG1
+HE2C2zTfzuDDLpDIf2usWynt1wLVhpYC3k+7Yv2vOIK5dKkezh6PfdKmsbDae5DE
+d22tTSYZ5KwNpIWrgQle26cRG5sqhAFdkpgGMF00Huz06cjUoTjs2sNSlXTRBOTP
+CCy8UoRjBivQZkwHbddfsn+Z22ARPG8JDg/n4mEi8C0T6bJeQeirSPkBCkD6Djgq
+7RddJ2eLYZII8l8r6A6x+6cnTkXHaV5g3LUwPvi8XEn9IUuT9WJNRje/vfYLycTQ
+kP415CZMxDvsi1Ul4YsbL3enE89ryGMTpVZPogch/36DG5Sye28yISItNUy3urJa
+OXbg7mh+MwPd4bQaW4CJk+AUweKaF4aV0SZFT+nCewL4xLdGdy889KazlW98NqtK
+hOSxIg1jHkZq48ajuq2A+ns1yDKt1l0f9IYCz3mz/IXInokbkjPvHahJTJ+OMHXO
+THD8e5gBzcK841jJk+H3EsIYOHsp66uy2IgEHN+9pAS6vI0xfrXOYuKzuSL3oxcV
+FlVTimt4xokMMerdcW4KD+MC5NFEip4DUS4JKCyG0wRI3ffEs9Zcpxi3QSibrjLW
+rz+hAgMBAAGjUzBRMB0GA1UdDgQWBBTP2AhZzEUUgtAFlkaMaq+RvY06fDAfBgNV
+HSMEGDAWgBTP2AhZzEUUgtAFlkaMaq+RvY06fDAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBCwUAA4ICAQCbwtfo37j62Sudmt32PCfRN/r5ZNDNNA2JhR8uDUmX
+xXfF5YfDvSKsNLiQKcDagu6a+0C+QnzXHXCBlXZFrTJ8NAVMlmqdHGwoFoYMfJZH
+R1lCTidyFMoMLJ8GRGPJjzDkKnOeAqKMCtKvXoH2r12+JB2/ov4ooLREu/wPkEXT
+OymkyWNP5XLQTKWqfEQyXXFpuwZ+m35Wkr0Fm92mZeJpVeIZPK7M7aK3zyoj7XJP
+YLMsR/AQs8OULdpfNMddAuN3ndlYu03LZlsF6LG5bduaDDcESJ5hdJrgBa/NBKRU
+IbS+q/6WAjYKMNRT/fPGew4wUzlWKi1Ihdk79oaqKKijE1b2JSJD1/SEYiBf+JPE
+bXobUrMbBwFpdhT+YLMF9FsuPQKsUIONaWiO4QcQoY/rQwGxPP6fV8ZbBrUWJewj
+MpSdU9foZNa/TmOAgfS/JxH+nXnG4+H1m8mdNBsxvsYmF2ZuGb/jdEeA2cuHIJDZ
+FJeWwCFxzlCGZJaUsxsnZByADBuufUVaO/9gGs0YQC/JP1i9hK4DyZdKwZpXdLi2
+Nw27Qma4WEIZnMb6Rgk1nTV+7ALcOSIhGgFOOeDTuCGfnEcz2coai5fbD/K6Q7Xu
+IRNyxHQjheZPdei2x912Ex/KqKGfaFaZJxrvCSKdhzxcTFIsO4JuZs+SDpRTKcI7
+Cw==
+-----END CERTIFICATE-----
diff --git a/api/current.txt b/api/current.txt
index 8d44c7d8e89b..430e8407a4d8 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11700,11 +11700,8 @@ package android.content.pm {
field public static final int STATUS_FAILURE_ABORTED = 3; // 0x3
field public static final int STATUS_FAILURE_BLOCKED = 2; // 0x2
field public static final int STATUS_FAILURE_CONFLICT = 5; // 0x5
- field public static final int STATUS_FAILURE_ILLEGAL_STATE = 9; // 0x9
field public static final int STATUS_FAILURE_INCOMPATIBLE = 7; // 0x7
field public static final int STATUS_FAILURE_INVALID = 4; // 0x4
- field public static final int STATUS_FAILURE_NAME_NOT_FOUND = 8; // 0x8
- field public static final int STATUS_FAILURE_SECURITY = 10; // 0xa
field public static final int STATUS_FAILURE_STORAGE = 6; // 0x6
field public static final int STATUS_PENDING_USER_ACTION = -1; // 0xffffffff
field public static final int STATUS_SUCCESS = 0; // 0x0
@@ -11726,7 +11723,6 @@ package android.content.pm {
method public void removeChildSessionId(int);
method public void removeSplit(@NonNull String) throws java.io.IOException;
method public void setStagingProgress(float);
- method public void transfer(@NonNull String, @NonNull android.content.IntentSender) throws android.content.pm.PackageManager.NameNotFoundException;
method public void transfer(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
}
@@ -18657,6 +18653,7 @@ package android.icu.lang {
field public static final int CHEROKEE_SUPPLEMENT_ID = 255; // 0xff
field public static final android.icu.lang.UCharacter.UnicodeBlock CHESS_SYMBOLS;
field public static final int CHESS_SYMBOLS_ID = 281; // 0x119
+ field public static final android.icu.lang.UCharacter.UnicodeBlock CHORASMIAN;
field public static final int CHORASMIAN_ID = 301; // 0x12d
field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY;
field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY_FORMS;
@@ -18685,6 +18682,7 @@ package android.icu.lang {
field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E_ID = 256; // 0x100
field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F;
field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F_ID = 274; // 0x112
+ field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G;
field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G_ID = 302; // 0x12e
field public static final int CJK_UNIFIED_IDEOGRAPHS_ID = 71; // 0x47
field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_DIACRITICAL_MARKS;
@@ -18735,6 +18733,7 @@ package android.icu.lang {
field public static final int DEVANAGARI_ID = 15; // 0xf
field public static final android.icu.lang.UCharacter.UnicodeBlock DINGBATS;
field public static final int DINGBATS_ID = 56; // 0x38
+ field public static final android.icu.lang.UCharacter.UnicodeBlock DIVES_AKURU;
field public static final int DIVES_AKURU_ID = 303; // 0x12f
field public static final android.icu.lang.UCharacter.UnicodeBlock DOGRA;
field public static final int DOGRA_ID = 282; // 0x11a
@@ -22907,6 +22906,7 @@ package android.icu.util {
field public static final android.icu.util.VersionInfo UNICODE_11_0;
field public static final android.icu.util.VersionInfo UNICODE_12_0;
field public static final android.icu.util.VersionInfo UNICODE_12_1;
+ field public static final android.icu.util.VersionInfo UNICODE_13_0;
field public static final android.icu.util.VersionInfo UNICODE_1_0;
field public static final android.icu.util.VersionInfo UNICODE_1_0_1;
field public static final android.icu.util.VersionInfo UNICODE_1_1_0;
@@ -24793,11 +24793,13 @@ package android.media {
public final class MediaCas implements java.lang.AutoCloseable {
ctor public MediaCas(int) throws android.media.MediaCasException.UnsupportedCasException;
+ ctor public MediaCas(int, @Nullable String, int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
method public static android.media.MediaCas.PluginDescriptor[] enumeratePlugins();
method protected void finalize();
method public static boolean isSystemIdSupported(int);
method public android.media.MediaCas.Session openSession() throws android.media.MediaCasException;
+ method @Nullable public android.media.MediaCas.Session openSession(int, int) throws android.media.MediaCasException;
method public void processEmm(@NonNull byte[], int, int) throws android.media.MediaCasException;
method public void processEmm(@NonNull byte[]) throws android.media.MediaCasException;
method public void provision(@NonNull String) throws android.media.MediaCasException;
@@ -24805,10 +24807,32 @@ package android.media {
method public void sendEvent(int, int, @Nullable byte[]) throws android.media.MediaCasException;
method public void setEventListener(@Nullable android.media.MediaCas.EventListener, @Nullable android.os.Handler);
method public void setPrivateData(@NonNull byte[]) throws android.media.MediaCasException;
+ field public static final int PLUGIN_STATUS_PHYSICAL_MODULE_CHANGED = 0; // 0x0
+ field public static final int PLUGIN_STATUS_SESSION_NUMBER_CHANGED = 1; // 0x1
+ field public static final int SCRAMBLING_MODE_AES128 = 9; // 0x9
+ field public static final int SCRAMBLING_MODE_AES_ECB = 10; // 0xa
+ field public static final int SCRAMBLING_MODE_AES_SCTE52 = 11; // 0xb
+ field public static final int SCRAMBLING_MODE_DVB_CISSA_V1 = 6; // 0x6
+ field public static final int SCRAMBLING_MODE_DVB_CSA1 = 1; // 0x1
+ field public static final int SCRAMBLING_MODE_DVB_CSA2 = 2; // 0x2
+ field public static final int SCRAMBLING_MODE_DVB_CSA3_ENHANCE = 5; // 0x5
+ field public static final int SCRAMBLING_MODE_DVB_CSA3_MINIMAL = 4; // 0x4
+ field public static final int SCRAMBLING_MODE_DVB_CSA3_STANDARD = 3; // 0x3
+ field public static final int SCRAMBLING_MODE_DVB_IDSA = 7; // 0x7
+ field public static final int SCRAMBLING_MODE_MULTI2 = 8; // 0x8
+ field public static final int SCRAMBLING_MODE_RESERVED = 0; // 0x0
+ field public static final int SCRAMBLING_MODE_TDES_ECB = 12; // 0xc
+ field public static final int SCRAMBLING_MODE_TDES_SCTE52 = 13; // 0xd
+ field public static final int SESSION_USAGE_LIVE = 0; // 0x0
+ field public static final int SESSION_USAGE_PLAYBACK = 1; // 0x1
+ field public static final int SESSION_USAGE_RECORD = 2; // 0x2
+ field public static final int SESSION_USAGE_TIMESHIFT = 3; // 0x3
}
public static interface MediaCas.EventListener {
method public void onEvent(@NonNull android.media.MediaCas, int, int, @Nullable byte[]);
+ method public default void onPluginStatusUpdate(@NonNull android.media.MediaCas, int, int);
+ method public default void onResourceLost(@NonNull android.media.MediaCas);
method public default void onSessionEvent(@NonNull android.media.MediaCas, @NonNull android.media.MediaCas.Session, int, int, @Nullable byte[]);
}
@@ -24819,6 +24843,7 @@ package android.media {
public final class MediaCas.Session implements java.lang.AutoCloseable {
method public void close();
+ method @NonNull public byte[] getSessionId();
method public void processEcm(@NonNull byte[], int, int) throws android.media.MediaCasException;
method public void processEcm(@NonNull byte[]) throws android.media.MediaCasException;
method public void sendSessionEvent(int, int, @Nullable byte[]) throws android.media.MediaCasException;
@@ -24831,6 +24856,9 @@ package android.media {
public static final class MediaCasException.DeniedByServerException extends android.media.MediaCasException {
}
+ public static final class MediaCasException.InsufficientResourceException extends android.media.MediaCasException {
+ }
+
public static final class MediaCasException.NotProvisionedException extends android.media.MediaCasException {
}
@@ -26449,6 +26477,7 @@ package android.media {
public final class MediaRoute2Info implements android.os.Parcelable {
method public int describeContents();
+ method @Nullable public String getClientPackageName();
method public int getConnectionState();
method @Nullable public CharSequence getDescription();
method public int getDeviceType();
@@ -26470,6 +26499,9 @@ package android.media {
field public static final int DEVICE_TYPE_REMOTE_SPEAKER = 2; // 0x2
field public static final int DEVICE_TYPE_REMOTE_TV = 1; // 0x1
field public static final int DEVICE_TYPE_UNKNOWN = 0; // 0x0
+ field public static final String FEATURE_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
+ field public static final String FEATURE_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
+ field public static final String FEATURE_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
}
@@ -26494,9 +26526,23 @@ package android.media {
public abstract class MediaRoute2ProviderService extends android.app.Service {
ctor public MediaRoute2ProviderService();
+ method @NonNull public final java.util.List<android.media.RoutingSessionInfo> getAllSessionInfo();
+ method @Nullable public final android.media.RoutingSessionInfo getSessionInfo(@NonNull String);
method public final void notifyRoutes(@NonNull java.util.Collection<android.media.MediaRoute2Info>);
- method @NonNull public android.os.IBinder onBind(@NonNull android.content.Intent);
+ method public final void notifySessionCreated(@NonNull android.media.RoutingSessionInfo, long);
+ method public final void notifySessionCreationFailed(long);
+ method public final void notifySessionReleased(@NonNull String);
+ method public final void notifySessionUpdated(@NonNull android.media.RoutingSessionInfo);
+ method @CallSuper @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent);
+ method public abstract void onCreateSession(@NonNull String, @NonNull String, long, @Nullable android.os.Bundle);
+ method public abstract void onDeselectRoute(@NonNull String, @NonNull String);
method public void onDiscoveryPreferenceChanged(@NonNull android.media.RouteDiscoveryPreference);
+ method public abstract void onReleaseSession(@NonNull String);
+ method public abstract void onSelectRoute(@NonNull String, @NonNull String);
+ method public abstract void onSetVolume(@NonNull String, int);
+ method public abstract void onTransferToRoute(@NonNull String, @NonNull String);
+ method public abstract void onUpdateVolume(@NonNull String, int);
+ field public static final long REQUEST_ID_UNKNOWN = 0L; // 0x0L
field public static final String SERVICE_INTERFACE = "android.media.MediaRoute2ProviderService";
}
@@ -26624,12 +26670,22 @@ package android.media {
}
public class MediaRouter2 {
+ method @NonNull public java.util.List<android.media.MediaRouter2.RoutingController> getControllers();
method @NonNull public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context);
method @NonNull public java.util.List<android.media.MediaRoute2Info> getRoutes();
+ method @NonNull public android.media.MediaRouter2.RoutingController getSystemController();
+ method public void registerControllerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaRouter2.RoutingControllerCallback);
method public void registerRouteCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaRouter2.RouteCallback, @NonNull android.media.RouteDiscoveryPreference);
+ method public void requestCreateController(@NonNull android.media.MediaRoute2Info);
+ method public void setOnGetControllerHintsListener(@Nullable android.media.MediaRouter2.OnGetControllerHintsListener);
+ method public void unregisterControllerCallback(@NonNull android.media.MediaRouter2.RoutingControllerCallback);
method public void unregisterRouteCallback(@NonNull android.media.MediaRouter2.RouteCallback);
}
+ public static interface MediaRouter2.OnGetControllerHintsListener {
+ method @Nullable public android.os.Bundle onGetControllerHints(@NonNull android.media.MediaRoute2Info);
+ }
+
public static class MediaRouter2.RouteCallback {
ctor public MediaRouter2.RouteCallback();
method public void onRoutesAdded(@NonNull java.util.List<android.media.MediaRoute2Info>);
@@ -26637,6 +26693,28 @@ package android.media {
method public void onRoutesRemoved(@NonNull java.util.List<android.media.MediaRoute2Info>);
}
+ public class MediaRouter2.RoutingController {
+ method public void deselectRoute(@NonNull android.media.MediaRoute2Info);
+ method @Nullable public android.os.Bundle getControlHints();
+ method @NonNull public java.util.List<android.media.MediaRoute2Info> getDeselectableRoutes();
+ method @NonNull public String getId();
+ method @NonNull public java.util.List<android.media.MediaRoute2Info> getSelectableRoutes();
+ method @NonNull public java.util.List<android.media.MediaRoute2Info> getSelectedRoutes();
+ method @NonNull public java.util.List<android.media.MediaRoute2Info> getTransferrableRoutes();
+ method public boolean isReleased();
+ method public void release();
+ method public void selectRoute(@NonNull android.media.MediaRoute2Info);
+ method public void transferToRoute(@NonNull android.media.MediaRoute2Info);
+ }
+
+ public static class MediaRouter2.RoutingControllerCallback {
+ ctor public MediaRouter2.RoutingControllerCallback();
+ method public void onControllerCreated(@NonNull android.media.MediaRouter2.RoutingController);
+ method public void onControllerCreationFailed(@NonNull android.media.MediaRoute2Info);
+ method public void onControllerReleased(@NonNull android.media.MediaRouter2.RoutingController);
+ method public void onControllerUpdated(@NonNull android.media.MediaRouter2.RoutingController);
+ }
+
public class MediaScannerConnection implements android.content.ServiceConnection {
ctor public MediaScannerConnection(android.content.Context, android.media.MediaScannerConnection.MediaScannerConnectionClient);
method public void connect();
@@ -27011,6 +27089,38 @@ package android.media {
method @NonNull public android.media.RouteDiscoveryPreference.Builder setPreferredFeatures(@NonNull java.util.List<java.lang.String>);
}
+ public final class RoutingSessionInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public String getClientPackageName();
+ method @Nullable public android.os.Bundle getControlHints();
+ method @NonNull public java.util.List<java.lang.String> getDeselectableRoutes();
+ method @NonNull public String getId();
+ method @NonNull public java.util.List<java.lang.String> getSelectableRoutes();
+ method @NonNull public java.util.List<java.lang.String> getSelectedRoutes();
+ method @NonNull public java.util.List<java.lang.String> getTransferrableRoutes();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.media.RoutingSessionInfo> CREATOR;
+ }
+
+ public static final class RoutingSessionInfo.Builder {
+ ctor public RoutingSessionInfo.Builder(@NonNull String, @NonNull String);
+ ctor public RoutingSessionInfo.Builder(@NonNull android.media.RoutingSessionInfo);
+ method @NonNull public android.media.RoutingSessionInfo.Builder addDeselectableRoute(@NonNull String);
+ method @NonNull public android.media.RoutingSessionInfo.Builder addSelectableRoute(@NonNull String);
+ method @NonNull public android.media.RoutingSessionInfo.Builder addSelectedRoute(@NonNull String);
+ method @NonNull public android.media.RoutingSessionInfo.Builder addTransferrableRoute(@NonNull String);
+ method @NonNull public android.media.RoutingSessionInfo build();
+ method @NonNull public android.media.RoutingSessionInfo.Builder clearDeselectableRoutes();
+ method @NonNull public android.media.RoutingSessionInfo.Builder clearSelectableRoutes();
+ method @NonNull public android.media.RoutingSessionInfo.Builder clearSelectedRoutes();
+ method @NonNull public android.media.RoutingSessionInfo.Builder clearTransferrableRoutes();
+ method @NonNull public android.media.RoutingSessionInfo.Builder removeDeselectableRoute(@NonNull String);
+ method @NonNull public android.media.RoutingSessionInfo.Builder removeSelectableRoute(@NonNull String);
+ method @NonNull public android.media.RoutingSessionInfo.Builder removeSelectedRoute(@NonNull String);
+ method @NonNull public android.media.RoutingSessionInfo.Builder removeTransferrableRoute(@NonNull String);
+ method @NonNull public android.media.RoutingSessionInfo.Builder setControlHints(@Nullable android.os.Bundle);
+ }
+
public final class Session2Command implements android.os.Parcelable {
ctor public Session2Command(int);
ctor public Session2Command(@NonNull String, @Nullable android.os.Bundle);
@@ -28817,6 +28927,19 @@ package android.media.tv {
field public static final int TIME_SHIFT_STATUS_UNSUPPORTED = 1; // 0x1
field public static final int VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY = 4; // 0x4
field public static final int VIDEO_UNAVAILABLE_REASON_BUFFERING = 3; // 0x3
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_BLACKOUT = 16; // 0x10
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_CARD_INVALID = 15; // 0xf
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_CARD_MUTE = 14; // 0xe
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_INSUFFICIENT_OUTPUT_PROTECTION = 7; // 0x7
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_LICENSE_EXPIRED = 10; // 0xa
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_NEED_ACTIVATION = 11; // 0xb
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_NEED_PAIRING = 12; // 0xc
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_NO_CARD = 13; // 0xd
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_PVR_RECORDING_NOT_ALLOWED = 8; // 0x8
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_REBOOTING = 17; // 0x11
+ field public static final int VIDEO_UNAVAILABLE_REASON_CAS_UNKNOWN = 18; // 0x12
+ field public static final int VIDEO_UNAVAILABLE_REASON_INSUFFICIENT_RESOURCE = 6; // 0x6
+ field public static final int VIDEO_UNAVAILABLE_REASON_NOT_CONNECTED = 5; // 0x5
field public static final int VIDEO_UNAVAILABLE_REASON_TUNING = 1; // 0x1
field public static final int VIDEO_UNAVAILABLE_REASON_UNKNOWN = 0; // 0x0
field public static final int VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL = 2; // 0x2
@@ -28838,6 +28961,11 @@ package android.media.tv {
method @Nullable public android.media.tv.TvInputService.RecordingSession onCreateRecordingSession(@NonNull String, @NonNull String);
method @Nullable public abstract android.media.tv.TvInputService.Session onCreateSession(String);
method @Nullable public android.media.tv.TvInputService.Session onCreateSession(@NonNull String, @NonNull String);
+ field public static final int PRIORITY_HINT_USE_CASE_TYPE_BACKGROUND = 100; // 0x64
+ field public static final int PRIORITY_HINT_USE_CASE_TYPE_LIVE = 400; // 0x190
+ field public static final int PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK = 300; // 0x12c
+ field public static final int PRIORITY_HINT_USE_CASE_TYPE_RECORD = 500; // 0x1f4
+ field public static final int PRIORITY_HINT_USE_CASE_TYPE_SCAN = 200; // 0xc8
field public static final String SERVICE_INTERFACE = "android.media.tv.TvInputService";
field public static final String SERVICE_META_DATA = "android.media.tv.input";
}
@@ -30511,7 +30639,9 @@ package android.net.wifi {
}
public class ScanResult implements android.os.Parcelable {
+ ctor public ScanResult(@NonNull android.net.wifi.ScanResult);
method public int describeContents();
+ method @NonNull public java.util.List<android.net.wifi.ScanResult.InformationElement> getInformationElements();
method public int getWifiStandard();
method public boolean is80211mcResponder();
method public boolean isPasspointNetwork();
@@ -30522,6 +30652,7 @@ package android.net.wifi {
field public static final int CHANNEL_WIDTH_40MHZ = 1; // 0x1
field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2
field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.ScanResult> CREATOR;
field public String SSID;
field public static final int WIFI_STANDARD_11AC = 5; // 0x5
field public static final int WIFI_STANDARD_11AX = 6; // 0x6
@@ -30539,6 +30670,13 @@ package android.net.wifi {
field public CharSequence venueName;
}
+ public static class ScanResult.InformationElement {
+ ctor public ScanResult.InformationElement(@NonNull android.net.wifi.ScanResult.InformationElement);
+ method @NonNull public java.nio.ByteBuffer getBytes();
+ method public int getId();
+ method public int getIdExt();
+ }
+
public final class SoftApConfiguration implements android.os.Parcelable {
method public int describeContents();
method @Nullable public android.net.MacAddress getBssid();
@@ -30848,6 +30986,7 @@ package android.net.wifi {
field public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE = 3; // 0x3
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP = 4; // 0x4
+ field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED = 6; // 0x6
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_APP_DISALLOWED = 2; // 0x2
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL = 1; // 0x1
field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5; // 0x5
@@ -30965,6 +31104,7 @@ package android.net.wifi {
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setPasspointConfig(@NonNull android.net.wifi.hotspot2.PasspointConfiguration);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setPriority(@IntRange(from=0) int);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setSsid(@NonNull String);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setUntrusted(boolean);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWapiEnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWapiPassphrase(@NonNull String);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
@@ -31460,8 +31600,10 @@ package android.net.wifi.p2p {
method public int getControlPort();
method public int getDeviceType();
method public int getMaxThroughput();
+ method public boolean isContentProtectionSupported();
method public boolean isSessionAvailable();
method public boolean isWfdEnabled();
+ method public void setContentProtectionSupported(boolean);
method public void setControlPort(int);
method public boolean setDeviceType(int);
method public void setMaxThroughput(int);
@@ -39614,6 +39756,7 @@ package android.provider {
public static interface MediaStore.Files.FileColumns extends android.provider.MediaStore.MediaColumns {
field public static final String MEDIA_TYPE = "media_type";
field public static final int MEDIA_TYPE_AUDIO = 2; // 0x2
+ field public static final int MEDIA_TYPE_DOCUMENT = 6; // 0x6
field public static final int MEDIA_TYPE_IMAGE = 1; // 0x1
field public static final int MEDIA_TYPE_NONE = 0; // 0x0
field public static final int MEDIA_TYPE_PLAYLIST = 4; // 0x4
@@ -42293,13 +42436,13 @@ package android.service.autofill {
method @NonNull public android.service.autofill.FillResponse build();
method @NonNull public android.service.autofill.FillResponse.Builder disableAutofill(long);
method @NonNull public android.service.autofill.FillResponse.Builder setAuthentication(@NonNull android.view.autofill.AutofillId[], @Nullable android.content.IntentSender, @Nullable android.widget.RemoteViews);
- method @NonNull public android.service.autofill.FillResponse.Builder setCancelTargetIds(@Nullable int[]);
method @NonNull public android.service.autofill.FillResponse.Builder setClientState(@Nullable android.os.Bundle);
method @NonNull public android.service.autofill.FillResponse.Builder setFieldClassificationIds(@NonNull android.view.autofill.AutofillId...);
method @NonNull public android.service.autofill.FillResponse.Builder setFlags(int);
method @NonNull public android.service.autofill.FillResponse.Builder setFooter(@NonNull android.widget.RemoteViews);
method @NonNull public android.service.autofill.FillResponse.Builder setHeader(@NonNull android.widget.RemoteViews);
method @NonNull public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
+ method @NonNull public android.service.autofill.FillResponse.Builder setPresentationCancelIds(@Nullable int[]);
method @NonNull public android.service.autofill.FillResponse.Builder setSaveInfo(@NonNull android.service.autofill.SaveInfo);
method @NonNull public android.service.autofill.FillResponse.Builder setUserData(@NonNull android.service.autofill.UserData);
}
@@ -47101,6 +47244,37 @@ package android.telephony.gsm {
package android.telephony.ims {
+ public final class ImsException extends java.lang.Exception {
+ method public int getCode();
+ field public static final int CODE_ERROR_SERVICE_UNAVAILABLE = 1; // 0x1
+ field public static final int CODE_ERROR_UNSPECIFIED = 0; // 0x0
+ field public static final int CODE_ERROR_UNSUPPORTED_OPERATION = 2; // 0x2
+ }
+
+ public class ImsMmTelManager implements android.telephony.ims.RegistrationManager {
+ method @NonNull @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int);
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public int getVoWiFiModeSetting();
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public boolean isAdvancedCallingSettingEnabled();
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public boolean isTtyOverVolteEnabled();
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public boolean isVoWiFiRoamingSettingEnabled();
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public boolean isVoWiFiSettingEnabled();
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public boolean isVtSettingEnabled();
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public void registerMmTelCapabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback) throws android.telephony.ims.ImsException;
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
+ method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public void unregisterMmTelCapabilityCallback(@NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback);
+ field public static final int WIFI_MODE_CELLULAR_PREFERRED = 1; // 0x1
+ field public static final int WIFI_MODE_WIFI_ONLY = 0; // 0x0
+ field public static final int WIFI_MODE_WIFI_PREFERRED = 2; // 0x2
+ }
+
+ public static class ImsMmTelManager.CapabilityCallback {
+ ctor public ImsMmTelManager.CapabilityCallback();
+ method public void onCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
+ }
+
public final class ImsReasonInfo implements android.os.Parcelable {
ctor public ImsReasonInfo(int, int, @Nullable String);
method public int describeContents();
@@ -47284,6 +47458,38 @@ package android.telephony.ims {
field public static final int EXTRA_CODE_CALL_RETRY_SILENT_REDIAL = 2; // 0x2
}
+ public interface RegistrationManager {
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
+ field public static final int REGISTRATION_STATE_NOT_REGISTERED = 0; // 0x0
+ field public static final int REGISTRATION_STATE_REGISTERED = 2; // 0x2
+ field public static final int REGISTRATION_STATE_REGISTERING = 1; // 0x1
+ }
+
+ public static class RegistrationManager.RegistrationCallback {
+ ctor public RegistrationManager.RegistrationCallback();
+ method public void onRegistered(int);
+ method public void onRegistering(int);
+ method public void onTechnologyChangeFailed(int, @Nullable android.telephony.ims.ImsReasonInfo);
+ method public void onUnregistered(@Nullable android.telephony.ims.ImsReasonInfo);
+ }
+
+}
+
+package android.telephony.ims.feature {
+
+ public class MmTelFeature {
+ }
+
+ public static class MmTelFeature.MmTelCapabilities {
+ field public static final int CAPABILITY_TYPE_SMS = 8; // 0x8
+ field public static final int CAPABILITY_TYPE_UT = 4; // 0x4
+ field public static final int CAPABILITY_TYPE_VIDEO = 2; // 0x2
+ field public static final int CAPABILITY_TYPE_VOICE = 1; // 0x1
+ }
+
}
package android.telephony.mbms {
@@ -53869,6 +54075,7 @@ package android.view {
field public static final int LAST_SUB_WINDOW = 1999; // 0x7cf
field public static final int LAST_SYSTEM_WINDOW = 2999; // 0xbb7
field public static final int LAYOUT_CHANGED = 1; // 0x1
+ field public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS = 3; // 0x3
field public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0; // 0x0
field public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2; // 0x2
field public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1; // 0x1
diff --git a/api/lint-baseline.txt b/api/lint-baseline.txt
index a3318c7e6745..2a8f04fe54b6 100644
--- a/api/lint-baseline.txt
+++ b/api/lint-baseline.txt
@@ -505,6 +505,12 @@ MissingNullability: android.app.AsyncNotedAppOp#writeToParcel(android.os.Parcel,
MissingNullability: android.app.SyncNotedAppOp#equals(Object) parameter #0:
+MissingNullability: android.icu.lang.UCharacter.UnicodeBlock#CHORASMIAN:
+ Missing nullability on field `CHORASMIAN` in class `class android.icu.lang.UCharacter.UnicodeBlock`
+MissingNullability: android.icu.lang.UCharacter.UnicodeBlock#CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G:
+ Missing nullability on field `CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G` in class `class android.icu.lang.UCharacter.UnicodeBlock`
+MissingNullability: android.icu.lang.UCharacter.UnicodeBlock#DIVES_AKURU:
+ Missing nullability on field `DIVES_AKURU` in class `class android.icu.lang.UCharacter.UnicodeBlock`
MissingNullability: android.icu.lang.UCharacter.UnicodeBlock#EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS:
MissingNullability: android.icu.lang.UCharacter.UnicodeBlock#ELYMAIC:
@@ -549,6 +555,8 @@ MissingNullability: android.icu.util.VersionInfo#UNICODE_12_0:
MissingNullability: android.icu.util.VersionInfo#UNICODE_12_1:
+MissingNullability: android.icu.util.VersionInfo#UNICODE_13_0:
+ Missing nullability on field `UNICODE_13_0` in class `class android.icu.util.VersionInfo`
MissingNullability: android.media.MediaMetadataRetriever#getFrameAtTime(long, int, android.media.MediaMetadataRetriever.BitmapParams):
MissingNullability: android.media.MediaMetadataRetriever#getScaledFrameAtTime(long, int, int, int, android.media.MediaMetadataRetriever.BitmapParams):
diff --git a/api/system-current.txt b/api/system-current.txt
index cf6c3c9e9904..d1696c8256c4 100755
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -155,6 +155,7 @@ package android {
field public static final String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES";
field public static final String RADIO_SCAN_WITHOUT_LOCATION = "android.permission.RADIO_SCAN_WITHOUT_LOCATION";
field public static final String READ_ACTIVE_EMERGENCY_SESSION = "android.permission.READ_ACTIVE_EMERGENCY_SESSION";
+ field public static final String READ_CARRIER_APP_INFO = "android.permission.READ_CARRIER_APP_INFO";
field public static final String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS";
field public static final String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS";
field public static final String READ_DEVICE_CONFIG = "android.permission.READ_DEVICE_CONFIG";
@@ -327,6 +328,7 @@ package android.app {
method @NonNull public java.util.Collection<java.util.Locale> getSupportedLocales();
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, "android.permission.CREATE_USERS"}) public boolean isProfileForeground(@NonNull android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[], @NonNull String);
method @RequiresPermission(android.Manifest.permission.KILL_UID) public void killUid(int, String);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public void setDeviceLocales(@NonNull android.os.LocaleList);
@@ -1752,6 +1754,7 @@ package android.content {
field public static final String SECURE_ELEMENT_SERVICE = "secure_element";
field public static final String STATS_MANAGER = "stats";
field public static final String STATUS_BAR_SERVICE = "statusbar";
+ field public static final String SYSTEM_CONFIG_SERVICE = "system_config";
field public static final String SYSTEM_UPDATE_SERVICE = "system_update";
field public static final String TELEPHONY_IMS_SERVICE = "telephony_ims";
field public static final String TELEPHONY_REGISTRY_SERVICE = "telephony_registry";
@@ -4671,12 +4674,25 @@ package android.media.tv.tuner {
method public int getVideoFilterCount();
}
+ public class Descrambler implements java.lang.AutoCloseable {
+ method public int addPid(int, int, @Nullable android.media.tv.tuner.filter.Filter);
+ method public void close();
+ method public int removePid(int, int, @Nullable android.media.tv.tuner.filter.Filter);
+ method public int setKeyToken(@Nullable byte[]);
+ field public static final int PID_TYPE_MMTP = 2; // 0x2
+ field public static final int PID_TYPE_T = 1; // 0x1
+ }
+
public class Lnb implements java.lang.AutoCloseable {
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void close();
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int sendDiseqcMessage(@NonNull byte[]);
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int setSatellitePosition(int);
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int setTone(int);
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int setVoltage(int);
+ field public static final int EVENT_TYPE_DISEQC_RX_OVERFLOW = 0; // 0x0
+ field public static final int EVENT_TYPE_DISEQC_RX_PARITY_ERROR = 2; // 0x2
+ field public static final int EVENT_TYPE_DISEQC_RX_TIMEOUT = 1; // 0x1
+ field public static final int EVENT_TYPE_LNB_OVERLOAD = 3; // 0x3
field public static final int POSITION_A = 1; // 0x1
field public static final int POSITION_B = 2; // 0x2
field public static final int POSITION_UNDEFINED = 0; // 0x0
@@ -4693,10 +4709,21 @@ package android.media.tv.tuner {
field public static final int VOLTAGE_NONE = 0; // 0x0
}
+ public interface LnbCallback {
+ method public void onDiseqcMessage(@NonNull byte[]);
+ method public void onEvent(int);
+ }
+
public final class Tuner implements java.lang.AutoCloseable {
ctor public Tuner(@NonNull android.content.Context);
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void clearOnTuneEventListener();
method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.Tuner.Descrambler openDescrambler();
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.dvr.DvrPlayback openDvrPlayback(long, @Nullable java.util.concurrent.Executor, @Nullable android.media.tv.tuner.dvr.OnPlaybackStatusChangedListener);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.dvr.DvrRecorder openDvrRecorder(long, @Nullable java.util.concurrent.Executor, @Nullable android.media.tv.tuner.dvr.OnRecordStatusChangedListener);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.filter.Filter openFilter(int, int, long, @Nullable java.util.concurrent.Executor, @Nullable android.media.tv.tuner.filter.FilterCallback);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.Lnb openLnb(@Nullable java.util.concurrent.Executor, @Nullable android.media.tv.tuner.LnbCallback);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.Lnb openLnbByName(@Nullable String, @Nullable java.util.concurrent.Executor, @NonNull android.media.tv.tuner.LnbCallback);
+ method @Nullable public android.media.tv.tuner.filter.TimeFilter openTimeFilter();
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void setOnTuneEventListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.OnTuneEventListener);
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int stopTune();
method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int tune(@NonNull android.media.tv.tuner.frontend.FrontendSettings);
@@ -4705,19 +4732,7 @@ package android.media.tv.tuner {
public class Tuner.Descrambler {
}
- public class Tuner.Filter {
- }
-
- public static interface Tuner.FilterCallback {
- method public void onFilterEvent(@NonNull android.media.tv.tuner.Tuner.Filter, @NonNull android.media.tv.tuner.filter.FilterEvent[]);
- method public void onFilterStatusChanged(@NonNull android.media.tv.tuner.Tuner.Filter, int);
- }
-
public final class TunerConstants {
- field public static final int FILTER_STATUS_DATA_READY = 1; // 0x1
- field public static final int FILTER_STATUS_HIGH_WATER = 4; // 0x4
- field public static final int FILTER_STATUS_LOW_WATER = 2; // 0x2
- field public static final int FILTER_STATUS_OVERFLOW = 8; // 0x8
field public static final int RESULT_INVALID_ARGUMENT = 4; // 0x4
field public static final int RESULT_INVALID_STATE = 3; // 0x3
field public static final int RESULT_NOT_INITIALIZED = 2; // 0x2
@@ -4725,24 +4740,256 @@ package android.media.tv.tuner {
field public static final int RESULT_SUCCESS = 0; // 0x0
field public static final int RESULT_UNAVAILABLE = 1; // 0x1
field public static final int RESULT_UNKNOWN_ERROR = 6; // 0x6
+ field public static final int SC_HEVC_INDEX_AUD = 2; // 0x2
+ field public static final int SC_HEVC_INDEX_SLICE_BLA_N_LP = 16; // 0x10
+ field public static final int SC_HEVC_INDEX_SLICE_BLA_W_RADL = 8; // 0x8
+ field public static final int SC_HEVC_INDEX_SLICE_CE_BLA_W_LP = 4; // 0x4
+ field public static final int SC_HEVC_INDEX_SLICE_IDR_N_LP = 64; // 0x40
+ field public static final int SC_HEVC_INDEX_SLICE_IDR_W_RADL = 32; // 0x20
+ field public static final int SC_HEVC_INDEX_SLICE_TRAIL_CRA = 128; // 0x80
+ field public static final int SC_HEVC_INDEX_SPS = 1; // 0x1
+ field public static final int SC_INDEX_B_FRAME = 4; // 0x4
+ field public static final int SC_INDEX_I_FRAME = 1; // 0x1
+ field public static final int SC_INDEX_P_FRAME = 2; // 0x2
+ field public static final int SC_INDEX_SEQUENCE = 8; // 0x8
+ }
+
+}
+
+package android.media.tv.tuner.dvr {
+
+ public class Dvr implements java.lang.AutoCloseable {
+ ctor protected Dvr(int);
+ method public int attachFilter(@NonNull android.media.tv.tuner.filter.Filter);
+ method public void close();
+ method public int configure(@NonNull android.media.tv.tuner.dvr.DvrSettings);
+ method public int detachFilter(@NonNull android.media.tv.tuner.filter.Filter);
+ method public int flush();
+ method public void setFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
+ method public int start();
+ method public int stop();
+ field public static final int TYPE_PLAYBACK = 1; // 0x1
+ field public static final int TYPE_RECORD = 0; // 0x0
+ }
+
+ public class DvrPlayback extends android.media.tv.tuner.dvr.Dvr {
+ method public long read(long);
+ method public long read(@NonNull byte[], long, long);
+ field public static final int PLAYBACK_STATUS_ALMOST_EMPTY = 2; // 0x2
+ field public static final int PLAYBACK_STATUS_ALMOST_FULL = 4; // 0x4
+ field public static final int PLAYBACK_STATUS_EMPTY = 1; // 0x1
+ field public static final int PLAYBACK_STATUS_FULL = 8; // 0x8
+ }
+
+ public class DvrRecorder extends android.media.tv.tuner.dvr.Dvr {
+ method public long write(long);
+ method public long write(@NonNull byte[], long, long);
+ }
+
+ public class DvrSettings {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.dvr.DvrSettings.Builder builder(@NonNull android.content.Context);
+ method public int getDataFormat();
+ method public long getHighThreshold();
+ method public long getLowThreshold();
+ method public long getPacketSize();
+ method public int getStatusMask();
+ field public static final int DATA_FORMAT_ES = 2; // 0x2
+ field public static final int DATA_FORMAT_PES = 1; // 0x1
+ field public static final int DATA_FORMAT_SHV_TLV = 3; // 0x3
+ field public static final int DATA_FORMAT_TS = 0; // 0x0
+ }
+
+ public static final class DvrSettings.Builder {
+ ctor public DvrSettings.Builder();
+ method @NonNull public android.media.tv.tuner.dvr.DvrSettings build();
+ method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setDataFormat(int);
+ method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setHighThreshold(long);
+ method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setLowThreshold(long);
+ method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setPacketSize(long);
+ method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setStatusMask(int);
+ }
+
+ public interface OnPlaybackStatusChangedListener {
+ method public void onPlaybackStatusChanged(int);
+ }
+
+ public interface OnRecordStatusChangedListener {
+ method public void onRecordStatusChanged(int);
}
}
package android.media.tv.tuner.filter {
+ public class AlpFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.AlpFilterConfiguration.Builder builder(@NonNull android.content.Context);
+ method public int getLengthType();
+ method public int getPacketType();
+ method public int getType();
+ field public static final int LENGTH_TYPE_UNDEFINED = 0; // 0x0
+ field public static final int LENGTH_TYPE_WITHOUT_ADDITIONAL_HEADER = 1; // 0x1
+ field public static final int LENGTH_TYPE_WITH_ADDITIONAL_HEADER = 2; // 0x2
+ }
+
+ public static class AlpFilterConfiguration.Builder extends android.media.tv.tuner.filter.FilterConfiguration.Builder<android.media.tv.tuner.filter.AlpFilterConfiguration.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.AlpFilterConfiguration build();
+ method @NonNull public android.media.tv.tuner.filter.AlpFilterConfiguration.Builder setLengthType(int);
+ method @NonNull public android.media.tv.tuner.filter.AlpFilterConfiguration.Builder setPacketType(int);
+ }
+
+ public class AudioDescriptor {
+ method public byte getAdFade();
+ method public byte getAdGainCenter();
+ method public byte getAdGainFront();
+ method public byte getAdGainSurround();
+ method public byte getAdPan();
+ method public char getAdVersionTextTag();
+ }
+
+ public class AvSettings extends android.media.tv.tuner.filter.Settings {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.AvSettings.Builder builder(@NonNull android.content.Context, int, boolean);
+ method public boolean isPassthrough();
+ }
+
+ public static class AvSettings.Builder extends android.media.tv.tuner.filter.Settings.Builder<android.media.tv.tuner.filter.AvSettings.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.AvSettings build();
+ method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setPassthrough(boolean);
+ }
+
+ public class DownloadEvent extends android.media.tv.tuner.filter.FilterEvent {
+ method public int getDataLength();
+ method public int getItemFragmentIndex();
+ method public int getItemId();
+ method public int getLastItemFragmentIndex();
+ method public int getMpuSequenceNumber();
+ }
+
+ public class DownloadSettings extends android.media.tv.tuner.filter.Settings {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.DownloadSettings.Builder builder(@NonNull android.content.Context, int);
+ method public int getDownloadId();
+ }
+
+ public static class DownloadSettings.Builder extends android.media.tv.tuner.filter.Settings.Builder<android.media.tv.tuner.filter.DownloadSettings.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.DownloadSettings build();
+ method @NonNull public android.media.tv.tuner.filter.DownloadSettings.Builder setDownloadId(int);
+ }
+
+ public class Filter implements java.lang.AutoCloseable {
+ method public void close();
+ method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
+ method public int flush();
+ method public int getId();
+ method public int read(@NonNull byte[], long, long);
+ method public int setDataSource(@Nullable android.media.tv.tuner.filter.Filter);
+ method public int start();
+ method public int stop();
+ field public static final int STATUS_DATA_READY = 1; // 0x1
+ field public static final int STATUS_HIGH_WATER = 4; // 0x4
+ field public static final int STATUS_LOW_WATER = 2; // 0x2
+ field public static final int STATUS_OVERFLOW = 8; // 0x8
+ field public static final int SUBTYPE_AUDIO = 3; // 0x3
+ field public static final int SUBTYPE_DOWNLOAD = 5; // 0x5
+ field public static final int SUBTYPE_IP = 13; // 0xd
+ field public static final int SUBTYPE_IP_PAYLOAD = 12; // 0xc
+ field public static final int SUBTYPE_MMTP = 10; // 0xa
+ field public static final int SUBTYPE_NTP = 11; // 0xb
+ field public static final int SUBTYPE_PAYLOAD_THROUGH = 14; // 0xe
+ field public static final int SUBTYPE_PCR = 8; // 0x8
+ field public static final int SUBTYPE_PES = 2; // 0x2
+ field public static final int SUBTYPE_PTP = 16; // 0x10
+ field public static final int SUBTYPE_RECORD = 6; // 0x6
+ field public static final int SUBTYPE_SECTION = 1; // 0x1
+ field public static final int SUBTYPE_TEMI = 9; // 0x9
+ field public static final int SUBTYPE_TLV = 15; // 0xf
+ field public static final int SUBTYPE_TS = 7; // 0x7
+ field public static final int SUBTYPE_UNDEFINED = 0; // 0x0
+ field public static final int SUBTYPE_VIDEO = 4; // 0x4
+ field public static final int TYPE_ALP = 16; // 0x10
+ field public static final int TYPE_IP = 4; // 0x4
+ field public static final int TYPE_MMTP = 2; // 0x2
+ field public static final int TYPE_TLV = 8; // 0x8
+ field public static final int TYPE_TS = 1; // 0x1
+ }
+
+ public interface FilterCallback {
+ method public void onFilterEvent(@NonNull android.media.tv.tuner.filter.Filter, @NonNull android.media.tv.tuner.filter.FilterEvent[]);
+ method public void onFilterStatusChanged(@NonNull android.media.tv.tuner.filter.Filter, int);
+ }
+
public abstract class FilterConfiguration {
- field public static final int FILTER_TYPE_ALP = 16; // 0x10
- field public static final int FILTER_TYPE_IP = 4; // 0x4
- field public static final int FILTER_TYPE_MMTP = 2; // 0x2
- field public static final int FILTER_TYPE_TLV = 8; // 0x8
- field public static final int FILTER_TYPE_TS = 1; // 0x1
+ method @Nullable public android.media.tv.tuner.filter.Settings getSettings();
+ method public abstract int getType();
+ field public static final int PACKET_TYPE_COMPRESSED = 2; // 0x2
+ field public static final int PACKET_TYPE_IPV4 = 0; // 0x0
+ field public static final int PACKET_TYPE_SIGNALING = 4; // 0x4
+ }
+
+ public abstract static class FilterConfiguration.Builder<T extends android.media.tv.tuner.filter.FilterConfiguration.Builder<T>> {
+ method @NonNull public T setSettings(@Nullable android.media.tv.tuner.filter.Settings);
}
public abstract class FilterEvent {
ctor public FilterEvent();
}
+ public class IpFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.IpFilterConfiguration.Builder builder(@NonNull android.content.Context);
+ method @NonNull @Size(min=4, max=16) public byte[] getDstIpAddress();
+ method public int getDstPort();
+ method @NonNull @Size(min=4, max=16) public byte[] getSrcIpAddress();
+ method public int getSrcPort();
+ method public int getType();
+ method public boolean isPassthrough();
+ }
+
+ public static class IpFilterConfiguration.Builder extends android.media.tv.tuner.filter.FilterConfiguration.Builder<android.media.tv.tuner.filter.IpFilterConfiguration.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration build();
+ method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setDstIpAddress(@NonNull byte[]);
+ method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setDstPort(int);
+ method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setPassthrough(boolean);
+ method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSrcIpAddress(@NonNull byte[]);
+ method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSrcPort(int);
+ }
+
+ public class IpPayloadEvent extends android.media.tv.tuner.filter.FilterEvent {
+ method public int getDataLength();
+ }
+
+ public class MediaEvent extends android.media.tv.tuner.filter.FilterEvent {
+ method public long getAvDataId();
+ method public long getDataLength();
+ method @Nullable public android.media.tv.tuner.filter.AudioDescriptor getExtraMetaData();
+ method public int getMpuSequenceNumber();
+ method public long getOffset();
+ method public long getPts();
+ method public int getStreamId();
+ method public boolean isPrivateData();
+ method public boolean isPtsPresent();
+ method public boolean isSecureMemory();
+ }
+
+ public class MmtpFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.MmtpFilterConfiguration.Builder builder(@NonNull android.content.Context);
+ method public int getMmtpPacketId();
+ method public int getType();
+ }
+
+ public static class MmtpFilterConfiguration.Builder extends android.media.tv.tuner.filter.FilterConfiguration.Builder<android.media.tv.tuner.filter.MmtpFilterConfiguration.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.MmtpFilterConfiguration build();
+ method @NonNull public android.media.tv.tuner.filter.MmtpFilterConfiguration.Builder setMmtpPacketId(int);
+ }
+
+ public class MmtpRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
+ method public long getDataLength();
+ method public int getScHevcIndexMask();
+ }
+
+ public class PesEvent extends android.media.tv.tuner.filter.FilterEvent {
+ method public int getDataLength();
+ method public int getMpuSequenceNumber();
+ method public int getStreamId();
+ }
+
public class PesSettings extends android.media.tv.tuner.filter.Settings {
method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.PesSettings.Builder builder(@NonNull android.content.Context, int);
method public int getStreamId();
@@ -4755,6 +5002,33 @@ package android.media.tv.tuner.filter {
method @NonNull public android.media.tv.tuner.filter.PesSettings.Builder setStreamId(int);
}
+ public class RecordSettings extends android.media.tv.tuner.filter.Settings {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.RecordSettings.Builder builder(@NonNull android.content.Context, int);
+ method public int getScIndexMask();
+ method public int getScIndexType();
+ method public int getTsIndexMask();
+ field public static final int TS_INDEX_ADAPTATION_EXTENSION_FLAG = 4096; // 0x1000
+ field public static final int TS_INDEX_CHANGE_TO_EVEN_SCRAMBLED = 8; // 0x8
+ field public static final int TS_INDEX_CHANGE_TO_NOT_SCRAMBLED = 4; // 0x4
+ field public static final int TS_INDEX_CHANGE_TO_ODD_SCRAMBLED = 16; // 0x10
+ field public static final int TS_INDEX_DISCONTINUITY_INDICATOR = 32; // 0x20
+ field public static final int TS_INDEX_FIRST_PACKET = 1; // 0x1
+ field public static final int TS_INDEX_OPCR_FLAG = 512; // 0x200
+ field public static final int TS_INDEX_PAYLOAD_UNIT_START_INDICATOR = 2; // 0x2
+ field public static final int TS_INDEX_PCR_FLAG = 256; // 0x100
+ field public static final int TS_INDEX_PRIORITY_INDICATOR = 128; // 0x80
+ field public static final int TS_INDEX_PRIVATE_DATA = 2048; // 0x800
+ field public static final int TS_INDEX_RANDOM_ACCESS_INDICATOR = 64; // 0x40
+ field public static final int TS_INDEX_SPLICING_POINT_FLAG = 1024; // 0x400
+ }
+
+ public static class RecordSettings.Builder extends android.media.tv.tuner.filter.Settings.Builder<android.media.tv.tuner.filter.RecordSettings.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.RecordSettings build();
+ method @NonNull public android.media.tv.tuner.filter.RecordSettings.Builder setScIndexMask(int);
+ method @NonNull public android.media.tv.tuner.filter.RecordSettings.Builder setScIndexType(int);
+ method @NonNull public android.media.tv.tuner.filter.RecordSettings.Builder setTsIndexMask(int);
+ }
+
public class SectionEvent extends android.media.tv.tuner.filter.FilterEvent {
method public int getDataLength();
method public int getSectionNumber();
@@ -4762,12 +5036,74 @@ package android.media.tv.tuner.filter {
method public int getVersion();
}
+ public class SectionSettings extends android.media.tv.tuner.filter.Settings {
+ }
+
+ public class SectionSettingsWithSectionBits extends android.media.tv.tuner.filter.SectionSettings {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder builder(@NonNull android.content.Context, int);
+ method @NonNull public byte[] getFilterBytes();
+ method @NonNull public byte[] getMask();
+ method @NonNull public byte[] getMode();
+ }
+
+ public static class SectionSettingsWithSectionBits.Builder extends android.media.tv.tuner.filter.Settings.Builder<android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithSectionBits build();
+ method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder setFilter(@NonNull byte[]);
+ method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder setMask(@NonNull byte[]);
+ method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder setMode(@NonNull byte[]);
+ }
+
+ public class SectionSettingsWithTableInfo extends android.media.tv.tuner.filter.SectionSettings {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.SectionSettingsWithTableInfo.Builder builder(@NonNull android.content.Context, int);
+ method public int getTableId();
+ method public int getVersion();
+ }
+
+ public static class SectionSettingsWithTableInfo.Builder extends android.media.tv.tuner.filter.Settings.Builder<android.media.tv.tuner.filter.SectionSettingsWithTableInfo.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithTableInfo build();
+ method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithTableInfo.Builder setTableId(int);
+ method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithTableInfo.Builder setVersion(int);
+ }
+
public abstract class Settings {
+ method public int getType();
+ }
+
+ public abstract static class Settings.Builder<T extends android.media.tv.tuner.filter.Settings.Builder<T>> {
+ }
+
+ public class TemiEvent extends android.media.tv.tuner.filter.FilterEvent {
+ method @NonNull public byte[] getDescriptorData();
+ method public byte getDescriptorTag();
+ method public long getPts();
+ }
+
+ public class TimeFilter implements java.lang.AutoCloseable {
+ method public int clearTimestamp();
+ method public void close();
+ method public long getSourceTime();
+ method public long getTimeStamp();
+ method public int setCurrentTimestamp(long);
+ field public static final long TIMESTAMP_UNAVAILABLE = -1L; // 0xffffffffffffffffL
+ }
+
+ public class TlvFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.TlvFilterConfiguration.Builder builder(@NonNull android.content.Context);
+ method public int getPacketType();
+ method public int getType();
+ method public boolean isCompressedIpPacket();
+ method public boolean isPassthrough();
+ }
+
+ public static class TlvFilterConfiguration.Builder extends android.media.tv.tuner.filter.FilterConfiguration.Builder<android.media.tv.tuner.filter.TlvFilterConfiguration.Builder> {
+ method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration build();
+ method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration.Builder setIsCompressedIpPacket(boolean);
+ method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration.Builder setPacketType(int);
+ method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration.Builder setPassthrough(boolean);
}
public class TsFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.filter.TsFilterConfiguration.Builder builder(@NonNull android.content.Context);
- method @Nullable public android.media.tv.tuner.filter.Settings getSettings();
method public int getTpid();
method public int getType();
}
@@ -4778,6 +5114,13 @@ package android.media.tv.tuner.filter {
method @NonNull public android.media.tv.tuner.filter.TsFilterConfiguration.Builder setTpid(int);
}
+ public class TsRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
+ method public long getDataLength();
+ method public int getPacketId();
+ method public int getScIndexMask();
+ method public int getTsIndexMask();
+ }
+
}
package android.media.tv.tuner.frontend {
@@ -4787,27 +5130,33 @@ package android.media.tv.tuner.frontend {
method public int getSifStandard();
method public int getSignalType();
method public int getType();
- field public static final int SIF_BG = 1; // 0x1
- field public static final int SIF_BG_A2 = 2; // 0x2
- field public static final int SIF_BG_NICAM = 4; // 0x4
- field public static final int SIF_DK = 16; // 0x10
- field public static final int SIF_DK1 = 32; // 0x20
- field public static final int SIF_DK2 = 64; // 0x40
- field public static final int SIF_DK3 = 128; // 0x80
- field public static final int SIF_DK_NICAM = 256; // 0x100
- field public static final int SIF_I = 8; // 0x8
- field public static final int SIF_I_NICAM = 16384; // 0x4000
- field public static final int SIF_L = 512; // 0x200
- field public static final int SIF_L_NICAM = 32768; // 0x8000
- field public static final int SIF_L_PRIME = 65536; // 0x10000
- field public static final int SIF_M = 1024; // 0x400
- field public static final int SIF_M_A2 = 4096; // 0x1000
- field public static final int SIF_M_BTSC = 2048; // 0x800
- field public static final int SIF_M_EIA_J = 8192; // 0x2000
+ field public static final int SIF_AUTO = 1; // 0x1
+ field public static final int SIF_BG = 2; // 0x2
+ field public static final int SIF_BG_A2 = 4; // 0x4
+ field public static final int SIF_BG_NICAM = 8; // 0x8
+ field public static final int SIF_DK = 32; // 0x20
+ field public static final int SIF_DK1_A2 = 64; // 0x40
+ field public static final int SIF_DK2_A2 = 128; // 0x80
+ field public static final int SIF_DK3_A2 = 256; // 0x100
+ field public static final int SIF_DK_NICAM = 512; // 0x200
+ field public static final int SIF_I = 16; // 0x10
+ field public static final int SIF_I_NICAM = 32768; // 0x8000
+ field public static final int SIF_L = 1024; // 0x400
+ field public static final int SIF_L_NICAM = 65536; // 0x10000
+ field public static final int SIF_L_PRIME = 131072; // 0x20000
+ field public static final int SIF_M = 2048; // 0x800
+ field public static final int SIF_M_A2 = 8192; // 0x2000
+ field public static final int SIF_M_BTSC = 4096; // 0x1000
+ field public static final int SIF_M_EIAJ = 16384; // 0x4000
field public static final int SIF_UNDEFINED = 0; // 0x0
- field public static final int SIGNAL_TYPE_NTSC = 4; // 0x4
- field public static final int SIGNAL_TYPE_PAL = 1; // 0x1
- field public static final int SIGNAL_TYPE_SECAM = 2; // 0x2
+ field public static final int SIGNAL_TYPE_AUTO = 1; // 0x1
+ field public static final int SIGNAL_TYPE_NTSC = 32; // 0x20
+ field public static final int SIGNAL_TYPE_NTSC_443 = 64; // 0x40
+ field public static final int SIGNAL_TYPE_PAL = 2; // 0x2
+ field public static final int SIGNAL_TYPE_PAL_60 = 16; // 0x10
+ field public static final int SIGNAL_TYPE_PAL_M = 4; // 0x4
+ field public static final int SIGNAL_TYPE_PAL_N = 8; // 0x8
+ field public static final int SIGNAL_TYPE_SECAM = 128; // 0x80
field public static final int SIGNAL_TYPE_UNDEFINED = 0; // 0x0
}
@@ -5078,6 +5427,7 @@ package android.net {
public abstract class NetworkAgent {
ctor public NetworkAgent(@NonNull android.content.Context, @NonNull android.os.Looper, @NonNull String, @NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties, int, @NonNull android.net.NetworkAgentConfig, @Nullable android.net.NetworkProvider);
+ method @Nullable public android.net.Network getNetwork();
method public void onAddKeepalivePacketFilter(int, @NonNull android.net.KeepalivePacketData);
method public void onAutomaticReconnectDisabled();
method public void onBandwidthUpdateRequested();
@@ -5088,13 +5438,17 @@ package android.net {
method public void onStartSocketKeepalive(int, int, @NonNull android.net.KeepalivePacketData);
method public void onStopSocketKeepalive(int);
method public void onValidationStatus(int, @Nullable String);
+ method @NonNull public android.net.Network register();
method public void sendLinkProperties(@NonNull android.net.LinkProperties);
method public void sendNetworkCapabilities(@NonNull android.net.NetworkCapabilities);
method public void sendNetworkScore(int);
method public void sendSocketKeepaliveEvent(int, int);
+ method public void setConnected();
+ method @Deprecated public void setLegacyExtraInfo(@Nullable String);
+ method @Deprecated public void setLegacySubtype(int, @NonNull String);
+ method public void unregister();
field public static final int VALIDATION_STATUS_NOT_VALID = 2; // 0x2
field public static final int VALIDATION_STATUS_VALID = 1; // 0x1
- field @NonNull public final android.net.Network network;
field public final int providerId;
}
@@ -6124,6 +6478,7 @@ package android.net.wifi {
method public int getMaxNumberOfClients();
method public int getShutdownTimeoutMillis();
method public boolean isClientControlByUserEnabled();
+ method @Nullable public android.net.wifi.WifiConfiguration toWifiConfiguration();
field public static final int BAND_2GHZ = 1; // 0x1
field public static final int BAND_5GHZ = 2; // 0x2
field public static final int BAND_6GHZ = 4; // 0x4
@@ -6326,7 +6681,7 @@ package android.net.wifi {
method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public android.net.wifi.SoftApConfiguration getSoftApConfiguration();
method public int getVerboseLoggingLevel();
method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void getWifiActivityEnergyInfoAsync(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.OnWifiActivityEnergyInfoListener);
- method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public android.net.wifi.WifiConfiguration getWifiApConfiguration();
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public android.net.wifi.WifiConfiguration getWifiApConfiguration();
method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public int getWifiApState();
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.WifiConfiguration> getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(@NonNull java.util.List<android.net.wifi.ScanResult>);
method public boolean isApMacRandomizationSupported();
@@ -6849,7 +7204,13 @@ package android.net.wifi.wificond {
public final class DeviceWiphyCapabilities implements android.os.Parcelable {
ctor public DeviceWiphyCapabilities();
method public int describeContents();
+ method public int getMaxNumberRxSpatialStreams();
+ method public int getMaxNumberTxSpatialStreams();
+ method public boolean isChannelWidthSupported(int);
method public boolean isWifiStandardSupported(int);
+ method public void setChannelWidthSupported(int, boolean);
+ method public void setMaxNumberRxSpatialStreams(int);
+ method public void setMaxNumberTxSpatialStreams(int);
method public void setWifiStandardSupport(int, boolean);
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.wificond.DeviceWiphyCapabilities> CREATOR;
@@ -7478,6 +7839,11 @@ package android.os {
field public static final int TUPLE_VALUE_TYPE = 7; // 0x7
}
+ public class SystemConfigManager {
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_CARRIER_APP_INFO) public java.util.Set<java.lang.String> getDisabledUntilUsedPreinstalledCarrierApps();
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_CARRIER_APP_INFO) public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
+ }
+
public class SystemProperties {
method @NonNull public static String get(@NonNull String);
method @NonNull public static String get(@NonNull String, @Nullable String);
@@ -8401,6 +8767,7 @@ package android.provider {
public static final class Telephony.SimInfo {
field public static final String ACCESS_RULES = "access_rules";
field public static final String ACCESS_RULES_FROM_CARRIER_CONFIGS = "access_rules_from_carrier_configs";
+ field public static final String ALLOWED_NETWORK_TYPES = "allowed_network_types";
field public static final String CARD_ID = "card_id";
field public static final String CARRIER_ID = "carrier_id";
field public static final String CARRIER_NAME = "carrier_name";
@@ -10742,6 +11109,7 @@ package android.telephony {
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void enableVideoCalling(boolean);
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getAidForAppType(int);
method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getAllowedNetworkTypes();
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int);
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
@@ -10827,6 +11195,7 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean resetRadioConfig();
method @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) public void resetSettings();
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setAllowedNetworkTypes(long);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setAlwaysAllowMmsData(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCarrierDataEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setCarrierRestrictionRules(@NonNull android.telephony.CarrierRestrictionRules);
@@ -11499,10 +11868,6 @@ package android.telephony.ims {
ctor public ImsException(@Nullable String);
ctor public ImsException(@Nullable String, int);
ctor public ImsException(@Nullable String, int, @Nullable Throwable);
- method public int getCode();
- field public static final int CODE_ERROR_SERVICE_UNAVAILABLE = 1; // 0x1
- field public static final int CODE_ERROR_UNSPECIFIED = 0; // 0x0
- field public static final int CODE_ERROR_UNSUPPORTED_OPERATION = 2; // 0x2
}
public final class ImsExternalCallState implements android.os.Parcelable {
@@ -11528,23 +11893,13 @@ package android.telephony.ims {
}
public class ImsMmTelManager implements android.telephony.ims.RegistrationManager {
- method @NonNull public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getFeatureState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>) throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoWiFiModeSetting();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoWiFiRoamingModeSetting();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAdvancedCallingSettingEnabled();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCapable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void isSupported(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>) throws android.telephony.ims.ImsException;
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isTtyOverVolteEnabled();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVoWiFiRoamingSettingEnabled();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVoWiFiSettingEnabled();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVtSettingEnabled();
method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException;
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerMmTelCapabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback) throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int);
@@ -11554,16 +11909,6 @@ package android.telephony.ims {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean);
method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback);
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterMmTelCapabilityCallback(@NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback);
- field public static final int WIFI_MODE_CELLULAR_PREFERRED = 1; // 0x1
- field public static final int WIFI_MODE_WIFI_ONLY = 0; // 0x0
- field public static final int WIFI_MODE_WIFI_PREFERRED = 2; // 0x2
- }
-
- public static class ImsMmTelManager.CapabilityCallback {
- ctor public ImsMmTelManager.CapabilityCallback();
- method public void onCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
}
@Deprecated public static class ImsMmTelManager.RegistrationCallback extends android.telephony.ims.RegistrationManager.RegistrationCallback {
@@ -11903,24 +12248,6 @@ package android.telephony.ims {
method @NonNull public android.telephony.ims.RcsContactUceCapability build();
}
- public interface RegistrationManager {
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
- field public static final int REGISTRATION_STATE_NOT_REGISTERED = 0; // 0x0
- field public static final int REGISTRATION_STATE_REGISTERED = 2; // 0x2
- field public static final int REGISTRATION_STATE_REGISTERING = 1; // 0x1
- }
-
- public static class RegistrationManager.RegistrationCallback {
- ctor public RegistrationManager.RegistrationCallback();
- method public void onRegistered(int);
- method public void onRegistering(int);
- method public void onTechnologyChangeFailed(int, @Nullable android.telephony.ims.ImsReasonInfo);
- method public void onUnregistered(@Nullable android.telephony.ims.ImsReasonInfo);
- }
-
}
package android.telephony.ims.feature {
@@ -11983,7 +12310,7 @@ package android.telephony.ims.feature {
method public void onFeatureReady();
method public void onFeatureRemoved();
method public boolean queryCapabilityConfiguration(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
- method public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus();
+ method @NonNull public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus();
method public void setUiTtyMode(int, @Nullable android.os.Message);
method @android.telephony.ims.feature.MmTelFeature.ProcessCallResult public int shouldProcessCall(@NonNull String[]);
field public static final String EXTRA_IS_UNKNOWN_CALL = "android.telephony.ims.feature.extra.IS_UNKNOWN_CALL";
@@ -11999,10 +12326,6 @@ package android.telephony.ims.feature {
method public final void addCapabilities(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
method public final boolean isCapable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
method public final void removeCapabilities(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
- field public static final int CAPABILITY_TYPE_SMS = 8; // 0x8
- field public static final int CAPABILITY_TYPE_UT = 4; // 0x4
- field public static final int CAPABILITY_TYPE_VIDEO = 2; // 0x2
- field public static final int CAPABILITY_TYPE_VOICE = 1; // 0x1
}
@IntDef(flag=true, value={android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_SMS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface MmTelFeature.MmTelCapabilities.MmTelCapability {
diff --git a/api/test-current.txt b/api/test-current.txt
index 190f9fe8b69a..b1003d61495e 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -70,6 +70,7 @@ package android.app {
method public long getTotalRam();
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int);
method public static boolean isHighEndGfx();
+ method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[], @NonNull String);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public static void resumeAppSwitches() throws android.os.RemoteException;
method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int);
@@ -1119,6 +1120,7 @@ package android.hardware.display {
method @RequiresPermission(android.Manifest.permission.BRIGHTNESS_SLIDER_USAGE) public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
method @Nullable @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
method public android.graphics.Point getStableDisplaySize();
+ method public boolean isMinimalPostProcessingRequested(int);
method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
}
@@ -2179,6 +2181,11 @@ package android.os {
method public void log(android.os.StrictMode.ViolationInfo);
}
+ public class SystemConfigManager {
+ method @NonNull @RequiresPermission("android.permission.READ_CARRIER_APP_INFO") public java.util.Set<java.lang.String> getDisabledUntilUsedPreinstalledCarrierApps();
+ method @NonNull @RequiresPermission("android.permission.READ_CARRIER_APP_INFO") public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
+ }
+
public class SystemProperties {
method @NonNull public static String get(@NonNull String);
method @NonNull public static String get(@NonNull String, @Nullable String);
@@ -3513,10 +3520,6 @@ package android.telephony.ims {
ctor public ImsException(@Nullable String);
ctor public ImsException(@Nullable String, int);
ctor public ImsException(@Nullable String, int, @Nullable Throwable);
- method public int getCode();
- field public static final int CODE_ERROR_SERVICE_UNAVAILABLE = 1; // 0x1
- field public static final int CODE_ERROR_UNSPECIFIED = 0; // 0x0
- field public static final int CODE_ERROR_UNSUPPORTED_OPERATION = 2; // 0x2
}
public final class ImsExternalCallState implements android.os.Parcelable {
@@ -3542,23 +3545,13 @@ package android.telephony.ims {
}
public class ImsMmTelManager implements android.telephony.ims.RegistrationManager {
- method @NonNull public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int);
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getFeatureState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>) throws android.telephony.ims.ImsException;
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public int getVoWiFiModeSetting();
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public int getVoWiFiRoamingModeSetting();
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isAdvancedCallingSettingEnabled();
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isAvailable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isCapable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void isSupported(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>) throws android.telephony.ims.ImsException;
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isTtyOverVolteEnabled();
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isVoWiFiRoamingSettingEnabled();
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isVoWiFiSettingEnabled();
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isVtSettingEnabled();
method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException;
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerMmTelCapabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback) throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int);
@@ -3568,16 +3561,6 @@ package android.telephony.ims {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean);
method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback);
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterMmTelCapabilityCallback(@NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback);
- field public static final int WIFI_MODE_CELLULAR_PREFERRED = 1; // 0x1
- field public static final int WIFI_MODE_WIFI_ONLY = 0; // 0x0
- field public static final int WIFI_MODE_WIFI_PREFERRED = 2; // 0x2
- }
-
- public static class ImsMmTelManager.CapabilityCallback {
- ctor public ImsMmTelManager.CapabilityCallback();
- method public void onCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
}
@Deprecated public static class ImsMmTelManager.RegistrationCallback extends android.telephony.ims.RegistrationManager.RegistrationCallback {
@@ -3865,24 +3848,6 @@ package android.telephony.ims {
method public void onProvisioningStringChanged(int, @NonNull String);
}
- public interface RegistrationManager {
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
- field public static final int REGISTRATION_STATE_NOT_REGISTERED = 0; // 0x0
- field public static final int REGISTRATION_STATE_REGISTERED = 2; // 0x2
- field public static final int REGISTRATION_STATE_REGISTERING = 1; // 0x1
- }
-
- public static class RegistrationManager.RegistrationCallback {
- ctor public RegistrationManager.RegistrationCallback();
- method public void onRegistered(int);
- method public void onRegistering(int);
- method public void onTechnologyChangeFailed(int, @Nullable android.telephony.ims.ImsReasonInfo);
- method public void onUnregistered(@Nullable android.telephony.ims.ImsReasonInfo);
- }
-
}
package android.telephony.ims.feature {
@@ -3945,7 +3910,7 @@ package android.telephony.ims.feature {
method public void onFeatureReady();
method public void onFeatureRemoved();
method public boolean queryCapabilityConfiguration(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
- method public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus();
+ method @NonNull public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus();
method public void setUiTtyMode(int, @Nullable android.os.Message);
method @android.telephony.ims.feature.MmTelFeature.ProcessCallResult public int shouldProcessCall(@NonNull String[]);
field public static final String EXTRA_IS_UNKNOWN_CALL = "android.telephony.ims.feature.extra.IS_UNKNOWN_CALL";
@@ -3961,10 +3926,6 @@ package android.telephony.ims.feature {
method public final void addCapabilities(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
method public final boolean isCapable(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
method public final void removeCapabilities(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int);
- field public static final int CAPABILITY_TYPE_SMS = 8; // 0x8
- field public static final int CAPABILITY_TYPE_UT = 4; // 0x4
- field public static final int CAPABILITY_TYPE_VIDEO = 2; // 0x2
- field public static final int CAPABILITY_TYPE_VOICE = 1; // 0x1
}
@IntDef(flag=true, value={android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT, android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_SMS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface MmTelFeature.MmTelCapabilities.MmTelCapability {
@@ -4495,7 +4456,7 @@ package android.view {
field public static final int ACCESSIBILITY_TITLE_CHANGED = 33554432; // 0x2000000
field public static final int PRIVATE_FLAG_NO_MOVE_ANIMATION = 64; // 0x40
field public CharSequence accessibilityTitle;
- field @android.view.ViewDebug.ExportedProperty(flagMapping={@android.view.ViewDebug.FlagToString(mask=0x1, equals=0x1, name="FAKE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x2, equals=0x2, name="FORCE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x4, equals=0x4, name="WANTS_OFFSET_NOTIFICATIONS"), @android.view.ViewDebug.FlagToString(mask=0x10, equals=0x10, name="SHOW_FOR_ALL_USERS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, equals=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, name="NO_MOVE_ANIMATION"), @android.view.ViewDebug.FlagToString(mask=0x80, equals=0x80, name="COMPATIBLE_WINDOW"), @android.view.ViewDebug.FlagToString(mask=0x100, equals=0x100, name="SYSTEM_ERROR"), @android.view.ViewDebug.FlagToString(mask=0x400, equals=0x400, name="KEYGUARD"), @android.view.ViewDebug.FlagToString(mask=0x800, equals=0x800, name="DISABLE_WALLPAPER_TOUCH_EVENTS"), @android.view.ViewDebug.FlagToString(mask=0x1000, equals=0x1000, name="FORCE_STATUS_BAR_VISIBLE_TRANSPARENT"), @android.view.ViewDebug.FlagToString(mask=0x2000, equals=0x2000, name="PRESERVE_GEOMETRY"), @android.view.ViewDebug.FlagToString(mask=0x4000, equals=0x4000, name="FORCE_DECOR_VIEW_VISIBILITY"), @android.view.ViewDebug.FlagToString(mask=0x8000, equals=0x8000, name="WILL_NOT_REPLACE_ON_RELAUNCH"), @android.view.ViewDebug.FlagToString(mask=0x10000, equals=0x10000, name="LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME"), @android.view.ViewDebug.FlagToString(mask=0x20000, equals=0x20000, name="FORCE_DRAW_STATUS_BAR_BACKGROUND"), @android.view.ViewDebug.FlagToString(mask=0x40000, equals=0x40000, name="SUSTAINED_PERFORMANCE_MODE"), @android.view.ViewDebug.FlagToString(mask=0x80000, equals=0x80000, name="HIDE_NON_SYSTEM_OVERLAY_WINDOWS"), @android.view.ViewDebug.FlagToString(mask=0x100000, equals=0x100000, name="IS_ROUNDED_CORNERS_OVERLAY"), @android.view.ViewDebug.FlagToString(mask=0x400000, equals=0x400000, name="IS_SCREEN_DECOR"), @android.view.ViewDebug.FlagToString(mask=0x800000, equals=0x800000, name="STATUS_FORCE_SHOW_NAVIGATION"), @android.view.ViewDebug.FlagToString(mask=0x1000000, equals=0x1000000, name="COLOR_SPACE_AGNOSTIC"), @android.view.ViewDebug.FlagToString(mask=0x4000000, equals=0x4000000, name="FIT_INSETS_CONTROLLED"), @android.view.ViewDebug.FlagToString(mask=0x8000000, equals=0x8000000, name="ONLY_DRAW_BOTTOM_BAR_BACKGROUND")}) public int privateFlags;
+ field @android.view.ViewDebug.ExportedProperty(flagMapping={@android.view.ViewDebug.FlagToString(mask=0x1, equals=0x1, name="FAKE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x2, equals=0x2, name="FORCE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x4, equals=0x4, name="WANTS_OFFSET_NOTIFICATIONS"), @android.view.ViewDebug.FlagToString(mask=0x10, equals=0x10, name="SHOW_FOR_ALL_USERS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, equals=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, name="NO_MOVE_ANIMATION"), @android.view.ViewDebug.FlagToString(mask=0x80, equals=0x80, name="COMPATIBLE_WINDOW"), @android.view.ViewDebug.FlagToString(mask=0x100, equals=0x100, name="SYSTEM_ERROR"), @android.view.ViewDebug.FlagToString(mask=0x800, equals=0x800, name="DISABLE_WALLPAPER_TOUCH_EVENTS"), @android.view.ViewDebug.FlagToString(mask=0x1000, equals=0x1000, name="FORCE_STATUS_BAR_VISIBLE"), @android.view.ViewDebug.FlagToString(mask=0x2000, equals=0x2000, name="PRESERVE_GEOMETRY"), @android.view.ViewDebug.FlagToString(mask=0x4000, equals=0x4000, name="FORCE_DECOR_VIEW_VISIBILITY"), @android.view.ViewDebug.FlagToString(mask=0x8000, equals=0x8000, name="WILL_NOT_REPLACE_ON_RELAUNCH"), @android.view.ViewDebug.FlagToString(mask=0x10000, equals=0x10000, name="LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME"), @android.view.ViewDebug.FlagToString(mask=0x20000, equals=0x20000, name="FORCE_DRAW_STATUS_BAR_BACKGROUND"), @android.view.ViewDebug.FlagToString(mask=0x40000, equals=0x40000, name="SUSTAINED_PERFORMANCE_MODE"), @android.view.ViewDebug.FlagToString(mask=0x80000, equals=0x80000, name="HIDE_NON_SYSTEM_OVERLAY_WINDOWS"), @android.view.ViewDebug.FlagToString(mask=0x100000, equals=0x100000, name="IS_ROUNDED_CORNERS_OVERLAY"), @android.view.ViewDebug.FlagToString(mask=0x400000, equals=0x400000, name="IS_SCREEN_DECOR"), @android.view.ViewDebug.FlagToString(mask=0x800000, equals=0x800000, name="STATUS_FORCE_SHOW_NAVIGATION"), @android.view.ViewDebug.FlagToString(mask=0x1000000, equals=0x1000000, name="COLOR_SPACE_AGNOSTIC"), @android.view.ViewDebug.FlagToString(mask=0x4000000, equals=0x4000000, name="FIT_INSETS_CONTROLLED"), @android.view.ViewDebug.FlagToString(mask=0x8000000, equals=0x8000000, name="ONLY_DRAW_BOTTOM_BAR_BACKGROUND")}) public int privateFlags;
}
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 8753b986f2df..67a59f1975d5 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -4532,6 +4532,30 @@ public class ActivityManager {
}
/**
+ * Kill the given PIDs, but the killing will be delayed until the device is idle
+ * and the given process is imperceptible.
+ *
+ * <p>You must hold the permission
+ * {@link android.Manifest.permission#FORCE_STOP_PACKAGES} to be able to
+ * call this method.
+ * </p>
+ *
+ * @param pids The list of the pids to be killed
+ * @pram reason The reason of the kill
+ *
+ * @hide
+ */
+ @SystemApi @TestApi
+ @RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES)
+ public void killProcessesWhenImperceptible(@NonNull int[] pids, @NonNull String reason) {
+ try {
+ getService().killProcessesWhenImperceptible(pids, reason);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* The AppTask allows you to manage your own application's tasks.
* See {@link android.app.ActivityManager#getAppTasks()}
*/
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 126cc5a6f5c4..7d04ca0afe7e 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -631,4 +631,10 @@ interface IActivityManager {
*/
ParceledListSlice<ApplicationExitInfo> getHistoricalProcessExitReasons(String packageName,
int pid, int maxNum, int userId);
+
+ /*
+ * Kill the given PIDs, but the killing will be delayed until the device is idle
+ * and the given process is imperceptible.
+ */
+ void killProcessesWhenImperceptible(in int[] pids, String reason);
}
diff --git a/core/java/android/app/SharedPreferencesImpl.java b/core/java/android/app/SharedPreferencesImpl.java
index abb0cfc73f35..3df164822f32 100644
--- a/core/java/android/app/SharedPreferencesImpl.java
+++ b/core/java/android/app/SharedPreferencesImpl.java
@@ -66,8 +66,9 @@ final class SharedPreferencesImpl implements SharedPreferences {
/**
* There will now be a callback to {@link
- * OnSharedPreferenceChangeListener#onSharedPreferenceChanged(SharedPreferences, String)} with
- * a {@code null} key on {@link Editor#clear()}.
+ * android.content.SharedPreferences.OnSharedPreferenceChangeListener#onSharedPreferenceChanged
+ * OnSharedPreferenceChangeListener.onSharedPreferenceChanged} with a {@code null} key on
+ * {@link android.content.SharedPreferences.Editor#clear Editor.clear}.
*/
@ChangeId
@EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q)
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 7b21f12e04f1..c1e535643ddf 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -148,6 +148,7 @@ import android.os.RecoverySystem;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
+import android.os.SystemConfigManager;
import android.os.SystemUpdateManager;
import android.os.SystemVibrator;
import android.os.UserHandle;
@@ -627,6 +628,13 @@ public final class SystemServiceRegistry {
return new SystemUpdateManager(service);
}});
+ registerService(Context.SYSTEM_CONFIG_SERVICE, SystemConfigManager.class,
+ new CachedServiceFetcher<SystemConfigManager>() {
+ @Override
+ public SystemConfigManager createService(ContextImpl ctx) {
+ return new SystemConfigManager();
+ }});
+
registerService(Context.TELEPHONY_REGISTRY_SERVICE, TelephonyRegistryManager.class,
new CachedServiceFetcher<TelephonyRegistryManager>() {
@Override
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 54a64ef3f392..56fb50dad5ef 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -11468,6 +11468,7 @@ public class DevicePolicyManager {
* @throws SecurityException if {@code admin} is not a device owner.
*/
public void setProtectedPackages(@NonNull ComponentName admin, @NonNull List<String> packages) {
+ throwIfParentInstance("setProtectedPackages");
if (mService != null) {
try {
mService.setProtectedPackages(admin, packages);
@@ -11484,6 +11485,7 @@ public class DevicePolicyManager {
* @throws SecurityException if {@code admin} is not a device owner.
*/
public @NonNull List<String> getProtectedPackages(@NonNull ComponentName admin) {
+ throwIfParentInstance("getProtectedPackages");
if (mService != null) {
try {
return mService.getProtectedPackages(admin);
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 3df94a7e233a..2943e398dd87 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -5020,6 +5020,14 @@ public abstract class Context {
/**
* Use with {@link #getSystemService(String)} to retrieve an
+ * {@link android.os.SystemConfigManager}.
+ * @hide
+ */
+ @SystemApi
+ public static final String SYSTEM_CONFIG_SERVICE = "system_config";
+
+ /**
+ * Use with {@link #getSystemService(String)} to retrieve an
* {@link android.telephony.ims.RcsMessageManager}.
* @hide
*/
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index e5daaca4aa52..622588b63fef 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -290,6 +290,15 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
public int colorMode = COLOR_MODE_DEFAULT;
/**
+ * Value for {@link #preferMinimalPostProcessing} indicating that by default
+ * minimal post processing is not preferred.
+ *
+ * @see android.R.attr#preferMinimalPostProcessing
+ * @hide
+ */
+ public static final boolean MINIMAL_POST_PROCESSING_DEFAULT = false;
+
+ /**
* Indicates whether the activity wants the connected display to do minimal post processing on
* the produced image or video frames. This will only be requested if this activity's main
* window is visible on the screen.
@@ -315,7 +324,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
* @see android.view.WindowManager.LayoutParams#preferMinimalPostProcessing
* @see android.view.Display#isMinimalPostProcessingSupported
*/
- public boolean preferMinimalPostProcessing = false;
+ public boolean preferMinimalPostProcessing = MINIMAL_POST_PROCESSING_DEFAULT;
/**
* Bit in {@link #flags} indicating whether this activity is able to
diff --git a/core/java/android/content/pm/IPackageInstallerSession.aidl b/core/java/android/content/pm/IPackageInstallerSession.aidl
index e9546353d5f3..e86bb250c033 100644
--- a/core/java/android/content/pm/IPackageInstallerSession.aidl
+++ b/core/java/android/content/pm/IPackageInstallerSession.aidl
@@ -36,7 +36,7 @@ interface IPackageInstallerSession {
void close();
void commit(in IntentSender statusReceiver, boolean forTransferred);
- void transfer(in String packageName, in IntentSender statusReceiver);
+ void transfer(in String packageName);
void abandon();
void addFile(String name, long lengthBytes, in byte[] metadata);
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 7a280221eb08..3c6f602e93e1 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -29,8 +29,6 @@ import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.compat.annotation.UnsupportedAppUsage;
-import android.content.IIntentReceiver;
-import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager.DeleteFlags;
@@ -38,11 +36,9 @@ import android.content.pm.PackageManager.InstallReason;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
-import android.os.Bundle;
import android.os.FileBridge;
import android.os.Handler;
import android.os.HandlerExecutor;
-import android.os.IBinder;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
@@ -71,8 +67,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;
@@ -182,9 +176,8 @@ public class PackageInstaller {
* {@link #STATUS_PENDING_USER_ACTION}, {@link #STATUS_SUCCESS},
* {@link #STATUS_FAILURE}, {@link #STATUS_FAILURE_ABORTED},
* {@link #STATUS_FAILURE_BLOCKED}, {@link #STATUS_FAILURE_CONFLICT},
- * {@link #STATUS_FAILURE_INCOMPATIBLE}, {@link #STATUS_FAILURE_INVALID},
- * {@link #STATUS_FAILURE_STORAGE}, {@link #STATUS_FAILURE_NAME_NOT_FOUND},
- * {@link #STATUS_FAILURE_ILLEGAL_STATE} or {@link #STATUS_FAILURE_SECURITY}.
+ * {@link #STATUS_FAILURE_INCOMPATIBLE}, {@link #STATUS_FAILURE_INVALID}, or
+ * {@link #STATUS_FAILURE_STORAGE}.
* <p>
* More information about a status may be available through additional
* extras; see the individual status documentation for details.
@@ -332,34 +325,6 @@ public class PackageInstaller {
*/
public static final int STATUS_FAILURE_INCOMPATIBLE = 7;
- /**
- * The transfer failed because a target package can't be found. For example
- * transferring a session to a non-existing package.
- * <p>
- * The result may also contain {@link #EXTRA_OTHER_PACKAGE_NAME} with the
- * missing package.
- *
- * @see #EXTRA_STATUS_MESSAGE
- * @see #EXTRA_OTHER_PACKAGE_NAME
- */
- public static final int STATUS_FAILURE_NAME_NOT_FOUND = 8;
-
- /**
- * The transfer failed because a session is in invalid state. For example
- * transferring an already committed session.
- *
- * @see #EXTRA_STATUS_MESSAGE
- */
- public static final int STATUS_FAILURE_ILLEGAL_STATE = 9;
-
- /**
- * The transfer failed for security reasons. For example transferring
- * to a package which does not have INSTALL_PACKAGES permission.
- *
- * @see #EXTRA_STATUS_MESSAGE
- */
- public static final int STATUS_FAILURE_SECURITY = 10;
-
private final IPackageInstaller mInstaller;
private final int mUserId;
private final String mInstallerPackageName;
@@ -1143,8 +1108,7 @@ public class PackageInstaller {
}
/**
- * Attempt to commit a session that has been {@link #transfer(String, IntentSender)
- * transferred}.
+ * Attempt to commit a session that has been {@link #transfer(String) transferred}.
*
* <p>If the device reboots before the session has been finalized, you may commit the
* session again.
@@ -1185,14 +1149,6 @@ public class PackageInstaller {
*
* @param packageName The package of the new owner. Needs to hold the INSTALL_PACKAGES
* permission.
- * @param statusReceiver Called when the state of the session changes. Intents sent to
- * this receiver contain {@link #EXTRA_STATUS}. Possible statuses:
- * {@link #STATUS_FAILURE_NAME_NOT_FOUND},
- * {@link #STATUS_FAILURE_ILLEGAL_STATE},
- * {@link #STATUS_FAILURE_SECURITY},
- * {@link #STATUS_FAILURE}.
- * Refer to the individual transfer status codes on how to handle
- * them.
*
* @throws PackageManager.NameNotFoundException if the new owner could not be found.
* @throws SecurityException if called after the session has been committed or abandoned.
@@ -1200,13 +1156,12 @@ public class PackageInstaller {
* @throws SecurityException if streams opened through
* {@link #openWrite(String, long, long) are still open.
*/
- public void transfer(@NonNull String packageName, @NonNull IntentSender statusReceiver)
+ public void transfer(@NonNull String packageName)
throws PackageManager.NameNotFoundException {
- Objects.requireNonNull(statusReceiver);
Objects.requireNonNull(packageName);
try {
- mSession.transfer(packageName, statusReceiver);
+ mSession.transfer(packageName);
} catch (ParcelableException e) {
e.maybeRethrow(PackageManager.NameNotFoundException.class);
throw new RuntimeException(e);
@@ -1216,64 +1171,6 @@ public class PackageInstaller {
}
/**
- * Transfer the session to a new owner.
- * This is a convenience blocking wrapper around {@link #transfer(String, IntentSender)}.
- * Converts all statuses into exceptions.
- *
- * @param packageName The package of the new owner. Needs to hold the INSTALL_PACKAGES
- * permission.
- *
- * @throws PackageManager.NameNotFoundException if the new owner could not be found.
- * @throws SecurityException if called after the session has been committed or abandoned.
- * @throws SecurityException if the session does not update the original installer
- * @throws SecurityException if streams opened through
- * {@link #openWrite(String, long, long) are still open.
- */
- public void transfer(@NonNull String packageName)
- throws PackageManager.NameNotFoundException {
- Objects.requireNonNull(packageName);
-
- CompletableFuture<Intent> intentFuture = new CompletableFuture<Intent>();
- try {
- IIntentSender localSender = new IIntentSender.Stub() {
- @Override
- public void send(int code, Intent intent, String resolvedType,
- IBinder whitelistToken,
- IIntentReceiver finishedReceiver, String requiredPermission,
- Bundle options) {
- intentFuture.complete(intent);
- }
- };
- transfer(packageName, new IntentSender(localSender));
- } catch (ParcelableException e) {
- e.maybeRethrow(PackageManager.NameNotFoundException.class);
- throw new RuntimeException(e);
- }
-
- try {
- Intent intent = intentFuture.get();
- final int status = intent.getIntExtra(EXTRA_STATUS, Integer.MIN_VALUE);
- final String statusMessage = intent.getStringExtra(EXTRA_STATUS_MESSAGE);
- switch (status) {
- case STATUS_SUCCESS:
- break;
- case STATUS_FAILURE_NAME_NOT_FOUND:
- throw new PackageManager.NameNotFoundException(statusMessage);
- case STATUS_FAILURE_ILLEGAL_STATE:
- throw new IllegalStateException(statusMessage);
- case STATUS_FAILURE_SECURITY:
- throw new SecurityException(statusMessage);
- default:
- throw new RuntimeException(statusMessage);
- }
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- } catch (ExecutionException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
* Release this session object. You can open the session again if it
* hasn't been finalized.
*/
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 87acbc146f49..fd4c26569873 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -59,7 +59,6 @@ import android.content.pm.PackageParserCacheHelper.ReadHelper;
import android.content.pm.PackageParserCacheHelper.WriteHelper;
import android.content.pm.parsing.AndroidPackage;
import android.content.pm.parsing.ApkParseUtils;
-import android.content.pm.parsing.ComponentParseUtils;
import android.content.pm.parsing.PackageImpl;
import android.content.pm.parsing.PackageInfoUtils;
import android.content.pm.parsing.ParsedPackage;
@@ -4350,6 +4349,7 @@ public class PackageParser {
a.info.directBootAware = false;
a.info.rotationAnimation = ROTATION_ANIMATION_UNSPECIFIED;
a.info.colorMode = ActivityInfo.COLOR_MODE_DEFAULT;
+ a.info.preferMinimalPostProcessing = ActivityInfo.MINIMAL_POST_PROCESSING_DEFAULT;
if (hardwareAccelerated) {
a.info.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED;
}
@@ -4564,6 +4564,10 @@ public class PackageParser {
a.info.colorMode = sa.getInt(R.styleable.AndroidManifestActivity_colorMode,
ActivityInfo.COLOR_MODE_DEFAULT);
+ a.info.preferMinimalPostProcessing = sa.getBoolean(
+ R.styleable.AndroidManifestActivity_preferMinimalPostProcessing,
+ ActivityInfo.MINIMAL_POST_PROCESSING_DEFAULT);
+
if (sa.getBoolean(R.styleable.AndroidManifestActivity_showWhenLocked, false)) {
a.info.flags |= ActivityInfo.FLAG_SHOW_WHEN_LOCKED;
}
diff --git a/core/java/android/content/pm/parsing/ApkParseUtils.java b/core/java/android/content/pm/parsing/ApkParseUtils.java
index 38d3137200c6..9b069acd1b06 100644
--- a/core/java/android/content/pm/parsing/ApkParseUtils.java
+++ b/core/java/android/content/pm/parsing/ApkParseUtils.java
@@ -2640,6 +2640,7 @@ public class ApkParseUtils {
activity.directBootAware = false;
activity.rotationAnimation = ROTATION_ANIMATION_UNSPECIFIED;
activity.colorMode = ActivityInfo.COLOR_MODE_DEFAULT;
+ activity.preferMinimalPostProcessing = ActivityInfo.MINIMAL_POST_PROCESSING_DEFAULT;
if (hardwareAccelerated) {
activity.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED;
}
diff --git a/core/java/android/content/pm/parsing/ComponentParseUtils.java b/core/java/android/content/pm/parsing/ComponentParseUtils.java
index 56ace5ecfa18..3846202aa04d 100644
--- a/core/java/android/content/pm/parsing/ComponentParseUtils.java
+++ b/core/java/android/content/pm/parsing/ComponentParseUtils.java
@@ -553,6 +553,7 @@ public class ComponentParseUtils {
public String requestedVrComponent;
public int rotationAnimation = -1;
public int colorMode;
+ public boolean preferMinimalPostProcessing;
public int order;
public ActivityInfo.WindowLayout windowLayout;
@@ -640,6 +641,7 @@ public class ComponentParseUtils {
dest.writeString(this.requestedVrComponent);
dest.writeInt(this.rotationAnimation);
dest.writeInt(this.colorMode);
+ dest.writeBoolean(this.preferMinimalPostProcessing);
dest.writeInt(this.order);
dest.writeBundle(this.metaData);
@@ -685,6 +687,7 @@ public class ComponentParseUtils {
this.requestedVrComponent = in.readString();
this.rotationAnimation = in.readInt();
this.colorMode = in.readInt();
+ this.preferMinimalPostProcessing = in.readByte() != 0;
this.order = in.readInt();
this.metaData = in.readBundle();
if (in.readInt() == 1) {
@@ -1645,6 +1648,10 @@ public class ComponentParseUtils {
result.colorMode = sa.getInt(R.styleable.AndroidManifestActivity_colorMode,
ActivityInfo.COLOR_MODE_DEFAULT);
+ result.preferMinimalPostProcessing = sa.getBoolean(
+ R.styleable.AndroidManifestActivity_preferMinimalPostProcessing,
+ ActivityInfo.MINIMAL_POST_PROCESSING_DEFAULT);
+
if (sa.getBoolean(R.styleable.AndroidManifestActivity_showWhenLocked, false)) {
result.flags |= ActivityInfo.FLAG_SHOW_WHEN_LOCKED;
}
diff --git a/core/java/android/content/pm/parsing/PackageInfoUtils.java b/core/java/android/content/pm/parsing/PackageInfoUtils.java
index 73a8d2a7dc0f..e0ba99bb4937 100644
--- a/core/java/android/content/pm/parsing/PackageInfoUtils.java
+++ b/core/java/android/content/pm/parsing/PackageInfoUtils.java
@@ -345,6 +345,7 @@ public class PackageInfoUtils {
ai.requestedVrComponent = a.requestedVrComponent;
ai.rotationAnimation = a.rotationAnimation;
ai.colorMode = a.colorMode;
+ ai.preferMinimalPostProcessing = a.preferMinimalPostProcessing;
ai.windowLayout = a.windowLayout;
ai.metaData = a.metaData;
ai.applicationInfo = applicationInfo;
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index fb5f136f2fca..d67de09dd2a4 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -749,6 +749,17 @@ public final class DisplayManager {
return mGlobal.getDefaultBrightnessConfiguration();
}
+
+ /**
+ * Gets the last requested minimal post processing setting for the display with displayId.
+ *
+ * @hide
+ */
+ @TestApi
+ public boolean isMinimalPostProcessingRequested(int displayId) {
+ return mGlobal.isMinimalPostProcessingRequested(displayId);
+ }
+
/**
* Temporarily sets the brightness of the display.
* <p>
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 2a584951887f..fd539e8f1c91 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -594,6 +594,19 @@ public final class DisplayManagerGlobal {
}
/**
+ * Gets the last requested minimal post processing setting for the display with displayId.
+ *
+ * @hide
+ */
+ public boolean isMinimalPostProcessingRequested(int displayId) {
+ try {
+ return mDm.isMinimalPostProcessingRequested(displayId);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Temporarily sets the brightness of the display.
* <p>
* Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} permission.
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index 0143c9129b50..ccf221b693bc 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -111,6 +111,9 @@ interface IDisplayManager {
// Gets the default brightness configuration if configured.
BrightnessConfiguration getDefaultBrightnessConfiguration();
+ // Gets the last requested minimal post processing settings for display with displayId.
+ boolean isMinimalPostProcessingRequested(int displayId);
+
// Temporarily sets the display brightness.
void setTemporaryBrightness(int brightness);
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index 61a1484cef0d..7cc78f7389c2 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -33,6 +33,7 @@ import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
import java.util.ArrayList;
+import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -50,20 +51,29 @@ public abstract class NetworkAgent {
/**
* The {@link Network} corresponding to this object.
*/
- @NonNull
- public final Network network;
+ @Nullable
+ private volatile Network mNetwork;
+
+ // Whether this NetworkAgent is using the legacy (never unhidden) API. The difference is
+ // that the legacy API uses NetworkInfo to convey the state, while the current API is
+ // exposing methods to manage it and generate it internally instead.
+ // TODO : remove this as soon as all agents have been converted.
+ private final boolean mIsLegacy;
private final Handler mHandler;
private volatile AsyncChannel mAsyncChannel;
private final String LOG_TAG;
private static final boolean DBG = true;
private static final boolean VDBG = false;
- private final Context mContext;
private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>();
private volatile long mLastBwRefreshTime = 0;
private static final long BW_REFRESH_MIN_WIN_MS = 500;
private boolean mBandwidthUpdateScheduled = false;
private AtomicBoolean mBandwidthUpdatePending = new AtomicBoolean(false);
+ // Not used by legacy agents. Non-legacy agents use this to convert the NetworkAgent system API
+ // into the internal API of ConnectivityService.
+ @NonNull
+ private NetworkInfo mNetworkInfo;
/**
* The ID of the {@link NetworkProvider} that created this object, or
@@ -266,25 +276,29 @@ public abstract class NetworkAgent {
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score) {
this(looper, context, logTag, ni, nc, lp, score, null, NetworkProvider.ID_NONE);
+ // Register done by the constructor called in the previous line
}
/** @hide TODO: remove and replace usage with the public constructor. */
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config) {
this(looper, context, logTag, ni, nc, lp, score, config, NetworkProvider.ID_NONE);
+ // Register done by the constructor called in the previous line
}
/** @hide TODO: remove and replace usage with the public constructor. */
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, int providerId) {
this(looper, context, logTag, ni, nc, lp, score, null, providerId);
+ // Register done by the constructor called in the previous line
}
/** @hide TODO: remove and replace usage with the public constructor. */
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config,
int providerId) {
- this(looper, context, logTag, nc, lp, score, config, providerId, ni);
+ this(looper, context, logTag, nc, lp, score, config, providerId, ni, true /* legacy */);
+ register();
}
private static NetworkInfo getLegacyNetworkInfo(final NetworkAgentConfig config) {
@@ -310,26 +324,44 @@ public abstract class NetworkAgent {
@NonNull NetworkAgentConfig config, @Nullable NetworkProvider provider) {
this(looper, context, logTag, nc, lp, score, config,
provider == null ? NetworkProvider.ID_NONE : provider.getProviderId(),
- getLegacyNetworkInfo(config));
+ getLegacyNetworkInfo(config), false /* legacy */);
+ }
+
+ private static class InitialConfiguration {
+ public final Context context;
+ public final NetworkCapabilities capabilities;
+ public final LinkProperties properties;
+ public final int score;
+ public final NetworkAgentConfig config;
+ public final NetworkInfo info;
+ InitialConfiguration(@NonNull Context context, @NonNull NetworkCapabilities capabilities,
+ @NonNull LinkProperties properties, int score, @NonNull NetworkAgentConfig config,
+ @NonNull NetworkInfo info) {
+ this.context = context;
+ this.capabilities = capabilities;
+ this.properties = properties;
+ this.score = score;
+ this.config = config;
+ this.info = info;
+ }
}
+ private volatile InitialConfiguration mInitialConfiguration;
- private NetworkAgent(Looper looper, Context context, String logTag, NetworkCapabilities nc,
- LinkProperties lp, int score, NetworkAgentConfig config, int providerId,
- NetworkInfo ni) {
+ private NetworkAgent(@NonNull Looper looper, @NonNull Context context, @NonNull String logTag,
+ @NonNull NetworkCapabilities nc, @NonNull LinkProperties lp, int score,
+ @NonNull NetworkAgentConfig config, int providerId, @NonNull NetworkInfo ni,
+ boolean legacy) {
mHandler = new NetworkAgentHandler(looper);
LOG_TAG = logTag;
- mContext = context;
+ mIsLegacy = legacy;
+ mNetworkInfo = new NetworkInfo(ni);
this.providerId = providerId;
if (ni == null || nc == null || lp == null) {
throw new IllegalArgumentException();
}
- if (VDBG) log("Registering NetworkAgent");
- ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
- Context.CONNECTIVITY_SERVICE);
- network = cm.registerNetworkAgent(new Messenger(mHandler), new NetworkInfo(ni),
- new LinkProperties(lp), new NetworkCapabilities(nc), score, config,
- providerId);
+ mInitialConfiguration = new InitialConfiguration(context, new NetworkCapabilities(nc),
+ new LinkProperties(lp), score, config, ni);
}
private class NetworkAgentHandler extends Handler {
@@ -451,6 +483,32 @@ public abstract class NetworkAgent {
}
}
+ /**
+ * Register this network agent with ConnectivityService.
+ * @return the Network associated with this network agent (which can also be obtained later
+ * by calling getNetwork() on this agent).
+ */
+ @NonNull
+ public Network register() {
+ if (VDBG) log("Registering NetworkAgent");
+ final ConnectivityManager cm = (ConnectivityManager) mInitialConfiguration.context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ mNetwork = cm.registerNetworkAgent(new Messenger(mHandler),
+ new NetworkInfo(mInitialConfiguration.info),
+ mInitialConfiguration.properties, mInitialConfiguration.capabilities,
+ mInitialConfiguration.score, mInitialConfiguration.config, providerId);
+ mInitialConfiguration = null; // All this memory can now be GC'd
+ return mNetwork;
+ }
+
+ /**
+ * @return The Network associated with this agent, or null if it's not registered yet.
+ */
+ @Nullable
+ public Network getNetwork() {
+ return mNetwork;
+ }
+
private void queueOrSendMessage(int what, Object obj) {
queueOrSendMessage(what, 0, 0, obj);
}
@@ -483,15 +541,89 @@ public abstract class NetworkAgent {
* @param linkProperties the new LinkProperties.
*/
public void sendLinkProperties(@NonNull LinkProperties linkProperties) {
+ Objects.requireNonNull(linkProperties);
queueOrSendMessage(EVENT_NETWORK_PROPERTIES_CHANGED, new LinkProperties(linkProperties));
}
/**
+ * Inform ConnectivityService that this agent has now connected.
+ */
+ public void setConnected() {
+ if (mIsLegacy) {
+ throw new UnsupportedOperationException(
+ "Legacy agents can't call setConnected.");
+ }
+ mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null);
+ queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo);
+ }
+
+ /**
+ * Unregister this network agent.
+ *
+ * This signals the network has disconnected and ends its lifecycle. After this is called,
+ * the network is torn down and this agent can no longer be used.
+ */
+ public void unregister() {
+ if (mIsLegacy) {
+ throw new UnsupportedOperationException(
+ "Legacy agents can't call unregister.");
+ }
+ mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null);
+ queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo);
+ }
+
+ /**
+ * Change the legacy subtype of this network agent.
+ *
+ * This is only for backward compatibility and should not be used by non-legacy network agents,
+ * or agents that did not use to set a subtype. As such, only TYPE_MOBILE type agents can use
+ * this and others will be thrown an exception if they try.
+ *
+ * @deprecated this is for backward compatibility only.
+ * @param legacySubtype the legacy subtype.
+ */
+ @Deprecated
+ public void setLegacySubtype(final int legacySubtype, @NonNull final String legacySubtypeName) {
+ if (mIsLegacy) {
+ throw new UnsupportedOperationException("Legacy agents can't call setLegacySubtype.");
+ }
+ mNetworkInfo.setSubtype(legacySubtype, legacySubtypeName);
+ queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo);
+ }
+
+ /**
+ * Set the ExtraInfo of this network agent.
+ *
+ * This sets the ExtraInfo field inside the NetworkInfo returned by legacy public API and the
+ * broadcasts about the corresponding Network.
+ * This is only for backward compatibility and should not be used by non-legacy network agents,
+ * who will be thrown an exception if they try. The extra info should only be :
+ * <ul>
+ * <li>For cellular agents, the APN name.</li>
+ * <li>For ethernet agents, the interface name.</li>
+ * </ul>
+ *
+ * @deprecated this is for backward compatibility only.
+ * @param extraInfo the ExtraInfo.
+ */
+ @Deprecated
+ public void setLegacyExtraInfo(@Nullable final String extraInfo) {
+ if (mIsLegacy) {
+ throw new UnsupportedOperationException("Legacy agents can't call setLegacyExtraInfo.");
+ }
+ mNetworkInfo.setExtraInfo(extraInfo);
+ queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo);
+ }
+
+ /**
* Must be called by the agent when it has a new NetworkInfo object.
* @hide TODO: expose something better.
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public void sendNetworkInfo(NetworkInfo networkInfo) {
+ if (!mIsLegacy) {
+ throw new UnsupportedOperationException("Only legacy agents can call sendNetworkInfo.");
+ }
queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, new NetworkInfo(networkInfo));
}
@@ -500,6 +632,7 @@ public abstract class NetworkAgent {
* @param networkCapabilities the new NetworkCapabilities.
*/
public void sendNetworkCapabilities(@NonNull NetworkCapabilities networkCapabilities) {
+ Objects.requireNonNull(networkCapabilities);
mBandwidthUpdatePending.set(false);
mLastBwRefreshTime = System.currentTimeMillis();
queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED,
diff --git a/core/java/android/net/NetworkAgentConfig.java b/core/java/android/net/NetworkAgentConfig.java
index 1e5af673b860..2c5a113a93da 100644
--- a/core/java/android/net/NetworkAgentConfig.java
+++ b/core/java/android/net/NetworkAgentConfig.java
@@ -24,8 +24,7 @@ import android.os.Parcelable;
/**
* Allows a network transport to provide the system with policy and configuration information about
- * a particular network when registering a {@link NetworkAgent}.
- * @note This information cannot change once the agent is registered.
+ * a particular network when registering a {@link NetworkAgent}. This information cannot change once the agent is registered.
*
* @hide
*/
diff --git a/core/java/android/os/ISystemConfig.aidl b/core/java/android/os/ISystemConfig.aidl
new file mode 100644
index 000000000000..d3b029854112
--- /dev/null
+++ b/core/java/android/os/ISystemConfig.aidl
@@ -0,0 +1,33 @@
+/*
+ * 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.os;
+
+/**
+ * Binder interface to query SystemConfig in the system server.
+ * {@hide}
+ */
+interface ISystemConfig {
+ /**
+ * @see SystemConfigManager#getDisabledUntilUsedPreinstalledCarrierApps
+ */
+ List<String> getDisabledUntilUsedPreinstalledCarrierApps();
+
+ /**
+ * @see SystemConfigManager#getDisabledUntilUsedPreinstalledCarrierAssociatedApps
+ */
+ Map getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
+}
diff --git a/core/java/android/os/SystemConfigManager.java b/core/java/android/os/SystemConfigManager.java
new file mode 100644
index 000000000000..3a9ce2fa85f1
--- /dev/null
+++ b/core/java/android/os/SystemConfigManager.java
@@ -0,0 +1,91 @@
+/*
+ * 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.os;
+
+import android.Manifest;
+import android.annotation.NonNull;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
+import android.annotation.SystemService;
+import android.annotation.TestApi;
+import android.content.Context;
+import android.util.ArraySet;
+import android.util.Log;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Allows apps outside the system process to access various bits of configuration defined in
+ * /etc/sysconfig and its counterparts on OEM and vendor partitions.
+ *
+ * TODO: Intended for access by system mainline modules only. Marking as SystemApi until the
+ * module-only API surface is available.
+ * @hide
+ */
+@SystemApi
+@TestApi
+@SystemService(Context.SYSTEM_CONFIG_SERVICE)
+public class SystemConfigManager {
+ private static final String TAG = SystemConfigManager.class.getSimpleName();
+
+ private final ISystemConfig mInterface;
+
+ /** @hide **/
+ public SystemConfigManager() {
+ mInterface = ISystemConfig.Stub.asInterface(
+ ServiceManager.getService(Context.SYSTEM_CONFIG_SERVICE));
+ }
+
+ /**
+ * Returns a set of package names for carrier apps that are preinstalled on the device but
+ * should be disabled until the matching carrier's SIM is inserted into the device.
+ * @return A set of package names.
+ */
+ @RequiresPermission(Manifest.permission.READ_CARRIER_APP_INFO)
+ public @NonNull Set<String> getDisabledUntilUsedPreinstalledCarrierApps() {
+ try {
+ List<String> apps = mInterface.getDisabledUntilUsedPreinstalledCarrierApps();
+ return new ArraySet<>(apps);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Caught remote exception");
+ return Collections.emptySet();
+ }
+ }
+
+ /**
+ * Returns a map that describes helper apps associated with carrier apps that, like the apps
+ * returned by {@link #getDisabledUntilUsedPreinstalledCarrierApps()}, should be disabled until
+ * the correct SIM is inserted into the device.
+ * @return A map with keys corresponding to package names returned by
+ * {@link #getDisabledUntilUsedPreinstalledCarrierApps()} and values as lists of package
+ * names of helper apps.
+ */
+ @RequiresPermission(Manifest.permission.READ_CARRIER_APP_INFO)
+ public @NonNull Map<String, List<String>>
+ getDisabledUntilUsedPreinstalledCarrierAssociatedApps() {
+ try {
+ return (Map<String, List<String>>)
+ mInterface.getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Caught remote exception");
+ return Collections.emptyMap();
+ }
+ }
+}
diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl
index 92fecaddff22..bbc936d76e1c 100644
--- a/core/java/android/os/storage/IStorageManager.aidl
+++ b/core/java/android/os/storage/IStorageManager.aidl
@@ -193,4 +193,5 @@ interface IStorageManager {
void startCheckpoint(int numTries) = 85;
boolean needsCheckpoint() = 86;
void abortChanges(in String message, boolean retry) = 87;
+ void clearUserKeyAuth(int userId, int serialNumber, in byte[] token, in byte[] secret) = 88;
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 0e3dd3a8292a..eee8fb13d3a6 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -7488,6 +7488,21 @@ public final class Settings {
public static final String INCALL_POWER_BUTTON_BEHAVIOR = "incall_power_button_behavior";
/**
+ * Whether the user allows minimal post processing or not.
+ *
+ * <p>Values:
+ * 0 - Not allowed. Any preferences set through the Window.setPreferMinimalPostProcessing
+ * API will be ignored.
+ * 1 - Allowed. Any preferences set through the Window.setPreferMinimalPostProcessing API
+ * will be respected and the appropriate signals will be sent to display.
+ * (Default behaviour)
+ *
+ * @hide
+ */
+ public static final String MINIMAL_POST_PROCESSING_ALLOWED =
+ "minimal_post_processing_allowed";
+
+ /**
* INCALL_POWER_BUTTON_BEHAVIOR value for "turn off screen".
* @hide
*/
@@ -7598,6 +7613,12 @@ public final class Settings {
public static final String DOZE_WAKE_DISPLAY_GESTURE = "doze_wake_display_gesture";
/**
+ * Whether the device should suppress the current doze configuration and disable dozing.
+ * @hide
+ */
+ public static final String SUPPRESS_DOZE = "suppress_doze";
+
+ /**
* Gesture that skips media.
* @hide
*/
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index f3690648f35b..453728137d9a 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -5374,5 +5374,11 @@ public final class Telephony {
/** Whether uicc applications is set to be enabled or disabled. By default it's enabled. */
public static final String UICC_APPLICATIONS_ENABLED = "uicc_applications_enabled";
+
+ /**
+ * TelephonyProvider column name for allowed network types. Indicate which network types
+ * are allowed. Default is -1.
+ */
+ public static final String ALLOWED_NETWORK_TYPES = "allowed_network_types";
}
}
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 939ae878816a..dc0f5623e5e3 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -559,8 +559,8 @@ public final class FillResponse implements Parcelable {
}
/**
- * Sets targets with the resources IDs of the child view of
- * {@link RemoteViews Presentation Template} which will cancel the session when clicked.
+ * Sets target resource IDs of the child view in {@link RemoteViews Presentation Template}
+ * which will cancel the session when clicked.
* Those targets will be respectively applied to a child of the header, footer and
* each {@link Dataset}.
*
@@ -571,7 +571,7 @@ public final class FillResponse implements Parcelable {
* @throws IllegalStateException if {@link #build()} was already called.
*/
@NonNull
- public Builder setCancelTargetIds(@Nullable int[] ids) {
+ public Builder setPresentationCancelIds(@Nullable int[] ids) {
throwIfDestroyed();
mCancelIds = ids;
return this;
@@ -769,7 +769,7 @@ public final class FillResponse implements Parcelable {
}
builder.setFlags(parcel.readInt());
final int[] cancelIds = parcel.createIntArray();
- builder.setCancelTargetIds(cancelIds);
+ builder.setPresentationCancelIds(cancelIds);
final FillResponse response = builder.build();
response.setRequestId(parcel.readInt());
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index 7d455c93729c..b9868a7e1444 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -624,6 +624,8 @@ public final class DisplayInfo implements Parcelable {
sb.append(Arrays.toString(supportedColorModes));
sb.append(", hdrCapabilities ");
sb.append(hdrCapabilities);
+ sb.append(", minimalPostProcessingSupported ");
+ sb.append(minimalPostProcessingSupported);
sb.append(", rotation ");
sb.append(rotation);
sb.append(", density ");
diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java
index 69d01050801f..f5afd106a4a7 100644
--- a/core/java/android/view/InsetsAnimationControlImpl.java
+++ b/core/java/android/view/InsetsAnimationControlImpl.java
@@ -239,7 +239,8 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
return state.calculateInsets(frame, false /* isScreenRound */,
false /* alwaysConsumeSystemBars */, null /* displayCutout */,
null /* legacyContentInsets */, null /* legacyStableInsets */,
- LayoutParams.SOFT_INPUT_ADJUST_RESIZE /* legacySoftInputMode*/, typeSideMap)
+ LayoutParams.SOFT_INPUT_ADJUST_RESIZE /* legacySoftInputMode*/,
+ 0 /* legacySystemUiFlags */, typeSideMap)
.getInsets(mTypes);
}
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index e2739c469e5f..db89d9588507 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -28,7 +28,6 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.graphics.Insets;
import android.graphics.Rect;
-import android.net.InvalidPacketException.ErrorCode;
import android.os.RemoteException;
import android.util.ArraySet;
import android.util.Log;
@@ -148,13 +147,18 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
}
}
- private class DefaultAnimationControlListener implements WindowInsetsAnimationControlListener {
+ /**
+ * The default implementation of listener, to be used by InsetsController and InsetsPolicy to
+ * animate insets.
+ */
+ public static class InternalAnimationControlListener
+ implements WindowInsetsAnimationControlListener {
private WindowInsetsAnimationController mController;
private ObjectAnimator mAnimator;
- private boolean mShow;
+ protected boolean mShow;
- DefaultAnimationControlListener(boolean show) {
+ InternalAnimationControlListener(boolean show) {
mShow = show;
}
@@ -178,9 +182,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
onAnimationFinish();
}
});
- mStartingAnimation = true;
+ setStartingAnimation(true);
mAnimator.start();
- mStartingAnimation = false;
+ setStartingAnimation(false);
}
@Override
@@ -191,16 +195,19 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
}
}
- private void onAnimationFinish() {
+ protected void setStartingAnimation(boolean startingAnimation) {
+ }
+
+ protected void onAnimationFinish() {
mController.finish(mShow);
}
- private float getRawProgress() {
+ protected float getRawProgress() {
float fraction = (float) mAnimator.getCurrentPlayTime() / mAnimator.getDuration();
return mShow ? fraction : 1 - fraction;
}
- private long getDurationMs() {
+ protected long getDurationMs() {
if (mAnimator != null) {
return mAnimator.getDuration();
}
@@ -222,6 +229,17 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
final @AnimationType int type;
}
+ private class DefaultAnimationControlListener extends InternalAnimationControlListener {
+ DefaultAnimationControlListener(boolean show) {
+ super(show);
+ }
+
+ @Override
+ protected void setStartingAnimation(boolean startingAnimation) {
+ mStartingAnimation = startingAnimation;
+ }
+ }
+
private final String TAG = "InsetsControllerImpl";
private final InsetsState mState = new InsetsState();
@@ -246,6 +264,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
private int mPendingTypesToShow;
private int mLastLegacySoftInputMode;
+ private int mLastLegacySystemUiFlags;
private boolean mStartingAnimation;
private SyncRtSurfaceTransactionApplier mApplier;
@@ -274,7 +293,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
WindowInsets insets = state.calculateInsets(mFrame, mLastInsets.isRound(),
mLastInsets.shouldAlwaysConsumeSystemBars(), mLastInsets.getDisplayCutout(),
mLastLegacyContentInsets, mLastLegacyStableInsets, mLastLegacySoftInputMode,
- null /* typeSideMap */);
+ mLastLegacySystemUiFlags, null /* typeSideMap */);
mViewRoot.mView.dispatchWindowInsetsAnimationProgress(insets);
for (int i = mTmpFinishedControls.size() - 1; i >= 0; i--) {
@@ -317,12 +336,13 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
@VisibleForTesting
public WindowInsets calculateInsets(boolean isScreenRound,
boolean alwaysConsumeSystemBars, DisplayCutout cutout, Rect legacyContentInsets,
- Rect legacyStableInsets, int legacySoftInputMode) {
+ Rect legacyStableInsets, int legacySoftInputMode, int legacySystemUiFlags) {
mLastLegacyContentInsets.set(legacyContentInsets);
mLastLegacyStableInsets.set(legacyStableInsets);
mLastLegacySoftInputMode = legacySoftInputMode;
+ mLastLegacySystemUiFlags = legacySystemUiFlags;
mLastInsets = mState.calculateInsets(mFrame, isScreenRound, alwaysConsumeSystemBars, cutout,
- legacyContentInsets, legacyStableInsets, legacySoftInputMode,
+ legacyContentInsets, legacyStableInsets, legacySoftInputMode, legacySystemUiFlags,
null /* typeSideMap */);
return mLastInsets;
}
@@ -623,6 +643,14 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
}
/**
+ * @see ViewRootImpl#updateCompatSysUiVisibility(int, boolean, boolean)
+ */
+ public void updateCompatSysUiVisibility(@InternalInsetsType int type, boolean visible,
+ boolean hasControl) {
+ mViewRoot.updateCompatSysUiVisibility(type, visible, hasControl);
+ }
+
+ /**
* Called when current window gains focus.
*/
public void onWindowFocusGained() {
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java
index 8a1b45a3a411..35a82b8bfd54 100644
--- a/core/java/android/view/InsetsSourceConsumer.java
+++ b/core/java/android/view/InsetsSourceConsumer.java
@@ -123,12 +123,19 @@ public class InsetsSourceConsumer {
}
boolean applyLocalVisibilityOverride() {
+ final boolean isVisible = mState.getSource(mType).isVisible();
+ final boolean hasControl = mSourceControl != null;
+
+ // We still need to let the legacy app know the visibility change even if we don't have the
+ // control.
+ mController.updateCompatSysUiVisibility(
+ mType, hasControl ? mRequestedVisible : isVisible, hasControl);
// If we don't have control, we are not able to change the visibility.
- if (mSourceControl == null) {
+ if (!hasControl) {
return false;
}
- if (mState.getSource(mType).isVisible() == mRequestedVisible) {
+ if (isVisible == mRequestedVisible) {
return false;
}
mState.getSource(mType).setVisible(mRequestedVisible);
diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java
index e33ca70c222e..bd19799bb664 100644
--- a/core/java/android/view/InsetsState.java
+++ b/core/java/android/view/InsetsState.java
@@ -16,6 +16,7 @@
package android.view;
+import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
import static android.view.ViewRootImpl.NEW_INSETS_MODE_IME;
import static android.view.ViewRootImpl.NEW_INSETS_MODE_NONE;
@@ -143,7 +144,8 @@ public class InsetsState implements Parcelable {
public WindowInsets calculateInsets(Rect frame, boolean isScreenRound,
boolean alwaysConsumeSystemBars, DisplayCutout cutout,
@Nullable Rect legacyContentInsets, @Nullable Rect legacyStableInsets,
- int legacySoftInputMode, @Nullable @InternalInsetsSide SparseIntArray typeSideMap) {
+ int legacySoftInputMode, int legacySystemUiFlags,
+ @Nullable @InternalInsetsSide SparseIntArray typeSideMap) {
Insets[] typeInsetsMap = new Insets[Type.SIZE];
Insets[] typeMaxInsetsMap = new Insets[Type.SIZE];
boolean[] typeVisibilityMap = new boolean[SIZE];
@@ -186,7 +188,9 @@ public class InsetsState implements Parcelable {
return new WindowInsets(typeInsetsMap, typeMaxInsetsMap, typeVisibilityMap, isScreenRound,
alwaysConsumeSystemBars, cutout, softInputAdjustMode == SOFT_INPUT_ADJUST_RESIZE
? systemBars() | ime()
- : systemBars());
+ : systemBars(),
+ sNewInsetsMode == NEW_INSETS_MODE_FULL
+ && (legacySystemUiFlags & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0);
}
public Rect calculateVisibleInsets(Rect frame, Rect legacyVisibleInsets,
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 17b945b71773..32622233d81e 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -18,6 +18,8 @@ package android.view;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
+import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
+import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.View.PFLAG_DRAW_ANIMATION;
import static android.view.View.SYSTEM_UI_FLAG_FULLSCREEN;
import static android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
@@ -105,6 +107,7 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.TimeUtils;
import android.util.TypedValue;
+import android.view.InsetsState.InternalInsetsType;
import android.view.Surface.OutOfResourcesException;
import android.view.SurfaceControl.Transaction;
import android.view.View.AttachInfo;
@@ -417,6 +420,7 @@ public final class ViewRootImpl implements ViewParent,
@UnsupportedAppUsage
final View.AttachInfo mAttachInfo;
+ final SystemUiVisibilityInfo mCompatibleVisibilityInfo;
InputQueue.Callback mInputQueueCallback;
InputQueue mInputQueue;
@UnsupportedAppUsage
@@ -674,6 +678,7 @@ public final class ViewRootImpl implements ViewParent,
mAdded = false;
mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this,
context);
+ mCompatibleVisibilityInfo = new SystemUiVisibilityInfo();
mAccessibilityManager = AccessibilityManager.getInstance(context);
mAccessibilityManager.addAccessibilityStateChangeListener(
mAccessibilityInteractionConnectionManager, mHandler);
@@ -1862,6 +1867,9 @@ public final class ViewRootImpl implements ViewParent,
mAttachInfo.mSystemUiVisibility &= ~mAttachInfo.mDisabledSystemUiVisibility;
WindowManager.LayoutParams params = mWindowAttributes;
mAttachInfo.mSystemUiVisibility |= getImpliedSystemUiVisibility(params);
+ mCompatibleVisibilityInfo.globalVisibility =
+ (mCompatibleVisibilityInfo.globalVisibility & ~View.SYSTEM_UI_FLAG_LOW_PROFILE)
+ | (mAttachInfo.mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE);
if (mAttachInfo.mKeepScreenOn != oldScreenOn
|| mAttachInfo.mSystemUiVisibility != params.subtreeSystemUiVisibility
|| mAttachInfo.mHasSystemUiListeners != params.hasSystemUiListeners) {
@@ -1887,6 +1895,38 @@ public final class ViewRootImpl implements ViewParent,
return vis;
}
+ /**
+ * Update the compatible system UI visibility for dispatching it to the legacy app.
+ *
+ * @param type Indicates which type of the insets source we are handling.
+ * @param visible True if the insets source is visible.
+ * @param hasControl True if we can control the insets source.
+ */
+ void updateCompatSysUiVisibility(@InternalInsetsType int type, boolean visible,
+ boolean hasControl) {
+ if ((type != ITYPE_STATUS_BAR && type != ITYPE_NAVIGATION_BAR)
+ || ViewRootImpl.sNewInsetsMode != ViewRootImpl.NEW_INSETS_MODE_FULL) {
+ return;
+ }
+ final SystemUiVisibilityInfo info = mCompatibleVisibilityInfo;
+ final int systemUiFlag = type == ITYPE_STATUS_BAR
+ ? View.SYSTEM_UI_FLAG_FULLSCREEN
+ : View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+ final boolean wasVisible = (info.globalVisibility & systemUiFlag) == 0;
+ if (visible) {
+ info.globalVisibility &= ~systemUiFlag;
+ if (!wasVisible && hasControl) {
+ // The local system UI visibility can only be cleared while we have the control.
+ info.localChanges |= systemUiFlag;
+ }
+ } else {
+ info.globalVisibility |= systemUiFlag;
+ }
+ if (mAttachInfo.mGlobalSystemUiVisibility != info.globalVisibility) {
+ scheduleTraversals();
+ }
+ }
+
@VisibleForTesting
public static void adjustLayoutParamsForCompatibility(WindowManager.LayoutParams inOutParams) {
if (sNewInsetsMode != NEW_INSETS_MODE_FULL) {
@@ -2082,7 +2122,9 @@ public final class ViewRootImpl implements ViewParent,
mLastWindowInsets = mInsetsController.calculateInsets(
mContext.getResources().getConfiguration().isScreenRound(),
mAttachInfo.mAlwaysConsumeSystemBars, displayCutout,
- contentInsets, stableInsets, mWindowAttributes.softInputMode);
+ contentInsets, stableInsets, mWindowAttributes.softInputMode,
+ (mWindowAttributes.systemUiVisibility
+ | mWindowAttributes.subtreeSystemUiVisibility));
}
return mLastWindowInsets;
}
@@ -2303,6 +2345,11 @@ public final class ViewRootImpl implements ViewParent,
mAttachInfo.mForceReportNewAttributes = false;
params = lp;
}
+ if (sNewInsetsMode == NEW_INSETS_MODE_FULL) {
+ adjustLayoutParamsForCompatibility(lp);
+ controlInsetsForCompatibility(lp);
+ handleDispatchSystemUiVisibilityChanged(mCompatibleVisibilityInfo);
+ }
if (mFirst || mAttachInfo.mViewVisibilityChanged) {
mAttachInfo.mViewVisibilityChanged = false;
@@ -2396,8 +2443,6 @@ public final class ViewRootImpl implements ViewParent,
&& !PixelFormat.formatHasAlpha(params.format)) {
params.format = PixelFormat.TRANSLUCENT;
}
- adjustLayoutParamsForCompatibility(params);
- controlInsetsForCompatibility(params);
}
if (mFirst || windowShouldResize || insetsChanged ||
@@ -7096,7 +7141,7 @@ public final class ViewRootImpl implements ViewParent,
}
public void handleDispatchSystemUiVisibilityChanged(SystemUiVisibilityInfo args) {
- if (mSeq != args.seq) {
+ if (mSeq != args.seq && sNewInsetsMode != NEW_INSETS_MODE_FULL) {
// The sequence has changed, so we need to update our value and make
// sure to do a traversal afterward so the window manager is given our
// most recent data.
@@ -7107,6 +7152,7 @@ public final class ViewRootImpl implements ViewParent,
if (mView == null) return;
if (args.localChanges != 0) {
mView.updateLocalSystemUiVisibility(args.localValue, args.localChanges);
+ args.localChanges = 0;
}
int visibility = args.globalVisibility&View.SYSTEM_UI_CLEARABLE_FLAGS;
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java
index 9291b5652425..06c24b0fa3f3 100644
--- a/core/java/android/view/WindowInsets.java
+++ b/core/java/android/view/WindowInsets.java
@@ -27,6 +27,7 @@ import static android.view.WindowInsets.Type.STATUS_BARS;
import static android.view.WindowInsets.Type.SYSTEM_GESTURES;
import static android.view.WindowInsets.Type.TAPPABLE_ELEMENT;
import static android.view.WindowInsets.Type.all;
+import static android.view.WindowInsets.Type.ime;
import static android.view.WindowInsets.Type.indexOf;
import static android.view.WindowInsets.Type.systemBars;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
@@ -46,6 +47,7 @@ import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethod;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
@@ -91,6 +93,7 @@ public final class WindowInsets {
private final boolean mDisplayCutoutConsumed;
private final int mCompatInsetTypes;
+ private final boolean mCompatIgnoreVisibility;
/**
* Since new insets may be added in the future that existing apps couldn't
@@ -117,7 +120,8 @@ public final class WindowInsets {
boolean isRound, boolean alwaysConsumeSystemBars, DisplayCutout displayCutout) {
this(createCompatTypeMap(systemWindowInsetsRect), createCompatTypeMap(stableInsetsRect),
createCompatVisibilityMap(createCompatTypeMap(systemWindowInsetsRect)),
- isRound, alwaysConsumeSystemBars, displayCutout, systemBars());
+ isRound, alwaysConsumeSystemBars, displayCutout, systemBars(),
+ false /* compatIgnoreVisibility */);
}
/**
@@ -136,7 +140,8 @@ public final class WindowInsets {
@Nullable Insets[] typeMaxInsetsMap,
boolean[] typeVisibilityMap,
boolean isRound,
- boolean alwaysConsumeSystemBars, DisplayCutout displayCutout, int compatInsetTypes) {
+ boolean alwaysConsumeSystemBars, DisplayCutout displayCutout, int compatInsetTypes,
+ boolean compatIgnoreVisibility) {
mSystemWindowInsetsConsumed = typeInsetsMap == null;
mTypeInsetsMap = mSystemWindowInsetsConsumed
? new Insets[SIZE]
@@ -151,6 +156,7 @@ public final class WindowInsets {
mIsRound = isRound;
mAlwaysConsumeSystemBars = alwaysConsumeSystemBars;
mCompatInsetTypes = compatInsetTypes;
+ mCompatIgnoreVisibility = compatIgnoreVisibility;
mDisplayCutoutConsumed = displayCutout == null;
mDisplayCutout = (mDisplayCutoutConsumed || displayCutout.isEmpty())
@@ -167,7 +173,8 @@ public final class WindowInsets {
src.mStableInsetsConsumed ? null : src.mTypeMaxInsetsMap,
src.mTypeVisibilityMap, src.mIsRound,
src.mAlwaysConsumeSystemBars, displayCutoutCopyConstructorArgument(src),
- src.mCompatInsetTypes);
+ src.mCompatInsetTypes,
+ src.mCompatIgnoreVisibility);
}
private static DisplayCutout displayCutoutCopyConstructorArgument(WindowInsets w) {
@@ -219,7 +226,7 @@ public final class WindowInsets {
@UnsupportedAppUsage
public WindowInsets(Rect systemWindowInsets) {
this(createCompatTypeMap(systemWindowInsets), null, new boolean[SIZE], false, false, null,
- systemBars());
+ systemBars(), false /* compatIgnoreVisibility */);
}
/**
@@ -239,7 +246,8 @@ public final class WindowInsets {
/**
* @hide
*/
- static void assignCompatInsets(Insets[] typeInsetsMap, Rect insets) {
+ @VisibleForTesting
+ public static void assignCompatInsets(Insets[] typeInsetsMap, Rect insets) {
typeInsetsMap[indexOf(STATUS_BARS)] = Insets.of(0, insets.top, 0, 0);
typeInsetsMap[indexOf(NAVIGATION_BARS)] =
Insets.of(insets.left, 0, insets.right, insets.bottom);
@@ -288,7 +296,15 @@ public final class WindowInsets {
*/
@NonNull
public Insets getSystemWindowInsets() {
- return getInsets(mTypeInsetsMap, mCompatInsetTypes);
+ Insets result = mCompatIgnoreVisibility
+ ? getMaxInsets(mCompatInsetTypes & ~ime())
+ : getInsets(mCompatInsetTypes);
+
+ // We can't query max insets for IME, so we need to add it manually after.
+ if ((mCompatInsetTypes & ime()) != 0 && mCompatIgnoreVisibility) {
+ result = Insets.max(result, getInsets(ime()));
+ }
+ return result;
}
/**
@@ -448,7 +464,7 @@ public final class WindowInsets {
mTypeVisibilityMap,
mIsRound, mAlwaysConsumeSystemBars,
null /* displayCutout */,
- mCompatInsetTypes);
+ mCompatInsetTypes, mCompatIgnoreVisibility);
}
@@ -491,11 +507,11 @@ public final class WindowInsets {
*/
@NonNull
public WindowInsets consumeSystemWindowInsets() {
- return new WindowInsets(null, mStableInsetsConsumed ? null : mTypeMaxInsetsMap,
+ return new WindowInsets(null, null,
mTypeVisibilityMap,
mIsRound, mAlwaysConsumeSystemBars,
displayCutoutCopyConstructorArgument(this),
- mCompatInsetTypes);
+ mCompatInsetTypes, mCompatIgnoreVisibility);
}
// TODO(b/119190588): replace @code with @link below
@@ -741,10 +757,7 @@ public final class WindowInsets {
*/
@NonNull
public WindowInsets consumeStableInsets() {
- return new WindowInsets(mSystemWindowInsetsConsumed ? null : mTypeInsetsMap, null,
- mTypeVisibilityMap, mIsRound, mAlwaysConsumeSystemBars,
- displayCutoutCopyConstructorArgument(this),
- mCompatInsetTypes);
+ return consumeSystemWindowInsets();
}
/**
@@ -829,7 +842,7 @@ public final class WindowInsets {
: mDisplayCutout == null
? DisplayCutout.NO_CUTOUT
: mDisplayCutout.inset(left, top, right, bottom),
- mCompatInsetTypes);
+ mCompatInsetTypes, mCompatIgnoreVisibility);
}
@Override
@@ -1147,7 +1160,7 @@ public final class WindowInsets {
return new WindowInsets(mSystemInsetsConsumed ? null : mTypeInsetsMap,
mStableInsetsConsumed ? null : mTypeMaxInsetsMap, mTypeVisibilityMap,
mIsRound, mAlwaysConsumeSystemBars, mDisplayCutout,
- systemBars());
+ systemBars(), false /* compatIgnoreVisibility */);
}
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index f7d9706a9fce..290a13d3feb1 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1131,6 +1131,15 @@ public interface WindowManager extends ViewManager {
public static final int TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 39;
/**
+ * Window type: the notification shade and keyguard. There can be only one status bar
+ * window; it is placed at the top of the screen, and all other
+ * windows are shifted down so they are below it.
+ * In multiuser systems shows on all users' windows.
+ * @hide
+ */
+ public static final int TYPE_NOTIFICATION_SHADE = FIRST_SYSTEM_WINDOW + 40;
+
+ /**
* End of types of system windows.
*/
public static final int LAST_SYSTEM_WINDOW = 2999;
@@ -1732,14 +1741,6 @@ public interface WindowManager extends ViewManager {
public static final int PRIVATE_FLAG_SYSTEM_ERROR = 0x00000100;
/**
- * Flag whether the current window is a keyguard window, meaning that it will hide all other
- * windows behind it except for windows with flag {@link #FLAG_SHOW_WHEN_LOCKED} set.
- * Further, this can only be set by {@link LayoutParams#TYPE_STATUS_BAR}.
- * {@hide}
- */
- public static final int PRIVATE_FLAG_KEYGUARD = 0x00000400;
-
- /**
* Flag that prevents the wallpaper behind the current window from receiving touch events.
*
* {@hide}
@@ -1748,12 +1749,12 @@ public interface WindowManager extends ViewManager {
/**
* Flag to force the status bar window to be visible all the time. If the bar is hidden when
- * this flag is set it will be shown again and the bar will have a transparent background.
+ * this flag is set it will be shown again.
* This can only be set by {@link LayoutParams#TYPE_STATUS_BAR}.
*
* {@hide}
*/
- public static final int PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT = 0x00001000;
+ public static final int PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR = 0x00001000;
/**
* Flag indicating that the x, y, width, and height members should be
@@ -1917,17 +1918,13 @@ public interface WindowManager extends ViewManager {
equals = PRIVATE_FLAG_SYSTEM_ERROR,
name = "SYSTEM_ERROR"),
@ViewDebug.FlagToString(
- mask = PRIVATE_FLAG_KEYGUARD,
- equals = PRIVATE_FLAG_KEYGUARD,
- name = "KEYGUARD"),
- @ViewDebug.FlagToString(
mask = PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS,
equals = PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS,
name = "DISABLE_WALLPAPER_TOUCH_EVENTS"),
@ViewDebug.FlagToString(
- mask = PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT,
- equals = PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT,
- name = "FORCE_STATUS_BAR_VISIBLE_TRANSPARENT"),
+ mask = PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR,
+ equals = PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR,
+ name = "FORCE_STATUS_BAR_VISIBLE"),
@ViewDebug.FlagToString(
mask = PRIVATE_FLAG_PRESERVE_GEOMETRY,
equals = PRIVATE_FLAG_PRESERVE_GEOMETRY,
@@ -2402,7 +2399,8 @@ public interface WindowManager extends ViewManager {
flag = true,
value = {LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER})
+ LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER,
+ LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS})
@interface LayoutInDisplayCutoutMode {}
/**
@@ -2414,6 +2412,7 @@ public interface WindowManager extends ViewManager {
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
+ * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
* @see DisplayCutout
* @see android.R.attr#windowLayoutInDisplayCutoutMode
* android:windowLayoutInDisplayCutoutMode
@@ -2447,13 +2446,6 @@ public interface WindowManager extends ViewManager {
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
/**
- * @deprecated use {@link #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES}
- * @hide
- */
- @Deprecated
- public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS = 1;
-
- /**
* The window is always allowed to extend into the {@link DisplayCutout} areas on the short
* edges of the screen.
*
@@ -2516,6 +2508,25 @@ public interface WindowManager extends ViewManager {
*/
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;
+ /**
+ * The window is always allowed to extend into the {@link DisplayCutout} areas on the all
+ * edges of the screen.
+ *
+ * <p>
+ * The window must make sure that no important content overlaps with the
+ * {@link DisplayCutout}.
+ *
+ * <p>
+ * In this mode, the window extends under cutouts on the all edges of the display in both
+ * portrait and landscape, regardless of whether the window is hiding the system bars.
+ *
+ * @see DisplayCutout
+ * @see WindowInsets#getDisplayCutout()
+ * @see #layoutInDisplayCutoutMode
+ * @see android.R.attr#windowLayoutInDisplayCutoutMode
+ * android:windowLayoutInDisplayCutoutMode
+ */
+ public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS = 3;
/**
* When this window has focus, disable touch pad pointer gesture processing.
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index b891af52a887..513e72f27901 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -21,6 +21,7 @@ import android.animation.ValueAnimator;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.AppGlobals;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.app.RemoteAction;
@@ -384,6 +385,10 @@ public class Editor {
private final SuggestionHelper mSuggestionHelper = new SuggestionHelper();
+ // Specifies whether the cursor control feature set is enabled.
+ // This can only be true if the text view is editable.
+ private final boolean mCursorControlEnabled;
+
Editor(TextView textView) {
mTextView = textView;
// Synchronize the filter list, which places the undo input filter at the end.
@@ -397,6 +402,13 @@ public class Editor {
Magnifier.createBuilderWithOldMagnifierDefaults(mTextView).build();
mMagnifierAnimator = new MagnifierMotionAnimator(magnifier);
}
+
+ mCursorControlEnabled = AppGlobals.getIntCoreSetting(
+ WidgetFlags.KEY_ENABLE_CURSOR_CONTROL , 0) != 0;
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("Editor", "Cursor control is %s.",
+ mCursorControlEnabled ? "enabled" : "disabled");
+ }
}
ParcelableParcel saveInstanceState() {
diff --git a/core/java/android/widget/WidgetFlags.java b/core/java/android/widget/WidgetFlags.java
new file mode 100644
index 000000000000..fa1e498d55b6
--- /dev/null
+++ b/core/java/android/widget/WidgetFlags.java
@@ -0,0 +1,40 @@
+/*
+ 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.widget;
+
+/**
+ * Keeps the flags related to the Widget namespace in {@link DeviceConfig}.
+ *
+ * @hide
+ */
+public final class WidgetFlags {
+
+ /**
+ * Whether the cursor control feature set is enabled.
+ * TODO: Makes this flag key visible to webview/chrome.
+ */
+ public static final String ENABLE_CURSOR_CONTROL =
+ "CursorControlFeature__enable_cursor_control";
+
+ /**
+ * The key name used in app core settings for enable cursor control.
+ */
+ public static final String KEY_ENABLE_CURSOR_CONTROL = "widget__enable_cursor_control";
+
+ private WidgetFlags() {
+ }
+}
diff --git a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java
index 457c0331c141..384275f64e3d 100644
--- a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java
+++ b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java
@@ -27,6 +27,7 @@ import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteL
import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteListingFeatureElementIndex.ICON_ID;
import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteListingFeatureElementIndex.LABEL_ID;
import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteListingFeatureElementIndex.SETTINGS_KEY;
+import static com.android.internal.util.Preconditions.checkArgument;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.IntDef;
@@ -75,15 +76,10 @@ public class AccessibilityButtonChooserActivity extends Activity {
private static final char SERVICES_SEPARATOR = ':';
private static final TextUtils.SimpleStringSplitter sStringColonSplitter =
new TextUtils.SimpleStringSplitter(SERVICES_SEPARATOR);
- @UserShortcutType
- private static final int ACCESSIBILITY_BUTTON_USER_TYPE = convertToUserType(
- ACCESSIBILITY_BUTTON);
- @UserShortcutType
- private static final int ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE = convertToUserType(
- ACCESSIBILITY_SHORTCUT_KEY);
-
@ShortcutType
private int mShortcutType;
+ @UserShortcutType
+ private int mShortcutUserType;
private final List<AccessibilityButtonTarget> mTargets = new ArrayList<>();
private AlertDialog mAlertDialog;
private TargetAdapter mTargetAdapter;
@@ -213,11 +209,12 @@ public class AccessibilityButtonChooserActivity extends Activity {
}
mShortcutType = getIntent().getIntExtra(AccessibilityManager.EXTRA_SHORTCUT_TYPE,
- ACCESSIBILITY_BUTTON);
- if ((mShortcutType != ACCESSIBILITY_BUTTON)
- && (mShortcutType != ACCESSIBILITY_SHORTCUT_KEY)) {
- throw new IllegalStateException("Unexpected shortcut type: " + mShortcutType);
- }
+ /* unexpectedShortcutType */ -1);
+ final boolean existInShortcutType = (mShortcutType == ACCESSIBILITY_BUTTON)
+ || (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY);
+ checkArgument(existInShortcutType, "Unexpected shortcut type: " + mShortcutType);
+
+ mShortcutUserType = convertToUserType(mShortcutType);
mTargets.addAll(getServiceTargets(this, mShortcutType));
@@ -343,13 +340,11 @@ public class AccessibilityButtonChooserActivity extends Activity {
}
}
- private void disableService(ComponentName componentName) {
- final String componentId = componentName.flattenToString();
-
+ private void disableService(String componentId) {
if (isWhiteListingService(componentId)) {
- setWhiteListingServiceEnabled(componentName.flattenToString(),
- /* settingsValueOff */ 0);
+ setWhiteListingServiceEnabled(componentId, /* settingsValueOff */ 0);
} else {
+ final ComponentName componentName = ComponentName.unflattenFromString(componentId);
setAccessibilityServiceState(this, componentName, /* enabled= */ false);
}
}
@@ -620,18 +615,17 @@ public class AccessibilityButtonChooserActivity extends Activity {
private void onTargetDeleted(AdapterView<?> parent, View view, int position, long id) {
final AccessibilityButtonTarget target = mTargets.get(position);
- final ComponentName targetComponentName =
- ComponentName.unflattenFromString(target.getId());
+ final String componentId = target.getId();
switch (target.getFragmentType()) {
case AccessibilityServiceFragmentType.LEGACY:
- onLegacyTargetDeleted(targetComponentName);
+ onLegacyTargetDeleted(position, componentId);
break;
case AccessibilityServiceFragmentType.INVISIBLE:
- onInvisibleTargetDeleted(targetComponentName);
+ onInvisibleTargetDeleted(position, componentId);
break;
case AccessibilityServiceFragmentType.INTUITIVE:
- onIntuitiveTargetDeleted(targetComponentName);
+ onIntuitiveTargetDeleted(position, componentId);
break;
case AccessibilityServiceFragmentType.BOUNCE:
// Do nothing
@@ -640,44 +634,36 @@ public class AccessibilityButtonChooserActivity extends Activity {
throw new IllegalStateException("Unexpected fragment type");
}
- mTargets.remove(position);
- mTargetAdapter.notifyDataSetChanged();
-
if (mTargets.isEmpty()) {
mAlertDialog.dismiss();
}
}
- private void onLegacyTargetDeleted(ComponentName componentName) {
+ private void onLegacyTargetDeleted(int position, String componentId) {
if (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
- optOutValueFromSettings(this, ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE, componentName);
+ optOutValueFromSettings(this, mShortcutUserType, componentId);
+
+ mTargets.remove(position);
+ mTargetAdapter.notifyDataSetChanged();
}
}
- private void onInvisibleTargetDeleted(ComponentName componentName) {
- if (mShortcutType == ACCESSIBILITY_BUTTON) {
- optOutValueFromSettings(this, ACCESSIBILITY_BUTTON_USER_TYPE, componentName);
+ private void onInvisibleTargetDeleted(int position, String componentId) {
+ optOutValueFromSettings(this, mShortcutUserType, componentId);
- if (!hasValueInSettings(this,
- ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE, componentName)) {
- disableService(componentName);
- }
- } else if (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
- optOutValueFromSettings(this, ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE, componentName);
-
- if (!hasValueInSettings(this,
- ACCESSIBILITY_BUTTON_USER_TYPE, componentName)) {
- disableService(componentName);
- }
+ final int shortcutTypes = UserShortcutType.SOFTWARE | UserShortcutType.HARDWARE;
+ if (!hasValuesInSettings(this, shortcutTypes, componentId)) {
+ disableService(componentId);
}
+
+ mTargets.remove(position);
+ mTargetAdapter.notifyDataSetChanged();
}
- private void onIntuitiveTargetDeleted(ComponentName componentName) {
- if (mShortcutType == ACCESSIBILITY_BUTTON) {
- optOutValueFromSettings(this, ACCESSIBILITY_BUTTON_USER_TYPE, componentName);
- } else if (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
- optOutValueFromSettings(this, ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE, componentName);
- }
+ private void onIntuitiveTargetDeleted(int position, String componentId) {
+ optOutValueFromSettings(this, mShortcutUserType, componentId);
+ mTargets.remove(position);
+ mTargetAdapter.notifyDataSetChanged();
}
private void onCancelButtonClicked() {
@@ -786,10 +772,10 @@ public class AccessibilityButtonChooserActivity extends Activity {
*
* @param context The current context.
* @param shortcutType The preferred shortcut type user selected.
- * @param componentName The component name that need to be opted out from Settings.
+ * @param componentId The component id that need to be opted out from Settings.
*/
private void optOutValueFromSettings(
- Context context, @UserShortcutType int shortcutType, ComponentName componentName) {
+ Context context, @UserShortcutType int shortcutType, String componentId) {
final StringJoiner joiner = new StringJoiner(String.valueOf(SERVICES_SEPARATOR));
final String targetsKey = convertToKey(shortcutType);
final String targetsValue = Settings.Secure.getString(context.getContentResolver(),
@@ -801,26 +787,47 @@ public class AccessibilityButtonChooserActivity extends Activity {
sStringColonSplitter.setString(targetsValue);
while (sStringColonSplitter.hasNext()) {
- final String name = sStringColonSplitter.next();
- if (TextUtils.isEmpty(name) || (componentName.flattenToString()).equals(name)) {
+ final String id = sStringColonSplitter.next();
+ if (TextUtils.isEmpty(id) || componentId.equals(id)) {
continue;
}
- joiner.add(name);
+ joiner.add(id);
}
Settings.Secure.putString(context.getContentResolver(), targetsKey, joiner.toString());
}
/**
+ * Returns if component name existed in one of {@code shortcutTypes} string in Settings.
+ *
+ * @param context The current context.
+ * @param shortcutTypes A combination of {@link UserShortcutType}.
+ * @param componentId The component name that need to be checked existed in Settings.
+ * @return {@code true} if componentName existed in Settings.
+ */
+ private boolean hasValuesInSettings(Context context, int shortcutTypes,
+ @NonNull String componentId) {
+ boolean exist = false;
+ if ((shortcutTypes & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE) {
+ exist = hasValueInSettings(context, UserShortcutType.SOFTWARE, componentId);
+ }
+ if (((shortcutTypes & UserShortcutType.HARDWARE) == UserShortcutType.HARDWARE)) {
+ exist |= hasValueInSettings(context, UserShortcutType.HARDWARE, componentId);
+ }
+ return exist;
+ }
+
+
+ /**
* Returns if component name existed in Settings.
*
* @param context The current context.
* @param shortcutType The preferred shortcut type user selected.
- * @param componentName The component name that need to be checked existed in Settings.
+ * @param componentId The component id that need to be checked existed in Settings.
* @return {@code true} if componentName existed in Settings.
*/
private boolean hasValueInSettings(Context context, @UserShortcutType int shortcutType,
- @NonNull ComponentName componentName) {
+ @NonNull String componentId) {
final String targetKey = convertToKey(shortcutType);
final String targetString = Settings.Secure.getString(context.getContentResolver(),
targetKey);
@@ -831,8 +838,8 @@ public class AccessibilityButtonChooserActivity extends Activity {
sStringColonSplitter.setString(targetString);
while (sStringColonSplitter.hasNext()) {
- final String name = sStringColonSplitter.next();
- if ((componentName.flattenToString()).equals(name)) {
+ final String id = sStringColonSplitter.next();
+ if (componentId.equals(id)) {
return true;
}
}
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 01709782fb91..a6637a2fb601 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -1240,9 +1240,6 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
}
updateBackgroundDrawable();
- if (insets != null) {
- insets = insets.consumeStableInsets();
- }
return insets;
}
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 88a9cb0aefef..4abd39797ba0 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -27,8 +27,8 @@ import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
-import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS;
import android.annotation.NonNull;
@@ -2466,7 +2466,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
if (a.hasValue(R.styleable.Window_windowLayoutInDisplayCutoutMode)) {
int mode = a.getInt(R.styleable.Window_windowLayoutInDisplayCutoutMode, -1);
if (mode < LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
- || mode > LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER) {
+ || mode > LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS) {
throw new UnsupportedOperationException("Unknown windowLayoutInDisplayCutoutMode: "
+ a.getString(R.styleable.Window_windowLayoutInDisplayCutoutMode));
}
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index c2385653939f..9d02d105e11e 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -1156,19 +1156,19 @@ static std::string getAppDataDirName(std::string_view parent_path, std::string_v
fail_fn(CREATE_ERROR("Unexpected error in getAppDataDirName: %s", strerror(errno)));
return nullptr;
}
- // Directory doesn't exist, try to search the name from inode
- DIR* dir = opendir(parent_path.data());
- if (dir == nullptr) {
- fail_fn(CREATE_ERROR("Failed to opendir %s", parent_path.data()));
- }
- struct dirent* ent;
- while ((ent = readdir(dir))) {
- if (ent->d_ino == ce_data_inode) {
- closedir(dir);
- return ent->d_name;
+ {
+ // Directory doesn't exist, try to search the name from inode
+ std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(parent_path.data()), closedir);
+ if (dir == nullptr) {
+ fail_fn(CREATE_ERROR("Failed to opendir %s", parent_path.data()));
+ }
+ struct dirent* ent;
+ while ((ent = readdir(dir.get()))) {
+ if (ent->d_ino == ce_data_inode) {
+ return ent->d_name;
+ }
}
}
- closedir(dir);
// Fallback due to b/145989852, ce_data_inode stored in package manager may be corrupted
// if ino_t is 32 bits.
@@ -1179,19 +1179,18 @@ static std::string getAppDataDirName(std::string_view parent_path, std::string_v
fixed_ce_data_inode = ((ce_data_inode >> 32) & LOWER_HALF_WORD_MASK);
}
if (fixed_ce_data_inode != 0) {
- dir = opendir(parent_path.data());
+ std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(parent_path.data()), closedir);
if (dir == nullptr) {
fail_fn(CREATE_ERROR("Failed to opendir %s", parent_path.data()));
}
- while ((ent = readdir(dir))) {
+ struct dirent* ent;
+ while ((ent = readdir(dir.get()))) {
if (ent->d_ino == fixed_ce_data_inode) {
long long d_ino = ent->d_ino;
ALOGW("Fallback success inode %lld -> %lld", ce_data_inode, d_ino);
- closedir(dir);
return ent->d_name;
}
}
- closedir(dir);
}
// Fallback done
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index cd3887e276ff..a85c8f4e798b 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -2557,4 +2557,9 @@ enum PageId {
// OS: R
DND_PEOPLE = 1823;
+ // OPEN: Settings > Apps and notifications > App info > one of any app > Open by default
+ // > Open supported links
+ // CATEGORY: SETTINGS
+ // OS: R
+ OPEN_SUPPORTED_LINKS = 1824;
}
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 7835016439e0..77d4e87cec56 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -188,6 +188,7 @@ message SecureSettingsProto {
optional SettingProto pulse_on_long_press = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto pulse_on_double_tap = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto pulse_on_tap = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto suppress = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
}
optional Doze doze = 21;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 718114244059..490c47796472 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2234,6 +2234,14 @@
<permission android:name="android.permission.BIND_EUICC_SERVICE"
android:protectionLevel="signature|telephony" />
+ <!-- Required for reading information about carrier apps from SystemConfigManager.
+ <p>Protection level: signature|telephony
+ @SystemApi
+ @hide
+ -->
+ <permission android:name="android.permission.READ_CARRIER_APP_INFO"
+ android:protectionLevel="signature|telephony" />
+
<!-- ================================== -->
<!-- Permissions for sdcard interaction -->
<!-- ================================== -->
diff --git a/core/res/res/drawable-hdpi/ic_accessibility_magnification.png b/core/res/res/drawable-hdpi/ic_accessibility_magnification.png
deleted file mode 100755
index a91bc6ec90ed..000000000000
--- a/core/res/res/drawable-hdpi/ic_accessibility_magnification.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_accessibility_magnification.png b/core/res/res/drawable-mdpi/ic_accessibility_magnification.png
deleted file mode 100755
index 9ec51075a5ed..000000000000
--- a/core/res/res/drawable-mdpi/ic_accessibility_magnification.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png
deleted file mode 100755
index 0b3a32ed1792..000000000000
--- a/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png
deleted file mode 100755
index 3eeb1c9f8dd8..000000000000
--- a/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png
deleted file mode 100755
index 7d376126b4d7..000000000000
--- a/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/ic_accessibility_color_correction.xml b/core/res/res/drawable/ic_accessibility_color_correction.xml
index 02fa4b807155..ed09d5704ad2 100644
--- a/core/res/res/drawable/ic_accessibility_color_correction.xml
+++ b/core/res/res/drawable/ic_accessibility_color_correction.xml
@@ -1,3 +1,18 @@
+<!--
+ 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.
+-->
<vector android:height="24dp" android:viewportHeight="192"
android:viewportWidth="192" android:width="24dp"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
diff --git a/core/res/res/drawable/ic_accessibility_color_inversion.xml b/core/res/res/drawable/ic_accessibility_color_inversion.xml
index 97b30b0df4d5..d69a169d0fb3 100644
--- a/core/res/res/drawable/ic_accessibility_color_inversion.xml
+++ b/core/res/res/drawable/ic_accessibility_color_inversion.xml
@@ -1,3 +1,18 @@
+<!--
+ 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.
+-->
<vector android:height="24dp" android:viewportHeight="192"
android:viewportWidth="192" android:width="24dp"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
diff --git a/core/res/res/drawable/ic_accessibility_magnification.xml b/core/res/res/drawable/ic_accessibility_magnification.xml
new file mode 100644
index 000000000000..5dab47951cda
--- /dev/null
+++ b/core/res/res/drawable/ic_accessibility_magnification.xml
@@ -0,0 +1,114 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="192"
+ android:viewportHeight="192">
+ <path
+ android:pathData="M96,104m-24,0a24,24 0,1 1,48 0a24,24 0,1 1,-48 0"
+ android:fillColor="#F50057"/>
+ <path
+ android:pathData="M178.57,70.06l-73.81,-58.94C99.6,7.01 92.35,6.96 87.15,11L13.59,68.14C8.87,71.8 6.9,78.02 8.61,83.77l28.53,89.97c1.83,6.09 7.39,10.26 13.7,10.26h90.38c6.28,0 11.82,-4.13 13.67,-10.19l0.69,-2.13l-34.94,-34.88v-4.7l-0.96,-0.99c-6.33,5.54 -14.61,8.9 -23.68,8.9c-19.89,0 -36.02,-16.12 -36.02,-36.01S76.11,68 96,68s36.01,16.12 36.01,36.01c0,8.68 -3.08,16.65 -8.2,22.87l1.05,1.01h4.7l30.34,30.39l23.47,-72.65C185.1,79.94 183.2,73.76 178.57,70.06z"
+ android:fillColor="#F50057"/>
+ <path
+ android:pathData="M65.25,73c0,0 -16.75,31.96 -9.25,45.1s21.02,29.15 40.01,32.65s32.99,10.5 39.99,14s19.58,6.93 19.58,6.93s-5.34,-9.49 4.32,-13.4c0.73,-3.53 -11.9,-42.35 -11.9,-42.35L127.92,73L81.79,62.25L65.25,73z"
+ android:fillColor="#F50057"/>
+ <path
+ android:pathData="M155.33,171.43l-0.44,1.37c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84c-6.31,0 -11.87,-4.17 -13.7,-10.26L8.61,82.77c-0.36,-1.22 -0.55,-2.46 -0.59,-3.69c-0.06,1.56 0.13,3.14 0.59,4.69l28.53,89.97c1.83,6.09 7.39,10.26 13.7,10.26h90.38c6.28,0 11.82,-4.13 13.67,-10.19l0.69,-2.13L155.33,171.43z"
+ android:strokeAlpha="0.2"
+ android:fillColor="#3E2723"
+ android:fillAlpha="0.2"/>
+ <path
+ android:pathData="M183.37,84.63l-23.71,73.41l0.24,0.24l23.47,-72.66c0.48,-1.57 0.67,-3.17 0.61,-4.75C183.94,82.13 183.74,83.39 183.37,84.63z"
+ android:strokeAlpha="0.2"
+ android:fillColor="#3E2723"
+ android:fillAlpha="0.2"/>
+ <path
+ android:pathData="M155.57,171.67l-34.93,-34.87v-4.7l-0.96,-0.99c-6.33,5.54 -14.61,8.9 -23.68,8.9c-9.81,0 -18.71,-3.93 -25.2,-10.29L125.07,184h16.14c6.28,0 11.81,-4.13 13.67,-10.19L155.57,171.67z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="104.215"
+ android:startX="69.035"
+ android:endY="173.8946"
+ android:endX="138.7146"
+ android:type="linear">
+ <item android:offset="0" android:color="#333E2723"/>
+ <item android:offset="1" android:color="#003E2723"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M132.01,104.01c0,8.68 -3.08,16.65 -8.2,22.87l1.05,1.01h4.7l30.34,30.39L170,127l-49,-49.03l-0.19,-0.04C127.71,84.49 132.01,93.74 132.01,104.01z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="83.635"
+ android:startX="103.615"
+ android:endY="137.0219"
+ android:endX="157.0018"
+ android:type="linear">
+ <item android:offset="0" android:color="#333E2723"/>
+ <item android:offset="1" android:color="#003E2723"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M124.27,127.32c4.85,-6.13 7.75,-13.88 7.75,-22.3c0,-0.16 -0.01,-0.31 -0.01,-0.47c-0.12,8.47 -3.17,16.24 -8.19,22.34L124.27,127.32z"
+ android:strokeAlpha="0.2"
+ android:fillColor="#3E2723"
+ android:fillAlpha="0.2"/>
+ <path
+ android:pathData="M96.01,80.01c-13.25,0 -24,10.75 -24,24c0,0.17 0.01,0.33 0.01,0.5c0.27,-13.02 10.91,-23.5 23.99,-23.5s23.72,10.48 23.99,23.5c0,-0.17 0.01,-0.33 0.01,-0.5C120.01,90.76 109.26,80.01 96.01,80.01z"
+ android:strokeAlpha="0.2"
+ android:fillColor="#3E2723"
+ android:fillAlpha="0.2"/>
+ <path
+ android:pathData="M155.58,171.68l-34.93,-34.87l0,1l34.68,34.62z"
+ android:strokeAlpha="0.2"
+ android:fillColor="#3E2723"
+ android:fillAlpha="0.2"/>
+ <path
+ android:pathData="M119.69,131.12c-6.33,5.54 -14.61,8.9 -23.68,8.9c-9.97,0 -19,-4.06 -25.52,-10.61h-0.01l5.59,5.59c5.71,3.8 12.57,6.03 19.94,6.03c9.07,0 17.35,-3.36 23.68,-8.9l0.96,0.99v-1L119.69,131.12z"
+ android:strokeAlpha="0.2"
+ android:fillColor="#3E2723"
+ android:fillAlpha="0.2"/>
+ <path
+ android:pathData="M13.59,69.14L87.15,12c5.2,-4.04 12.45,-3.99 17.61,0.12l73.81,58.94c3.36,2.68 5.27,6.67 5.41,10.82c0.15,-4.51 -1.79,-8.93 -5.41,-11.82l-73.81,-58.94C99.6,7.01 92.35,6.96 87.15,11L13.59,68.14c-3.72,2.88 -5.72,7.36 -5.57,11.94C8.17,75.85 10.14,71.81 13.59,69.14z"
+ android:strokeAlpha="0.2"
+ android:fillColor="#FFFFFF"
+ android:fillAlpha="0.2"/>
+ <path
+ android:pathData="M112,108h-12v12h-8v-12H80v-8h12V88h8v12h12V108z"
+ android:fillColor="#F8BBD0"/>
+ <path
+ android:pathData="M129.57,127.9h-4.7l-1.05,-1.01c5.12,-6.22 8.2,-14.19 8.2,-22.87c0,-19.89 -16.12,-36.01 -36.01,-36.01s-36.02,16.11 -36.02,36s16.13,36.01 36.02,36.01c9.07,0 17.35,-3.36 23.68,-8.9l0.96,0.99v4.7l34.93,34.87l4.33,-13.39L129.57,127.9zM96.01,128.01c-13.25,0 -24,-10.75 -24,-24s10.75,-24 24,-24s24,10.75 24,24S109.26,128.01 96.01,128.01z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M37.14,173.74L8.61,83.77C6.9,78.02 8.87,71.8 13.59,68.14L87.15,11c5.2,-4.04 12.45,-3.99 17.61,0.12l73.81,58.94c4.63,3.7 6.53,9.88 4.8,15.57l-28.48,88.18c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84C44.53,184 38.97,179.83 37.14,173.74z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="53.3534"
+ android:startX="38.1466"
+ android:endY="178.712"
+ android:endX="163.5051"
+ android:type="linear">
+ <item android:offset="0" android:color="#19FFFFFF"/>
+ <item android:offset="1" android:color="#00FFFFFF"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+</vector>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 44754157c5b5..e0d849223552 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2217,6 +2217,16 @@
Corresponds to <code>LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER</code>.
-->
<enum name="never" value="2" />
+ <!-- <p>
+ The window is always allowed to extend into the <code>DisplayCutout</code> areas on the
+ all edges of the screen.
+ <p>
+ The window must make sure that no important content overlaps with the
+ <code>DisplayCutout</code>.
+ <p>
+ Corresponds to <code>LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS</code>.
+ -->
+ <enum name="always" value="3" />
</attr>
</declare-styleable>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 625eb63dab8f..85ebbd5fe7a9 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -4306,4 +4306,16 @@
<!-- Retention policy: number of records to kept for the historical exit info per package. -->
<integer name="config_app_exit_info_history_list_size">16</integer>
+
+ <!-- Packages that can't be killed even if it's requested to be killed on imperceptible -->
+ <string-array name="config_defaultImperceptibleKillingExemptionPkgs" translatable="false" />
+
+ <!-- Proc States that can't be killed even if it's requested to be killed on imperceptible -->
+ <integer-array name="config_defaultImperceptibleKillingExemptionProcStates">
+ <item>0</item> <!-- PROCESS_STATE_PERSISTENT -->
+ <item>1</item> <!-- PROCESS_STATE_PERSISTENT_UI -->
+ <item>2</item> <!-- PROCESS_STATE_TOP -->
+ <item>4</item> <!-- PROCESS_STATE_FOREGROUND_SERVICE -->
+ <item>12</item> <!-- PROCESS_STATE_TOP_SLEEPING -->
+ </integer-array>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a81565a81670..f25f97c39f7e 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4359,10 +4359,8 @@
You can change the feature in Settings > Accessibility.
</string>
- <!-- Text in button that edit the accessibility shortcut menu. [CHAR LIMIT=100] -->
- <string name="accessibility_shortcut_menu_button">Empty</string>
-
- <!-- Text in button that edit the accessibility shortcut menu. [CHAR LIMIT=100] -->
+ <!-- Text in button that edit the accessibility shortcut menu, user can delete
+ any service item in the menu list. [CHAR LIMIT=100] -->
<string name="edit_accessibility_shortcut_menu_button">Edit shortcuts</string>
<!-- Text in button that cancel the accessibility shortcut menu changed status. [CHAR LIMIT=100] -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index fe7ebe145717..69e8c78d92f0 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3823,4 +3823,7 @@
<!-- For app process exit info tracking -->
<java-symbol type="integer" name="config_app_exit_info_history_list_size" />
+
+ <java-symbol type="array" name="config_defaultImperceptibleKillingExemptionPkgs" />
+ <java-symbol type="array" name="config_defaultImperceptibleKillingExemptionProcStates" />
</resources>
diff --git a/core/tests/coretests/res/values/styles.xml b/core/tests/coretests/res/values/styles.xml
index 0bf4b9278446..352b4dceb3cc 100644
--- a/core/tests/coretests/res/values/styles.xml
+++ b/core/tests/coretests/res/values/styles.xml
@@ -31,6 +31,9 @@
<style name="LayoutInDisplayCutoutModeNever">
<item name="android:windowLayoutInDisplayCutoutMode">never</item>
</style>
+ <style name="LayoutInDisplayCutoutModeAlways">
+ <item name="android:windowLayoutInDisplayCutoutMode">always</item>
+ </style>
<style name="WindowBackgroundColorLiteral">
<item name="android:windowBackground">#00FF00</item>
</style>
diff --git a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
index abaeb0a11a8d..ae6d8df26feb 100644
--- a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
+++ b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
@@ -17,8 +17,10 @@
package android.accessibilityservice;
import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import android.content.ComponentName;
import android.content.Context;
@@ -48,6 +50,7 @@ import java.util.List;
public class AccessibilityShortcutInfoTest {
private Context mTargetContext;
private PackageManager mPackageManager;
+ private ComponentName mComponentName;
private AccessibilityShortcutInfo mShortcutInfo;
@Before
@@ -55,25 +58,9 @@ public class AccessibilityShortcutInfoTest {
mTargetContext = InstrumentationRegistry.getInstrumentation()
.getTargetContext();
mPackageManager = mTargetContext.getPackageManager();
-
- final ComponentName testShortcutName = new ComponentName(mTargetContext,
- AccessibilityTestActivity.class);
- final AccessibilityManager accessibilityManager = (AccessibilityManager) mTargetContext
- .getSystemService(Context.ACCESSIBILITY_SERVICE);
- final List<AccessibilityShortcutInfo> infoList = accessibilityManager
- .getInstalledAccessibilityShortcutListAsUser(
- mTargetContext, mTargetContext.getUserId());
- for (AccessibilityShortcutInfo info : infoList) {
- final ActivityInfo activityInfo = info.getActivityInfo();
- final ComponentName name = new ComponentName(
- activityInfo.packageName, activityInfo.name);
- if (name.equals(testShortcutName)) {
- mShortcutInfo = info;
- break;
- }
- }
-
- assertNotNull("Can't find " + testShortcutName, mShortcutInfo);
+ mComponentName = new ComponentName(mTargetContext, AccessibilityTestActivity.class);
+ mShortcutInfo = getAccessibilityShortcutInfo(mComponentName);
+ assertNotNull("Can't find " + mComponentName, mShortcutInfo);
}
@Test
@@ -95,4 +82,38 @@ public class AccessibilityShortcutInfoTest {
assertThat("Summary is not correct",
mShortcutInfo.loadSummary(mPackageManager), is(summary));
}
+
+ @Test
+ public void testEquals() {
+ assertTrue(mShortcutInfo.equals(mShortcutInfo));
+ assertFalse(mShortcutInfo.equals(null));
+ assertFalse(mShortcutInfo.equals(new Object()));
+
+ final AccessibilityShortcutInfo sameCopy = getAccessibilityShortcutInfo(
+ mComponentName);
+ assertTrue(mShortcutInfo != sameCopy);
+ assertTrue(mShortcutInfo.hashCode() == sameCopy.hashCode());
+ assertTrue(mShortcutInfo.getComponentName().equals(sameCopy.getComponentName()));
+ assertTrue(mShortcutInfo.equals(sameCopy));
+ }
+
+ @Test
+ public void testToString() {
+ assertNotNull(mShortcutInfo.toString());
+ }
+
+ private AccessibilityShortcutInfo getAccessibilityShortcutInfo(ComponentName componentName) {
+ final AccessibilityManager accessibilityManager = (AccessibilityManager) mTargetContext
+ .getSystemService(Context.ACCESSIBILITY_SERVICE);
+ final List<AccessibilityShortcutInfo> infoList = accessibilityManager
+ .getInstalledAccessibilityShortcutListAsUser(
+ mTargetContext, mTargetContext.getUserId());
+ for (AccessibilityShortcutInfo info : infoList) {
+ final ActivityInfo activityInfo = info.getActivityInfo();
+ if (componentName.equals(activityInfo.getComponentName())) {
+ return info;
+ }
+ }
+ return null;
+ }
}
diff --git a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java
index d0fd92a838c9..7c78bce25b1c 100644
--- a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java
+++ b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java
@@ -74,7 +74,7 @@ public class ImeInsetsSourceConsumerTest {
false,
new DisplayCutout(
Insets.of(10, 10, 10, 10), rect, rect, rect, rect),
- rect, rect, SOFT_INPUT_ADJUST_RESIZE);
+ rect, rect, SOFT_INPUT_ADJUST_RESIZE, 0);
mImeConsumer = new ImeInsetsSourceConsumer(
new InsetsState(), Transaction::new, mController);
});
diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java
index fa61a0a0250b..f2852fa49b5e 100644
--- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java
+++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java
@@ -21,10 +21,14 @@ import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
import static android.view.WindowInsets.Type.systemBars;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -39,6 +43,8 @@ import android.view.SurfaceControl.Transaction;
import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
import android.view.test.InsetsModeSession;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -50,8 +56,6 @@ import org.mockito.MockitoAnnotations;
import java.util.List;
-import androidx.test.runner.AndroidJUnit4;
-
/**
* Tests for {@link InsetsAnimationControlImpl}.
*
@@ -90,6 +94,8 @@ public class InsetsAnimationControlImplTest {
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
+ doNothing().when(mMockController).updateCompatSysUiVisibility(
+ anyInt(), anyBoolean(), anyBoolean());
mTopLeash = new SurfaceControl.Builder(mSession)
.setName("testSurface")
.build();
diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java
index 628f7ecce9f1..838190387c35 100644
--- a/core/tests/coretests/src/android/view/InsetsControllerTest.java
+++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java
@@ -114,7 +114,7 @@ public class InsetsControllerTest {
false,
new DisplayCutout(
Insets.of(10, 10, 10, 10), rect, rect, rect, rect),
- rect, rect, SOFT_INPUT_ADJUST_RESIZE);
+ rect, rect, SOFT_INPUT_ADJUST_RESIZE, 0);
mController.onFrameChanged(new Rect(0, 0, 100, 100));
});
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
diff --git a/core/tests/coretests/src/android/view/InsetsStateTest.java b/core/tests/coretests/src/android/view/InsetsStateTest.java
index 4b76fee00496..9e4b1c55304f 100644
--- a/core/tests/coretests/src/android/view/InsetsStateTest.java
+++ b/core/tests/coretests/src/android/view/InsetsStateTest.java
@@ -23,6 +23,7 @@ import static android.view.InsetsState.ITYPE_CAPTION_BAR;
import static android.view.InsetsState.ITYPE_IME;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
+import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
import static android.view.WindowInsets.Type.ime;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
@@ -72,7 +73,7 @@ public class InsetsStateTest {
mState.getSource(ITYPE_IME).setVisible(true);
SparseIntArray typeSideMap = new SparseIntArray();
WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, typeSideMap);
+ DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, 0, typeSideMap);
assertEquals(Insets.of(0, 100, 0, 100), insets.getSystemWindowInsets());
assertEquals(Insets.of(0, 100, 0, 100), insets.getInsets(Type.all()));
assertEquals(ISIDE_TOP, typeSideMap.get(ITYPE_STATUS_BAR));
@@ -91,7 +92,7 @@ public class InsetsStateTest {
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 100, 100, 300));
mState.getSource(ITYPE_IME).setVisible(true);
WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, null);
+ DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, 0, null);
assertEquals(100, insets.getStableInsetBottom());
assertEquals(Insets.of(0, 0, 0, 100), insets.getMaxInsets(Type.systemBars()));
assertEquals(Insets.of(0, 0, 0, 200), insets.getSystemWindowInsets());
@@ -110,7 +111,7 @@ public class InsetsStateTest {
mState.getSource(ITYPE_NAVIGATION_BAR).setFrame(new Rect(80, 0, 100, 300));
mState.getSource(ITYPE_NAVIGATION_BAR).setVisible(true);
WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, 0, null);
+ DisplayCutout.NO_CUTOUT, null, null, 0, 0, null);
assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets());
assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(Type.statusBars()));
assertEquals(Insets.of(0, 0, 20, 0), insets.getInsets(Type.navigationBars()));
@@ -126,7 +127,7 @@ public class InsetsStateTest {
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 200, 100, 300));
mState.getSource(ITYPE_IME).setVisible(true);
WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING, null);
+ DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING, 0, null);
assertEquals(0, insets.getSystemWindowInsetBottom());
assertEquals(100, insets.getInsets(ime()).bottom);
assertTrue(insets.isVisible(ime()));
@@ -134,6 +135,25 @@ public class InsetsStateTest {
}
@Test
+ public void testCalculateInsets_systemUiFlagLayoutStable() {
+ try (final InsetsModeSession session =
+ new InsetsModeSession(ViewRootImpl.NEW_INSETS_MODE_FULL)) {
+ mState.getSource(ITYPE_STATUS_BAR).setFrame(new Rect(0, 0, 100, 100));
+ mState.getSource(ITYPE_STATUS_BAR).setVisible(false);
+ mState.getSource(ITYPE_IME).setFrame(new Rect(0, 200, 100, 300));
+ mState.getSource(ITYPE_IME).setVisible(true);
+ WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
+ DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING,
+ SYSTEM_UI_FLAG_LAYOUT_STABLE, null);
+ assertEquals(100, insets.getSystemWindowInsetTop());
+ insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
+ DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_NOTHING,
+ 0 /* legacySystemUiFlags */, null);
+ assertEquals(0, insets.getSystemWindowInsetTop());
+ }
+ }
+
+ @Test
public void testStripForDispatch() {
mState.getSource(ITYPE_STATUS_BAR).setFrame(new Rect(0, 0, 100, 100));
mState.getSource(ITYPE_STATUS_BAR).setVisible(true);
@@ -141,7 +161,7 @@ public class InsetsStateTest {
mState.getSource(ITYPE_IME).setVisible(true);
mState.removeSource(ITYPE_IME);
WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), false, false,
- DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, null);
+ DisplayCutout.NO_CUTOUT, null, null, SOFT_INPUT_ADJUST_RESIZE, 0, null);
assertEquals(0, insets.getSystemWindowInsetBottom());
}
diff --git a/core/tests/coretests/src/android/view/WindowInsetsTest.java b/core/tests/coretests/src/android/view/WindowInsetsTest.java
index e5a4f6d5b3be..fce2ebd08888 100644
--- a/core/tests/coretests/src/android/view/WindowInsetsTest.java
+++ b/core/tests/coretests/src/android/view/WindowInsetsTest.java
@@ -16,10 +16,12 @@
package android.view;
+import static android.view.WindowInsets.Type.SIZE;
import static android.view.WindowInsets.Type.ime;
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.statusBars;
+import static android.view.WindowInsets.Type.systemBars;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -28,6 +30,7 @@ import android.graphics.Insets;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.view.WindowInsets.Builder;
+import android.view.WindowInsets.Type;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -56,6 +59,18 @@ public class WindowInsetsTest {
assertTrue(new WindowInsets((Rect) null).isConsumed());
}
+ @Test
+ public void compatInsets_layoutStable() {
+ Insets[] insets = new Insets[SIZE];
+ Insets[] maxInsets = new Insets[SIZE];
+ boolean[] visible = new boolean[SIZE];
+ WindowInsets.assignCompatInsets(maxInsets, new Rect(0, 10, 0, 0));
+ WindowInsets.assignCompatInsets(insets, new Rect(0, 0, 0, 0));
+ WindowInsets windowInsets = new WindowInsets(insets, maxInsets, visible, false, false, null,
+ systemBars(), true /* compatIgnoreVisibility */);
+ assertEquals(Insets.of(0, 10, 0, 0), windowInsets.getSystemWindowInsets());
+ }
+
// TODO: Move this to CTS once API made public
@Test
public void typeMap() {
diff --git a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
index 6c2d630ac917..916e2b51ea53 100644
--- a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
+++ b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
@@ -16,6 +16,7 @@
package com.android.internal.policy;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
@@ -94,6 +95,15 @@ public final class PhoneWindowTest {
}
@Test
+ public void layoutInDisplayCutoutMode_always() throws Exception {
+ createPhoneWindowWithTheme(R.style.LayoutInDisplayCutoutModeAlways);
+ installDecor();
+
+ assertThat(mPhoneWindow.getAttributes().layoutInDisplayCutoutMode,
+ is(LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS));
+ }
+
+ @Test
public void testWindowBackground_colorLiteral() {
createPhoneWindowWithTheme(R.style.WindowBackgroundColorLiteral);
installDecor();
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index ad99ab335145..46a7d830ac3d 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -153,6 +153,7 @@ applications that come with the platform
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.PACKAGE_USAGE_STATS"/>
<permission name="android.permission.PERFORM_CDMA_PROVISIONING"/>
+ <permission name="android.permission.READ_CARRIER_APP_INFO"/>
<permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.READ_SEARCH_INDEXABLES"/>
@@ -311,6 +312,7 @@ applications that come with the platform
<!-- Needed for test only -->
<permission name="android.permission.PACKET_KEEPALIVE_OFFLOAD" />
<permission name="android.permission.POWER_SAVER" />
+ <permission name="android.permission.READ_CARRIER_APP_INFO"/>
<permission name="android.permission.READ_FRAME_BUFFER"/>
<permission name="android.permission.READ_LOWPAN_CREDENTIAL"/>
<!-- Needed for test only -->
diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl
index 281e7c6b6f68..dac0fba876be 100644
--- a/media/java/android/media/IMediaRouterService.aidl
+++ b/media/java/android/media/IMediaRouterService.aidl
@@ -46,6 +46,7 @@ interface IMediaRouterService {
// Methods for media router 2
List<MediaRoute2Info> getSystemRoutes();
+ RoutingSessionInfo getSystemSessionInfo();
void registerClient2(IMediaRouter2Client client, String packageName);
void unregisterClient2(IMediaRouter2Client client);
void sendControlRequest(IMediaRouter2Client client, in MediaRoute2Info route,
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
index a9e33fd8e472..cefc9db77924 100644
--- a/media/java/android/media/MediaCas.java
+++ b/media/java/android/media/MediaCas.java
@@ -16,13 +16,15 @@
package android.media;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.cas.V1_0.HidlCasPluginDescriptor;
import android.hardware.cas.V1_0.ICas;
import android.hardware.cas.V1_0.IMediaCasService;
-import android.hardware.cas.V1_1.ICasListener;
+import android.hardware.cas.V1_2.ICasListener;
import android.media.MediaCasException.*;
+import android.media.tv.TvInputService.PriorityHintUseCaseType;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
@@ -34,6 +36,8 @@ import android.os.RemoteException;
import android.util.Log;
import android.util.Singleton;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
/**
@@ -100,28 +104,185 @@ public final class MediaCas implements AutoCloseable {
private static final String TAG = "MediaCas";
private ICas mICas;
private android.hardware.cas.V1_1.ICas mICasV11;
+ private android.hardware.cas.V1_2.ICas mICasV12;
private EventListener mListener;
private HandlerThread mHandlerThread;
private EventHandler mEventHandler;
+ private @PriorityHintUseCaseType int mPriorityHint;
+ private String mTvInputServiceSessionId;
+
+ /**
+ * Scrambling modes used to open cas sessions.
+ *
+ * @hide
+ */
+ @IntDef(prefix = "SCRAMBLING_MODE_",
+ value = {SCRAMBLING_MODE_RESERVED, SCRAMBLING_MODE_DVB_CSA1, SCRAMBLING_MODE_DVB_CSA2,
+ SCRAMBLING_MODE_DVB_CSA3_STANDARD,
+ SCRAMBLING_MODE_DVB_CSA3_MINIMAL, SCRAMBLING_MODE_DVB_CSA3_ENHANCE,
+ SCRAMBLING_MODE_DVB_CISSA_V1, SCRAMBLING_MODE_DVB_IDSA,
+ SCRAMBLING_MODE_MULTI2, SCRAMBLING_MODE_AES128, SCRAMBLING_MODE_AES_ECB,
+ SCRAMBLING_MODE_AES_SCTE52, SCRAMBLING_MODE_TDES_ECB, SCRAMBLING_MODE_TDES_SCTE52})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ScramblingMode {}
+
+ /**
+ * DVB (Digital Video Broadcasting) reserved mode.
+ */
+ public static final int SCRAMBLING_MODE_RESERVED =
+ android.hardware.cas.V1_2.ScramblingMode.RESERVED;
+ /**
+ * DVB (Digital Video Broadcasting) Common Scrambling Algorithm (CSA) 1.
+ */
+ public static final int SCRAMBLING_MODE_DVB_CSA1 =
+ android.hardware.cas.V1_2.ScramblingMode.DVB_CSA1;
+ /**
+ * DVB CSA 2.
+ */
+ public static final int SCRAMBLING_MODE_DVB_CSA2 =
+ android.hardware.cas.V1_2.ScramblingMode.DVB_CSA2;
+ /**
+ * DVB CSA 3 in standard mode.
+ */
+ public static final int SCRAMBLING_MODE_DVB_CSA3_STANDARD =
+ android.hardware.cas.V1_2.ScramblingMode.DVB_CSA3_STANDARD;
+ /**
+ * DVB CSA 3 in minimally enhanced mode.
+ */
+ public static final int SCRAMBLING_MODE_DVB_CSA3_MINIMAL =
+ android.hardware.cas.V1_2.ScramblingMode.DVB_CSA3_MINIMAL;
+ /**
+ * DVB CSA 3 in fully enhanced mode.
+ */
+ public static final int SCRAMBLING_MODE_DVB_CSA3_ENHANCE =
+ android.hardware.cas.V1_2.ScramblingMode.DVB_CSA3_ENHANCE;
+ /**
+ * DVB Common IPTV Software-oriented Scrambling Algorithm (CISSA) Version 1.
+ */
+ public static final int SCRAMBLING_MODE_DVB_CISSA_V1 =
+ android.hardware.cas.V1_2.ScramblingMode.DVB_CISSA_V1;
+ /**
+ * ATIS-0800006 IIF Default Scrambling Algorithm (IDSA).
+ */
+ public static final int SCRAMBLING_MODE_DVB_IDSA =
+ android.hardware.cas.V1_2.ScramblingMode.DVB_IDSA;
+ /**
+ * A symmetric key algorithm.
+ */
+ public static final int SCRAMBLING_MODE_MULTI2 =
+ android.hardware.cas.V1_2.ScramblingMode.MULTI2;
+ /**
+ * Advanced Encryption System (AES) 128-bit Encryption mode.
+ */
+ public static final int SCRAMBLING_MODE_AES128 =
+ android.hardware.cas.V1_2.ScramblingMode.AES128;
+ /**
+ * Advanced Encryption System (AES) Electronic Code Book (ECB) mode.
+ */
+ public static final int SCRAMBLING_MODE_AES_ECB =
+ android.hardware.cas.V1_2.ScramblingMode.AES_ECB;
+ /**
+ * Advanced Encryption System (AES) Society of Cable Telecommunications Engineers (SCTE) 52
+ * mode.
+ */
+ public static final int SCRAMBLING_MODE_AES_SCTE52 =
+ android.hardware.cas.V1_2.ScramblingMode.AES_SCTE52;
+ /**
+ * Triple Data Encryption Algorithm (TDES) Electronic Code Book (ECB) mode.
+ */
+ public static final int SCRAMBLING_MODE_TDES_ECB =
+ android.hardware.cas.V1_2.ScramblingMode.TDES_ECB;
+ /**
+ * Triple Data Encryption Algorithm (TDES) Society of Cable Telecommunications Engineers (SCTE)
+ * 52 mode.
+ */
+ public static final int SCRAMBLING_MODE_TDES_SCTE52 =
+ android.hardware.cas.V1_2.ScramblingMode.TDES_SCTE52;
+
+ /**
+ * Usages used to open cas sessions.
+ *
+ * @hide
+ */
+ @IntDef(prefix = "SESSION_USAGE_",
+ value = {SESSION_USAGE_LIVE, SESSION_USAGE_PLAYBACK, SESSION_USAGE_RECORD,
+ SESSION_USAGE_TIMESHIFT})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SessionUsage {}
+ /**
+ * Cas session is used to descramble live streams.
+ */
+ public static final int SESSION_USAGE_LIVE = android.hardware.cas.V1_2.SessionIntent.LIVE;
+ /**
+ * Cas session is used to descramble recoreded streams.
+ */
+ public static final int SESSION_USAGE_PLAYBACK =
+ android.hardware.cas.V1_2.SessionIntent.PLAYBACK;
+ /**
+ * Cas session is used to descramble live streams and encrypt local recorded content
+ */
+ public static final int SESSION_USAGE_RECORD = android.hardware.cas.V1_2.SessionIntent.RECORD;
+ /**
+ * Cas session is used to descramble live streams , encrypt local recorded content and playback
+ * local encrypted content.
+ */
+ public static final int SESSION_USAGE_TIMESHIFT =
+ android.hardware.cas.V1_2.SessionIntent.TIMESHIFT;
+
+ /**
+ * Plugin status events sent from cas system.
+ *
+ * @hide
+ */
+ @IntDef(prefix = "PLUGIN_STATUS_",
+ value = {PLUGIN_STATUS_PHYSICAL_MODULE_CHANGED, PLUGIN_STATUS_SESSION_NUMBER_CHANGED})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PluginStatus {}
+
+ /**
+ * The event to indicate that the status of CAS system is changed by the removal or insertion of
+ * physical CAS modules.
+ */
+ public static final int PLUGIN_STATUS_PHYSICAL_MODULE_CHANGED =
+ android.hardware.cas.V1_2.StatusEvent.PLUGIN_PHYSICAL_MODULE_CHANGED;
+ /**
+ * The event to indicate that the number of CAS system's session is changed.
+ */
+ public static final int PLUGIN_STATUS_SESSION_NUMBER_CHANGED =
+ android.hardware.cas.V1_2.StatusEvent.PLUGIN_SESSION_NUMBER_CHANGED;
private static final Singleton<IMediaCasService> sService = new Singleton<IMediaCasService>() {
@Override
protected IMediaCasService create() {
try {
- Log.d(TAG, "Tried to get cas@1.1 service");
- android.hardware.cas.V1_1.IMediaCasService serviceV11 =
- android.hardware.cas.V1_1.IMediaCasService.getService(true /*wait*/);
- if (serviceV11 != null) {
- return serviceV11;
+ Log.d(TAG, "Trying to get cas@1.2 service");
+ android.hardware.cas.V1_2.IMediaCasService serviceV12 =
+ android.hardware.cas.V1_2.IMediaCasService.getService(true /*wait*/);
+ if (serviceV12 != null) {
+ return serviceV12;
}
+ } catch (Exception eV1_2) {
+ Log.d(TAG, "Failed to get cas@1.2 service");
+ }
+
+ try {
+ Log.d(TAG, "Trying to get cas@1.1 service");
+ android.hardware.cas.V1_1.IMediaCasService serviceV11 =
+ android.hardware.cas.V1_1.IMediaCasService.getService(true /*wait*/);
+ if (serviceV11 != null) {
+ return serviceV11;
+ }
} catch (Exception eV1_1) {
- try {
- Log.d(TAG, "Tried to get cas@1.0 service");
- return IMediaCasService.getService(true /*wait*/);
- } catch (Exception eV1_0) {
- Log.d(TAG, "Failed to get cas@1.0 service");
- }
+ Log.d(TAG, "Failed to get cas@1.1 service");
}
+
+ try {
+ Log.d(TAG, "Trying to get cas@1.0 service");
+ return IMediaCasService.getService(true /*wait*/);
+ } catch (Exception eV1_0) {
+ Log.d(TAG, "Failed to get cas@1.0 service");
+ }
+
return null;
}
};
@@ -139,6 +300,7 @@ public final class MediaCas implements AutoCloseable {
private void cleanupAndRethrowIllegalState() {
mICas = null;
mICasV11 = null;
+ mICasV12 = null;
throw new IllegalStateException();
}
@@ -146,6 +308,8 @@ public final class MediaCas implements AutoCloseable {
private static final int MSG_CAS_EVENT = 0;
private static final int MSG_CAS_SESSION_EVENT = 1;
+ private static final int MSG_CAS_STATUS_EVENT = 2;
+ private static final int MSG_CAS_RESOURCE_LOST = 3;
private static final String SESSION_KEY = "sessionId";
private static final String DATA_KEY = "data";
@@ -164,6 +328,10 @@ public final class MediaCas implements AutoCloseable {
mListener.onSessionEvent(MediaCas.this,
createFromSessionId(sessionId), msg.arg1, msg.arg2,
bundle.getByteArray(DATA_KEY));
+ } else if (msg.what == MSG_CAS_STATUS_EVENT) {
+ mListener.onPluginStatusUpdate(MediaCas.this, msg.arg1, msg.arg2);
+ } else if (msg.what == MSG_CAS_RESOURCE_LOST) {
+ mListener.onResourceLost(MediaCas.this);
}
}
}
@@ -189,6 +357,12 @@ public final class MediaCas implements AutoCloseable {
msg.setData(bundle);
mEventHandler.sendMessage(msg);
}
+ @Override
+ public void onStatusUpdate(byte status, int arg)
+ throws RemoteException {
+ mEventHandler.sendMessage(mEventHandler.obtainMessage(
+ EventHandler.MSG_CAS_STATUS_EVENT, status, arg));
+ }
};
/**
* Describe a CAS plugin with its CA_system_ID and string name.
@@ -257,7 +431,7 @@ public final class MediaCas implements AutoCloseable {
final ArrayList<Byte> mSessionId;
Session(@NonNull ArrayList<Byte> sessionId) {
- mSessionId = sessionId;
+ mSessionId = new ArrayList<Byte>(sessionId);
}
/**
@@ -364,6 +538,19 @@ public final class MediaCas implements AutoCloseable {
}
/**
+ * Get Session Id.
+ *
+ * @return session Id of the session.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid.
+ */
+ @NonNull
+ public byte[] getSessionId() {
+ validateInternalStates();
+ return toBytes(mSessionId);
+ }
+
+ /**
* Close the session.
*
* @throws IllegalStateException if the MediaCas instance is not valid.
@@ -445,14 +632,23 @@ public final class MediaCas implements AutoCloseable {
public MediaCas(int CA_system_id) throws UnsupportedCasException {
try {
IMediaCasService service = getService();
- android.hardware.cas.V1_1.IMediaCasService serviceV11 =
+ android.hardware.cas.V1_2.IMediaCasService serviceV12 =
+ android.hardware.cas.V1_2.IMediaCasService.castFrom(service);
+ if (serviceV12 == null) {
+ android.hardware.cas.V1_1.IMediaCasService serviceV11 =
android.hardware.cas.V1_1.IMediaCasService.castFrom(service);
- if (serviceV11 == null) {
- Log.d(TAG, "Used cas@1_0 interface to create plugin");
- mICas = service.createPlugin(CA_system_id, mBinder);
+ if (serviceV11 == null) {
+ Log.d(TAG, "Used cas@1_0 interface to create plugin");
+ mICas = service.createPlugin(CA_system_id, mBinder);
+ } else {
+ Log.d(TAG, "Used cas@1.1 interface to create plugin");
+ mICas = mICasV11 = serviceV11.createPluginExt(CA_system_id, mBinder);
+ }
} else {
- Log.d(TAG, "Used cas@1.1 interface to create plugin");
- mICas = mICasV11 = serviceV11.createPluginExt(CA_system_id, mBinder);
+ Log.d(TAG, "Used cas@1.2 interface to create plugin");
+ mICas = mICasV11 = mICasV12 =
+ android.hardware.cas.V1_2.ICas
+ .castFrom(serviceV12.createPluginExt(CA_system_id, mBinder));
}
} catch(Exception e) {
Log.e(TAG, "Failed to create plugin: " + e);
@@ -465,6 +661,24 @@ public final class MediaCas implements AutoCloseable {
}
}
+ /**
+ * Instantiate a CA system of the specified system id.
+ *
+ * @param casSystemId The system id of the CA system.
+ * @param tvInputServiceSessionId The Id of the session opened in TV Input Service (TIS)
+ * {@link android.media.tv.TvInputService#onCreateSession(String, String)}
+ * @param priorityHint priority hint from the use case type for new created CAS system.
+ *
+ * @throws UnsupportedCasException if the device does not support the
+ * specified CA system.
+ */
+ public MediaCas(int casSystemId, @Nullable String tvInputServiceSessionId,
+ @PriorityHintUseCaseType int priorityHint) throws UnsupportedCasException {
+ this(casSystemId);
+ mPriorityHint = priorityHint;
+ mTvInputServiceSessionId = tvInputServiceSessionId;
+ }
+
IHwBinder getBinder() {
validateInternalStates();
@@ -476,6 +690,7 @@ public final class MediaCas implements AutoCloseable {
* to receives scheme-specific notifications from a MediaCas instance.
*/
public interface EventListener {
+
/**
* Notify the listener of a scheme-specific event from the CA system.
*
@@ -501,6 +716,27 @@ public final class MediaCas implements AutoCloseable {
int event, int arg, @Nullable byte[] data) {
Log.d(TAG, "Received MediaCas Session event");
}
+
+ /**
+ * Notify the listener that the cas plugin status is updated.
+ *
+ * @param mediaCas the MediaCas object to receive this event.
+ * @param status the plugin status which is updated.
+ * @param arg an integer whose meaning is specific to the status to be updated.
+ */
+ default void onPluginStatusUpdate(@NonNull MediaCas mediaCas, @PluginStatus int status,
+ int arg) {
+ Log.d(TAG, "Received MediaCas Plugin Status event");
+ }
+
+ /**
+ * Notify the listener that the session resources was lost.
+ *
+ * @param mediaCas the MediaCas object to receive this event.
+ */
+ default void onResourceLost(@NonNull MediaCas mediaCas) {
+ Log.d(TAG, "Received MediaCas Resource Reclaim event");
+ }
}
/**
@@ -563,6 +799,20 @@ public final class MediaCas implements AutoCloseable {
mSession = createFromSessionId(sessionId);
}
}
+
+ private class OpenSession_1_2_Callback implements
+ android.hardware.cas.V1_2.ICas.openSession_1_2Callback {
+
+ public Session mSession;
+ public int mStatus;
+
+ @Override
+ public void onValues(int status, ArrayList<Byte> sessionId) {
+ mStatus = status;
+ mSession = createFromSessionId(sessionId);
+ }
+ }
+
/**
* Open a session to descramble one or more streams scrambled by the
* conditional access system.
@@ -588,6 +838,40 @@ public final class MediaCas implements AutoCloseable {
}
/**
+ * Open a session with usage and scrambling information, so that descrambler can be configured
+ * to descramble one or more streams scrambled by the conditional access system.
+ *
+ * @param sessionUsage used for the created session.
+ * @param scramblingMode used for the created session.
+ *
+ * @return session the newly opened session.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid.
+ * @throws MediaCasException for CAS-specific errors.
+ * @throws MediaCasStateException for CAS-specific state exceptions.
+ */
+ @Nullable
+ public Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode)
+ throws MediaCasException {
+ validateInternalStates();
+
+ if (mICasV12 == null) {
+ Log.d(TAG, "Open Session with scrambling mode is only supported by cas@1.2+ interface");
+ throw new UnsupportedCasException("Open Session with scrambling mode is not supported");
+ }
+
+ try {
+ OpenSession_1_2_Callback cb = new OpenSession_1_2_Callback();
+ mICasV12.openSession_1_2(sessionUsage, scramblingMode, cb);
+ MediaCasException.throwExceptionIfNeeded(cb.mStatus);
+ return cb.mSession;
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ return null;
+ }
+
+ /**
* Send a received EMM packet to the CA system.
*
* @param data byte array of the EMM data.
diff --git a/media/java/android/media/MediaCasException.java b/media/java/android/media/MediaCasException.java
index 35fb104b7f0b..349e9b3ef186 100644
--- a/media/java/android/media/MediaCasException.java
+++ b/media/java/android/media/MediaCasException.java
@@ -16,7 +16,7 @@
package android.media;
-import android.hardware.cas.V1_0.Status;
+import android.hardware.cas.V1_2.Status;
/**
* Base class for MediaCas exceptions
@@ -85,4 +85,15 @@ public class MediaCasException extends Exception {
super(detailMessage);
}
}
+
+ /**
+ * Exception thrown when an operation on a MediaCas object is attempted
+ * and hardware resources are not sufficient to allocate, due to client's lower priority.
+ */
+ public static final class InsufficientResourceException extends MediaCasException {
+ /** @hide */
+ public InsufficientResourceException(String detailMessage) {
+ super(detailMessage);
+ }
+ }
}
diff --git a/media/java/android/media/MediaCasStateException.java b/media/java/android/media/MediaCasStateException.java
index 26c57923912d..8dbc9f4c7d03 100644
--- a/media/java/android/media/MediaCasStateException.java
+++ b/media/java/android/media/MediaCasStateException.java
@@ -18,8 +18,7 @@ package android.media;
import android.annotation.NonNull;
import android.annotation.Nullable;
-
-import android.hardware.cas.V1_0.Status;
+import android.hardware.cas.V1_2.Status;
/**
* Base class for MediaCas runtime exceptions
@@ -48,39 +47,60 @@ public class MediaCasStateException extends IllegalStateException {
String diagnosticInfo = "";
switch (err) {
- case Status.ERROR_CAS_UNKNOWN:
- diagnosticInfo = "General CAS error";
- break;
- case Status.ERROR_CAS_NO_LICENSE:
- diagnosticInfo = "No license";
- break;
- case Status.ERROR_CAS_LICENSE_EXPIRED:
- diagnosticInfo = "License expired";
- break;
- case Status.ERROR_CAS_SESSION_NOT_OPENED:
- diagnosticInfo = "Session not opened";
- break;
- case Status.ERROR_CAS_CANNOT_HANDLE:
- diagnosticInfo = "Unsupported scheme or data format";
- break;
- case Status.ERROR_CAS_INVALID_STATE:
- diagnosticInfo = "Invalid CAS state";
- break;
- case Status.ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION:
- diagnosticInfo = "Insufficient output protection";
- break;
- case Status.ERROR_CAS_TAMPER_DETECTED:
- diagnosticInfo = "Tamper detected";
- break;
- case Status.ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED:
- diagnosticInfo = "Not initialized";
- break;
- case Status.ERROR_CAS_DECRYPT:
- diagnosticInfo = "Decrypt error";
- break;
- default:
- diagnosticInfo = "Unknown CAS state exception";
- break;
+ case Status.ERROR_CAS_UNKNOWN:
+ diagnosticInfo = "General CAS error";
+ break;
+ case Status.ERROR_CAS_NO_LICENSE:
+ diagnosticInfo = "No license";
+ break;
+ case Status.ERROR_CAS_LICENSE_EXPIRED:
+ diagnosticInfo = "License expired";
+ break;
+ case Status.ERROR_CAS_SESSION_NOT_OPENED:
+ diagnosticInfo = "Session not opened";
+ break;
+ case Status.ERROR_CAS_CANNOT_HANDLE:
+ diagnosticInfo = "Unsupported scheme or data format";
+ break;
+ case Status.ERROR_CAS_INVALID_STATE:
+ diagnosticInfo = "Invalid CAS state";
+ break;
+ case Status.ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION:
+ diagnosticInfo = "Insufficient output protection";
+ break;
+ case Status.ERROR_CAS_TAMPER_DETECTED:
+ diagnosticInfo = "Tamper detected";
+ break;
+ case Status.ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED:
+ diagnosticInfo = "Not initialized";
+ break;
+ case Status.ERROR_CAS_DECRYPT:
+ diagnosticInfo = "Decrypt error";
+ break;
+ case Status.ERROR_CAS_NEED_ACTIVATION:
+ diagnosticInfo = "Need Activation";
+ break;
+ case Status.ERROR_CAS_NEED_PAIRING:
+ diagnosticInfo = "Need Pairing";
+ break;
+ case Status.ERROR_CAS_NO_CARD:
+ diagnosticInfo = "No Card";
+ break;
+ case Status.ERROR_CAS_CARD_MUTE:
+ diagnosticInfo = "Card Muted";
+ break;
+ case Status.ERROR_CAS_CARD_INVALID:
+ diagnosticInfo = "Card Invalid";
+ break;
+ case Status.ERROR_CAS_BLACKOUT:
+ diagnosticInfo = "Blackout";
+ break;
+ case Status.ERROR_CAS_REBOOTING:
+ diagnosticInfo = "Rebooting";
+ break;
+ default:
+ diagnosticInfo = "Unknown CAS state exception";
+ break;
}
throw new MediaCasStateException(err, msg,
String.format("%s (err=%d)", diagnosticInfo, err));
diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java
index 239dfed051ee..eae13d0062e8 100644
--- a/media/java/android/media/MediaRoute2Info.java
+++ b/media/java/android/media/MediaRoute2Info.java
@@ -134,6 +134,59 @@ public final class MediaRoute2Info implements Parcelable {
*/
public static final int DEVICE_TYPE_BLUETOOTH = 3;
+ /**
+ * Media feature: Live audio.
+ * <p>
+ * A route that supports live audio routing will allow the media audio stream
+ * to be sent to supported destinations. This can include internal speakers or
+ * audio jacks on the device itself, A2DP devices, and more.
+ * </p><p>
+ * When a live audio route is selected, audio routing is transparent to the application.
+ * All audio played on the media stream will be routed to the selected destination.
+ * </p><p>
+ * Refer to the class documentation for details about live audio routes.
+ * </p>
+ */
+ public static final String FEATURE_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
+
+ /**
+ * Media feature: Live video.
+ * <p>
+ * A route that supports live video routing will allow a mirrored version
+ * of the device's primary display or a customized
+ * {@link android.app.Presentation Presentation} to be sent to supported
+ * destinations.
+ * </p><p>
+ * When a live video route is selected, audio and video routing is transparent
+ * to the application. By default, audio and video is routed to the selected
+ * destination. For certain live video routes, the application may also use a
+ * {@link android.app.Presentation Presentation} to replace the mirrored view
+ * on the external display with different content.
+ * </p><p>
+ * Refer to the class documentation for details about live video routes.
+ * </p>
+ *
+ * @see android.app.Presentation
+ */
+ public static final String FEATURE_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
+
+ /**
+ * Media feature: Remote playback.
+ * <p>
+ * A route that supports remote playback routing will allow an application to send
+ * requests to play content remotely to supported destinations.
+ * </p><p>
+ * Remote playback routes destinations operate independently of the local device.
+ * When a remote playback route is selected, the application can control the content
+ * playing on the destination using {@link MediaRouter2.RoutingController#getControlHints()}.
+ * The application may also receive status updates from the route regarding remote playback.
+ * </p><p>
+ * Refer to the class documentation for details about remote playback routes.
+ * </p>
+ */
+ public static final String FEATURE_REMOTE_PLAYBACK =
+ "android.media.intent.category.REMOTE_PLAYBACK";
+
final String mId;
final CharSequence mName;
final List<String> mFeatures;
@@ -260,9 +313,8 @@ public final class MediaRoute2Info implements Parcelable {
}
/**
- * Gets the package name of the client that uses the route.
- * Returns null if no clients use this route.
- * @hide
+ * Gets the package name of the app using the route.
+ * Returns null if no apps are using this route.
*/
@Nullable
public String getClientPackageName() {
diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java
index 6bfa851804a1..1e8b18808891 100644
--- a/media/java/android/media/MediaRoute2ProviderService.java
+++ b/media/java/android/media/MediaRoute2ProviderService.java
@@ -18,6 +18,7 @@ package android.media;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+import android.annotation.CallSuper;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Service;
@@ -64,7 +65,6 @@ public abstract class MediaRoute2ProviderService extends Service {
* request.
*
* @see #notifySessionCreated(RoutingSessionInfo, long)
- * @hide
*/
public static final long REQUEST_ID_UNKNOWN = 0;
@@ -82,8 +82,14 @@ public abstract class MediaRoute2ProviderService extends Service {
mHandler = new Handler(Looper.getMainLooper());
}
+ /**
+ * If overriding this method, call through to the super method for any unknown actions.
+ * <p>
+ * {@inheritDoc}
+ */
+ @CallSuper
@Override
- @NonNull
+ @Nullable
public IBinder onBind(@NonNull Intent intent) {
//TODO: Allow binding from media router service only?
if (SERVICE_INTERFACE.equals(intent.getAction())) {
@@ -110,7 +116,6 @@ public abstract class MediaRoute2ProviderService extends Service {
*
* @param routeId the id of the route
* @param volume the target volume
- * @hide
*/
public abstract void onSetVolume(@NonNull String routeId, int volume);
@@ -119,7 +124,6 @@ public abstract class MediaRoute2ProviderService extends Service {
*
* @param routeId id of the route
* @param delta the delta to add to the current volume
- * @hide
*/
public abstract void onUpdateVolume(@NonNull String routeId, int delta);
@@ -129,7 +133,6 @@ public abstract class MediaRoute2ProviderService extends Service {
* @param sessionId id of the session
* @return information of the session with the given id.
* null if the session is released or ID is not valid.
- * @hide
*/
@Nullable
public final RoutingSessionInfo getSessionInfo(@NonNull String sessionId) {
@@ -143,7 +146,6 @@ public abstract class MediaRoute2ProviderService extends Service {
/**
* Gets the list of {@link RoutingSessionInfo session info} that the provider service maintains.
- * @hide
*/
@NonNull
public final List<RoutingSessionInfo> getAllSessionInfo() {
@@ -163,7 +165,7 @@ public abstract class MediaRoute2ProviderService extends Service {
* @param requestId id of the previous request to create this session provided in
* {@link #onCreateSession(String, String, long, Bundle)}
* @see #onCreateSession(String, String, long, Bundle)
- * @hide
+ * @see #getSessionInfo(String)
*/
public final void notifySessionCreated(@NonNull RoutingSessionInfo sessionInfo,
long requestId) {
@@ -197,7 +199,6 @@ public abstract class MediaRoute2ProviderService extends Service {
* @param requestId id of the previous request to create the session provided in
* {@link #onCreateSession(String, String, long, Bundle)}.
* @see #onCreateSession(String, String, long, Bundle)
- * @hide
*/
public final void notifySessionCreationFailed(long requestId) {
if (mClient == null) {
@@ -213,8 +214,6 @@ public abstract class MediaRoute2ProviderService extends Service {
/**
* Notifies the existing session is updated. For example, when
* {@link RoutingSessionInfo#getSelectedRoutes() selected routes} are changed.
- *
- * @hide
*/
public final void notifySessionUpdated(@NonNull RoutingSessionInfo sessionInfo) {
Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
@@ -244,7 +243,6 @@ public abstract class MediaRoute2ProviderService extends Service {
*
* @param sessionId id of the released session.
* @see #onReleaseSession(String)
- * @hide
*/
public final void notifySessionReleased(@NonNull String sessionId) {
if (TextUtils.isEmpty(sessionId)) {
@@ -296,7 +294,6 @@ public abstract class MediaRoute2ProviderService extends Service {
* @see RoutingSessionInfo.Builder#Builder(String, String)
* @see RoutingSessionInfo.Builder#addSelectedRoute(String)
* @see RoutingSessionInfo.Builder#setControlHints(Bundle)
- * @hide
*/
public abstract void onCreateSession(@NonNull String packageName, @NonNull String routeId,
long requestId, @Nullable Bundle sessionHints);
@@ -314,7 +311,6 @@ public abstract class MediaRoute2ProviderService extends Service {
* @param sessionId id of the session being released.
* @see #notifySessionReleased(String)
* @see #getSessionInfo(String)
- * @hide
*/
public abstract void onReleaseSession(@NonNull String sessionId);
@@ -326,7 +322,6 @@ public abstract class MediaRoute2ProviderService extends Service {
*
* @param sessionId id of the session
* @param routeId id of the route
- * @hide
*/
public abstract void onSelectRoute(@NonNull String sessionId, @NonNull String routeId);
@@ -338,7 +333,6 @@ public abstract class MediaRoute2ProviderService extends Service {
*
* @param sessionId id of the session
* @param routeId id of the route
- * @hide
*/
public abstract void onDeselectRoute(@NonNull String sessionId, @NonNull String routeId);
@@ -350,7 +344,6 @@ public abstract class MediaRoute2ProviderService extends Service {
*
* @param sessionId id of the session
* @param routeId id of the route
- * @hide
*/
public abstract void onTransferToRoute(@NonNull String sessionId, @NonNull String routeId);
@@ -370,9 +363,8 @@ public abstract class MediaRoute2ProviderService extends Service {
* </p>
*
* @param preference the new discovery preference
- *
- * TODO: This method needs tests.
*/
+ // TODO: This method needs tests.
public void onDiscoveryPreferenceChanged(@NonNull RouteDiscoveryPreference preference) {}
/**
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index 51d08ec96e6f..18670e9a6fe2 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -35,6 +35,7 @@ import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -49,9 +50,9 @@ import java.util.stream.Collectors;
* Media Router 2 allows applications to control the routing of media channels
* and streams from the current device to remote speakers and devices.
*
- * TODO: Add method names at the beginning of log messages. (e.g. changeSessionInfoOnHandler)
- * Not only MediaRouter2, but also to service / manager / provider.
*/
+// TODO: Add method names at the beginning of log messages. (e.g. updateControllerOnHandler)
+// Not only MediaRouter2, but also to service / manager / provider.
public class MediaRouter2 {
private static final String TAG = "MR2";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -66,16 +67,18 @@ public class MediaRouter2 {
private final CopyOnWriteArrayList<RouteCallbackRecord> mRouteCallbackRecords =
new CopyOnWriteArrayList<>();
- private final CopyOnWriteArrayList<SessionCallbackRecord> mSessionCallbackRecords =
+ private final CopyOnWriteArrayList<ControllerCallbackRecord> mControllerCallbackRecords =
new CopyOnWriteArrayList<>();
- private final CopyOnWriteArrayList<SessionCreationRequest> mSessionCreationRequests =
+ private final CopyOnWriteArrayList<ControllerCreationRequest> mControllerCreationRequests =
new CopyOnWriteArrayList<>();
private final String mPackageName;
@GuardedBy("sRouterLock")
final Map<String, MediaRoute2Info> mRoutes = new HashMap<>();
+ final RoutingController mSystemController;
+
@GuardedBy("sRouterLock")
private RouteDiscoveryPreference mDiscoveryPreference = RouteDiscoveryPreference.EMPTY;
@@ -86,13 +89,13 @@ public class MediaRouter2 {
@GuardedBy("sRouterLock")
private Map<String, RoutingController> mRoutingControllers = new ArrayMap<>();
- private AtomicInteger mSessionCreationRequestCnt = new AtomicInteger(1);
+ private AtomicInteger mControllerCreationRequestCnt = new AtomicInteger(1);
final Handler mHandler;
@GuardedBy("sRouterLock")
private boolean mShouldUpdateRoutes;
private volatile List<MediaRoute2Info> mFilteredRoutes = Collections.emptyList();
- private volatile OnCreateSessionListener mOnCreateSessionListener;
+ private volatile OnGetControllerHintsListener mOnGetControllerHintsListener;
/**
* Gets an instance of the media router associated with the context.
@@ -116,19 +119,26 @@ public class MediaRouter2 {
mHandler = new Handler(Looper.getMainLooper());
List<MediaRoute2Info> currentSystemRoutes = null;
+ RoutingSessionInfo currentSystemSessionInfo = null;
try {
currentSystemRoutes = mMediaRouterService.getSystemRoutes();
+ currentSystemSessionInfo = mMediaRouterService.getSystemSessionInfo();
} catch (RemoteException ex) {
- Log.e(TAG, "Unable to get current currentSystemRoutes", ex);
+ Log.e(TAG, "Unable to get current system's routes / session info", ex);
}
if (currentSystemRoutes == null || currentSystemRoutes.isEmpty()) {
throw new RuntimeException("Null or empty currentSystemRoutes. Something is wrong.");
}
+ if (currentSystemSessionInfo == null) {
+ throw new RuntimeException("Null currentSystemSessionInfo. Something is wrong.");
+ }
+
for (MediaRoute2Info route : currentSystemRoutes) {
mRoutes.put(route.getId(), route);
}
+ mSystemController = new SystemRoutingController(currentSystemSessionInfo);
}
/**
@@ -242,23 +252,22 @@ public class MediaRouter2 {
}
/**
- * Registers a callback to get updates on creations and changes of routing sessions.
+ * Registers a callback to get updates on creations and changes of
+ * {@link RoutingController routing controllers}.
* If you register the same callback twice or more, it will be ignored.
*
* @param executor the executor to execute the callback on
* @param callback the callback to register
- * @see #unregisterSessionCallback
- * @hide
+ * @see #unregisterControllerCallback
*/
- @NonNull
- public void registerSessionCallback(@CallbackExecutor Executor executor,
- @NonNull SessionCallback callback) {
+ public void registerControllerCallback(@NonNull @CallbackExecutor Executor executor,
+ @NonNull RoutingControllerCallback callback) {
Objects.requireNonNull(executor, "executor must not be null");
Objects.requireNonNull(callback, "callback must not be null");
- SessionCallbackRecord record = new SessionCallbackRecord(executor, callback);
- if (!mSessionCallbackRecords.addIfAbsent(record)) {
- Log.w(TAG, "Ignoring the same session callback");
+ ControllerCallbackRecord record = new ControllerCallbackRecord(executor, callback);
+ if (!mControllerCallbackRecords.addIfAbsent(record)) {
+ Log.w(TAG, "Ignoring the same controller callback");
return;
}
}
@@ -268,59 +277,54 @@ public class MediaRouter2 {
* If the callback has not been added or been removed already, it is ignored.
*
* @param callback the callback to unregister
- * @see #registerSessionCallback
- * @hide
+ * @see #registerControllerCallback
*/
- @NonNull
- public void unregisterSessionCallback(@NonNull SessionCallback callback) {
+ public void unregisterControllerCallback(@NonNull RoutingControllerCallback callback) {
Objects.requireNonNull(callback, "callback must not be null");
- if (!mSessionCallbackRecords.remove(new SessionCallbackRecord(null, callback))) {
- Log.w(TAG, "Ignoring unknown session callback");
+ if (!mControllerCallbackRecords.remove(new ControllerCallbackRecord(null, callback))) {
+ Log.w(TAG, "Ignoring unknown controller callback");
return;
}
}
/**
- * Sets an {@link OnCreateSessionListener} to send hints when creating a session.
- * To send the hints, listener should be set <em>BEFORE</em> calling
- * {@link #requestCreateSession(MediaRoute2Info)}.
+ * Sets an {@link OnGetControllerHintsListener} to send hints when creating a
+ * {@link RoutingController}. To send the hints, listener should be set <em>BEFORE</em> calling
+ * {@link #requestCreateController(MediaRoute2Info)}.
*
- * @param listener A listener to send optional app-specific hints when creating a session.
+ * @param listener A listener to send optional app-specific hints when creating a controller.
* {@code null} for unset.
- * @hide
*/
- public void setOnCreateSessionListener(@Nullable OnCreateSessionListener listener) {
- mOnCreateSessionListener = listener;
+ public void setOnGetControllerHintsListener(@Nullable OnGetControllerHintsListener listener) {
+ mOnGetControllerHintsListener = listener;
}
/**
- * Requests the media route provider service to create a session with the given route.
+ * Requests the media route provider service to create a {@link RoutingController}
+ * with the given route.
*
- * @param route the route you want to create a session with.
+ * @param route the route you want to create a controller with.
*
- * @see SessionCallback#onSessionCreated
- * @see SessionCallback#onSessionCreationFailed
- * @hide
+ * @see RoutingControllerCallback#onControllerCreated
+ * @see RoutingControllerCallback#onControllerCreationFailed
*/
- @NonNull
- public void requestCreateSession(@NonNull MediaRoute2Info route) {
+ public void requestCreateController(@NonNull MediaRoute2Info route) {
Objects.requireNonNull(route, "route must not be null");
// TODO: Check the given route exists
final int requestId;
- requestId = mSessionCreationRequestCnt.getAndIncrement();
+ requestId = mControllerCreationRequestCnt.getAndIncrement();
- SessionCreationRequest request = new SessionCreationRequest(requestId, route);
- mSessionCreationRequests.add(request);
+ ControllerCreationRequest request = new ControllerCreationRequest(requestId, route);
+ mControllerCreationRequests.add(request);
-
- OnCreateSessionListener listener = mOnCreateSessionListener;
- Bundle sessionHints = null;
+ OnGetControllerHintsListener listener = mOnGetControllerHintsListener;
+ Bundle controllerHints = null;
if (listener != null) {
- sessionHints = listener.onCreateSession(route);
- if (sessionHints != null) {
- sessionHints = new Bundle(sessionHints);
+ controllerHints = listener.onGetControllerHints(route);
+ if (controllerHints != null) {
+ controllerHints = new Bundle(controllerHints);
}
}
@@ -330,10 +334,9 @@ public class MediaRouter2 {
}
if (client != null) {
try {
- mMediaRouterService.requestCreateSession(client, route, requestId,
- sessionHints);
+ mMediaRouterService.requestCreateSession(client, route, requestId, controllerHints);
} catch (RemoteException ex) {
- Log.e(TAG, "Unable to request to create session.", ex);
+ Log.e(TAG, "Unable to request to create controller.", ex);
mHandler.sendMessage(obtainMessage(MediaRouter2::createControllerOnHandler,
MediaRouter2.this, null, requestId));
}
@@ -341,6 +344,41 @@ public class MediaRouter2 {
}
/**
+ * Gets a {@link RoutingController} which can control the routes provided by system.
+ * e.g. Phone speaker, wired headset, Bluetooth, etc.
+ * <p>
+ * Note: The system controller can't be released. Calling {@link RoutingController#release()}
+ * will be ignored.
+ * <p>
+ * This method will always return the same instance.
+ */
+ @NonNull
+ public RoutingController getSystemController() {
+ return mSystemController;
+ }
+
+ /**
+ * Gets the list of currently non-released {@link RoutingController routing controllers}.
+ * <p>
+ * Note: The list returned here will never be empty. The first element in the list is
+ * always the {@link #getSystemController() system controller}.
+ */
+ @NonNull
+ public List<RoutingController> getControllers() {
+ List<RoutingController> result = new ArrayList<>();
+ result.add(0, mSystemController);
+
+ Collection<RoutingController> controllers;
+ synchronized (sRouterLock) {
+ controllers = mRoutingControllers.values();
+ if (controllers != null) {
+ result.addAll(controllers);
+ }
+ }
+ return result;
+ }
+
+ /**
* Sends a media control request to be performed asynchronously by the route's destination.
*
* @param route the route that will receive the control request
@@ -468,15 +506,15 @@ public class MediaRouter2 {
}
/**
- * Creates a controller and calls the {@link SessionCallback#onSessionCreated}.
- * If session creation has failed, then it calls
- * {@link SessionCallback#onSessionCreationFailed}.
+ * Creates a controller and calls the {@link RoutingControllerCallback#onControllerCreated}.
+ * If the controller creation has failed, then it calls
+ * {@link RoutingControllerCallback#onControllerCreationFailed}.
* <p>
* Pass {@code null} to sessionInfo for the failure case.
*/
void createControllerOnHandler(@Nullable RoutingSessionInfo sessionInfo, int requestId) {
- SessionCreationRequest matchingRequest = null;
- for (SessionCreationRequest request : mSessionCreationRequests) {
+ ControllerCreationRequest matchingRequest = null;
+ for (ControllerCreationRequest request : mControllerCreationRequests) {
if (request.mRequestId == requestId) {
matchingRequest = request;
break;
@@ -484,21 +522,21 @@ public class MediaRouter2 {
}
if (matchingRequest != null) {
- mSessionCreationRequests.remove(matchingRequest);
+ mControllerCreationRequests.remove(matchingRequest);
MediaRoute2Info requestedRoute = matchingRequest.mRoute;
if (sessionInfo == null) {
// TODO: We may need to distinguish between failure and rejection.
// One way can be introducing 'reason'.
- notifySessionCreationFailed(requestedRoute);
+ notifyControllerCreationFailed(requestedRoute);
return;
} else if (!sessionInfo.getSelectedRoutes().contains(requestedRoute.getId())) {
Log.w(TAG, "The session does not contain the requested route. "
+ "(requestedRouteId=" + requestedRoute.getId()
+ ", actualRoutes=" + sessionInfo.getSelectedRoutes()
+ ")");
- notifySessionCreationFailed(requestedRoute);
+ notifyControllerCreationFailed(requestedRoute);
return;
} else if (!TextUtils.equals(requestedRoute.getProviderId(),
sessionInfo.getProviderId())) {
@@ -506,7 +544,7 @@ public class MediaRouter2 {
+ "(requested route's providerId=" + requestedRoute.getProviderId()
+ ", actual providerId=" + sessionInfo.getProviderId()
+ ")");
- notifySessionCreationFailed(requestedRoute);
+ notifyControllerCreationFailed(requestedRoute);
return;
}
}
@@ -514,15 +552,23 @@ public class MediaRouter2 {
if (sessionInfo != null) {
RoutingController controller = new RoutingController(sessionInfo);
synchronized (sRouterLock) {
- mRoutingControllers.put(controller.getSessionId(), controller);
+ mRoutingControllers.put(controller.getId(), controller);
}
- notifySessionCreated(controller);
+ notifyControllerCreated(controller);
}
}
- void changeSessionInfoOnHandler(RoutingSessionInfo sessionInfo) {
+ void updateControllerOnHandler(RoutingSessionInfo sessionInfo) {
if (sessionInfo == null) {
- Log.w(TAG, "changeSessionInfoOnHandler: Ignoring null sessionInfo.");
+ Log.w(TAG, "updateControllerOnHandler: Ignoring null sessionInfo.");
+ return;
+ }
+
+ if (sessionInfo.isSystemSession()) {
+ // The session info is sent from SystemMediaRoute2Provider.
+ RoutingController systemController = getSystemController();
+ systemController.setRoutingSessionInfo(sessionInfo);
+ notifyControllerUpdated(systemController);
return;
}
@@ -532,20 +578,20 @@ public class MediaRouter2 {
}
if (matchingController == null) {
- Log.w(TAG, "changeSessionInfoOnHandler: Matching controller not found. uniqueSessionId="
+ Log.w(TAG, "updateControllerOnHandler: Matching controller not found. uniqueSessionId="
+ sessionInfo.getId());
return;
}
RoutingSessionInfo oldInfo = matchingController.getRoutingSessionInfo();
if (!TextUtils.equals(oldInfo.getProviderId(), sessionInfo.getProviderId())) {
- Log.w(TAG, "changeSessionInfoOnHandler: Provider IDs are not matched. old="
+ Log.w(TAG, "updateControllerOnHandler: Provider IDs are not matched. old="
+ oldInfo.getProviderId() + ", new=" + sessionInfo.getProviderId());
return;
}
matchingController.setRoutingSessionInfo(sessionInfo);
- notifySessionInfoChanged(matchingController, oldInfo, sessionInfo);
+ notifyControllerUpdated(matchingController);
}
void releaseControllerOnHandler(RoutingSessionInfo sessionInfo) {
@@ -575,11 +621,15 @@ public class MediaRouter2 {
return;
}
+ boolean removed;
synchronized (sRouterLock) {
- mRoutingControllers.remove(uniqueSessionId, matchingController);
+ removed = mRoutingControllers.remove(uniqueSessionId, matchingController);
+ }
+
+ if (removed) {
+ matchingController.release();
+ notifyControllerReleased(matchingController);
}
- matchingController.release();
- notifyControllerReleased(matchingController);
}
private List<MediaRoute2Info> filterRoutes(List<MediaRoute2Info> routes,
@@ -620,33 +670,31 @@ public class MediaRouter2 {
}
}
- private void notifySessionCreated(RoutingController controller) {
- for (SessionCallbackRecord record: mSessionCallbackRecords) {
+ private void notifyControllerCreated(RoutingController controller) {
+ for (ControllerCallbackRecord record: mControllerCallbackRecords) {
record.mExecutor.execute(
- () -> record.mSessionCallback.onSessionCreated(controller));
+ () -> record.mControllerCallback.onControllerCreated(controller));
}
}
- private void notifySessionCreationFailed(MediaRoute2Info route) {
- for (SessionCallbackRecord record: mSessionCallbackRecords) {
+ private void notifyControllerCreationFailed(MediaRoute2Info route) {
+ for (ControllerCallbackRecord record: mControllerCallbackRecords) {
record.mExecutor.execute(
- () -> record.mSessionCallback.onSessionCreationFailed(route));
+ () -> record.mControllerCallback.onControllerCreationFailed(route));
}
}
- private void notifySessionInfoChanged(RoutingController controller,
- RoutingSessionInfo oldInfo, RoutingSessionInfo newInfo) {
- for (SessionCallbackRecord record: mSessionCallbackRecords) {
+ private void notifyControllerUpdated(RoutingController controller) {
+ for (ControllerCallbackRecord record: mControllerCallbackRecords) {
record.mExecutor.execute(
- () -> record.mSessionCallback.onSessionInfoChanged(
- controller, oldInfo, newInfo));
+ () -> record.mControllerCallback.onControllerUpdated(controller));
}
}
private void notifyControllerReleased(RoutingController controller) {
- for (SessionCallbackRecord record: mSessionCallbackRecords) {
+ for (ControllerCallbackRecord record: mControllerCallbackRecords) {
record.mExecutor.execute(
- () -> record.mSessionCallback.onSessionReleased(controller));
+ () -> record.mControllerCallback.onControllerReleased(controller));
}
}
@@ -673,100 +721,86 @@ public class MediaRouter2 {
* Called when routes are changed. For example, it is called when the route's name
* or volume have been changed.
*
- * TODO: Write here what the developers should do when this method is called.
- * How they can find the exact point how a route is changed?
- * It can be a volume, name, client package name, ....
- *
* @param routes the list of routes that have been changed. It's never empty.
*/
public void onRoutesChanged(@NonNull List<MediaRoute2Info> routes) {}
}
/**
- * Callback for receiving a result of session creation and session updates.
- * @hide
+ * Callback for receiving a result of {@link RoutingController} creation and updates.
*/
- public static class SessionCallback {
+ public static class RoutingControllerCallback {
/**
- * Called when the routing session is created by the route provider.
+ * Called when the {@link RoutingController} is created.
+ * A {@link RoutingController} can be created by calling
+ * {@link #requestCreateController(MediaRoute2Info)}, or by the system.
*
- * @param controller the controller to control the created session
+ * @param controller the controller to control routes
*/
- public void onSessionCreated(@NonNull RoutingController controller) {}
+ public void onControllerCreated(@NonNull RoutingController controller) {}
/**
- * Called when the session creation request failed.
+ * Called when the controller creation request failed.
*
- * @param requestedRoute the route info which was used for the request
+ * @param requestedRoute the route info which was used for the creation request
*/
- public void onSessionCreationFailed(@NonNull MediaRoute2Info requestedRoute) {}
+ public void onControllerCreationFailed(@NonNull MediaRoute2Info requestedRoute) {}
/**
- * Called when the session info has changed.
+ * Called when the controller is updated.
*
- * @param oldInfo the session info before the session changed.
- * @prarm newInfo the changed session info
- *
- * TODO: (Discussion) Do we really need newInfo? The controller has the newInfo.
- * However. there can be timing issue if there is no newInfo.
+ * @param controller the updated controller. Can be the system controller.
+ * @see #getSystemController()
*/
- public void onSessionInfoChanged(@NonNull RoutingController controller,
- @NonNull RoutingSessionInfo oldInfo,
- @NonNull RoutingSessionInfo newInfo) {}
+ public void onControllerUpdated(@NonNull RoutingController controller) {}
/**
- * Called when the session is released by {@link MediaRoute2ProviderService}.
- * Before this method is called, the controller would be released by the system,
- * which means the {@link RoutingController#isReleased()} will always return true
+ * Called when a routing controller is released. It can be released in two cases:
+ * <ul>
+ * <li>When {@link RoutingController#release()} is called.</li>
+ * <li>When the remote session in the provider is destroyed.</li>
+ * </ul>
+ * {@link RoutingController#isReleased()} will always return {@code true}
* for the {@code controller} here.
- * <p>
- * Note: Calling {@link RoutingController#release()} will <em>NOT</em> trigger
- * this method to be called.
- *
- * TODO: Add tests for checking whether this method is called.
- * TODO: When service process dies, this should be called.
*
+ * @see RoutingController#release()
* @see RoutingController#isReleased()
*/
- public void onSessionReleased(@NonNull RoutingController controller) {}
+ // TODO: Add tests for checking whether this method is called.
+ // TODO: When service process dies, this should be called.
+ public void onControllerReleased(@NonNull RoutingController controller) {}
}
/**
- * A listener interface to send an optional app-specific hints when creating a session.
- *
- * @hide
+ * A listener interface to send an optional app-specific hints when creating the
+ * {@link RoutingController}.
*/
- public interface OnCreateSessionListener {
+ public interface OnGetControllerHintsListener {
/**
* Called when the {@link MediaRouter2} is about to request
- * the media route provider service to create a session with the given route.
- * The {@link Bundle} returned here will be sent to media route provider service as a hint
- * for creating a session.
- * <p>
- * To send hints when creating the session, set this listener before calling
- * {@link #requestCreateSession(MediaRoute2Info)}.
+ * the media route provider service to create a controller with the given route.
+ * The {@link Bundle} returned here will be sent to media route provider service as a hint.
* <p>
- * This will be called on the same thread which calls
- * {@link #requestCreateSession(MediaRoute2Info)}.
+ * To send hints when creating the controller, set the listener before calling
+ * {@link #requestCreateController(MediaRoute2Info)}. The method will be called
+ * on the same thread which calls {@link #requestCreateController(MediaRoute2Info)}.
*
- * @param route The route to create session with
+ * @param route The route to create controller with
* @return An optional bundle of app-specific arguments to send to the provider,
* or null if none. The contents of this bundle may affect the result of
- * session creation.
+ * controller creation.
* @see MediaRoute2ProviderService#onCreateSession(String, String, long, Bundle)
*/
@Nullable
- Bundle onCreateSession(@NonNull MediaRoute2Info route);
+ Bundle onGetControllerHints(@NonNull MediaRoute2Info route);
}
/**
* A class to control media routing session in media route provider.
* For example, selecting/deselcting/transferring routes to session can be done through this
- * class. Instances are created by {@link MediaRouter2}.
- *
- * @hide
+ * class. Instances are created by {@link #requestCreateController(MediaRoute2Info)}.
*/
- public final class RoutingController {
+ public class RoutingController {
private final Object mControllerLock = new Object();
@GuardedBy("mControllerLock")
@@ -780,9 +814,10 @@ public class MediaRouter2 {
}
/**
- * @return the ID of the session
+ * @return the ID of the controller
*/
- public String getSessionId() {
+ @NonNull
+ public String getId() {
synchronized (mControllerLock) {
return mSessionInfo.getId();
}
@@ -839,7 +874,7 @@ public class MediaRouter2 {
}
/**
- * Returns true if the session is released, false otherwise.
+ * Returns true if this controller is released, false otherwise.
* If it is released, then all other getters from this instance may return invalid values.
* Also, any operations to this instance will be ignored once released.
*
@@ -862,7 +897,7 @@ public class MediaRouter2 {
*
* @see #getSelectedRoutes()
* @see #getSelectableRoutes()
- * @see SessionCallback#onSessionInfoChanged
+ * @see RoutingControllerCallback#onControllerUpdated
*/
public void selectRoute(@NonNull MediaRoute2Info route) {
Objects.requireNonNull(route, "route must not be null");
@@ -891,7 +926,7 @@ public class MediaRouter2 {
}
if (client != null) {
try {
- mMediaRouterService.selectRoute(client, getSessionId(), route);
+ mMediaRouterService.selectRoute(client, getId(), route);
} catch (RemoteException ex) {
Log.e(TAG, "Unable to select route for session.", ex);
}
@@ -909,7 +944,7 @@ public class MediaRouter2 {
*
* @see #getSelectedRoutes()
* @see #getDeselectableRoutes()
- * @see SessionCallback#onSessionInfoChanged
+ * @see RoutingControllerCallback#onControllerUpdated
*/
public void deselectRoute(@NonNull MediaRoute2Info route) {
Objects.requireNonNull(route, "route must not be null");
@@ -938,7 +973,7 @@ public class MediaRouter2 {
}
if (client != null) {
try {
- mMediaRouterService.deselectRoute(client, getSessionId(), route);
+ mMediaRouterService.deselectRoute(client, getId(), route);
} catch (RemoteException ex) {
Log.e(TAG, "Unable to remove route from session.", ex);
}
@@ -956,7 +991,7 @@ public class MediaRouter2 {
*
* @see #getSelectedRoutes()
* @see #getTransferrableRoutes()
- * @see SessionCallback#onSessionInfoChanged
+ * @see RoutingControllerCallback#onControllerUpdated
*/
public void transferToRoute(@NonNull MediaRoute2Info route) {
Objects.requireNonNull(route, "route must not be null");
@@ -986,7 +1021,7 @@ public class MediaRouter2 {
}
if (client != null) {
try {
- mMediaRouterService.transferToRoute(client, getSessionId(), route);
+ mMediaRouterService.transferToRoute(client, getId(), route);
} catch (RemoteException ex) {
Log.e(TAG, "Unable to transfer to route for session.", ex);
}
@@ -997,9 +1032,8 @@ public class MediaRouter2 {
* Release this controller and corresponding session.
* Any operations on this controller after calling this method will be ignored.
* The devices that are playing media will stop playing it.
- *
- * TODO: Add tests using {@link MediaRouter2Manager#getActiveSessions()}.
*/
+ // TODO: Add tests using {@link MediaRouter2Manager#getActiveSessions()}.
public void release() {
synchronized (mControllerLock) {
if (mIsReleased) {
@@ -1010,13 +1044,19 @@ public class MediaRouter2 {
}
Client2 client;
+ boolean removed;
synchronized (sRouterLock) {
- mRoutingControllers.remove(getSessionId(), this);
+ removed = mRoutingControllers.remove(getId(), this);
client = mClient;
}
+
+ if (removed) {
+ mHandler.post(() -> notifyControllerReleased(RoutingController.this));
+ }
+
if (client != null) {
try {
- mMediaRouterService.releaseSession(client, getSessionId());
+ mMediaRouterService.releaseSession(client, getId());
} catch (RemoteException ex) {
Log.e(TAG, "Unable to notify of controller release", ex);
}
@@ -1037,7 +1077,7 @@ public class MediaRouter2 {
StringBuilder result = new StringBuilder()
.append("RoutingController{ ")
- .append("sessionId=").append(getSessionId())
+ .append("id=").append(getId())
.append(", selectedRoutes={")
.append(selectedRoutes)
.append("}")
@@ -1074,7 +1114,6 @@ public class MediaRouter2 {
// TODO: This method uses two locks (mLock outside, sLock inside).
// Check if there is any possiblity of deadlock.
private List<MediaRoute2Info> getRoutesWithIdsLocked(List<String> routeIds) {
-
List<MediaRoute2Info> routes = new ArrayList<>();
synchronized (sRouterLock) {
// TODO: Maybe able to change using Collection.stream()?
@@ -1089,6 +1128,23 @@ public class MediaRouter2 {
}
}
+ class SystemRoutingController extends RoutingController {
+ SystemRoutingController(@NonNull RoutingSessionInfo sessionInfo) {
+ super(sessionInfo);
+ }
+
+ @Override
+ public void release() {
+ // Do nothing. SystemRoutingController will never be released
+ }
+
+ @Override
+ public boolean isReleased() {
+ // SystemRoutingController will never be released
+ return false;
+ }
+ }
+
final class RouteCallbackRecord {
public final Executor mExecutor;
public final RouteCallback mRouteCallback;
@@ -1118,13 +1174,13 @@ public class MediaRouter2 {
}
}
- final class SessionCallbackRecord {
+ final class ControllerCallbackRecord {
public final Executor mExecutor;
- public final SessionCallback mSessionCallback;
+ public final RoutingControllerCallback mControllerCallback;
- SessionCallbackRecord(@NonNull Executor executor,
- @NonNull SessionCallback sessionCallback) {
- mSessionCallback = sessionCallback;
+ ControllerCallbackRecord(@NonNull Executor executor,
+ @NonNull RoutingControllerCallback controllerCallback) {
+ mControllerCallback = controllerCallback;
mExecutor = executor;
}
@@ -1133,23 +1189,24 @@ public class MediaRouter2 {
if (this == obj) {
return true;
}
- if (!(obj instanceof SessionCallbackRecord)) {
+ if (!(obj instanceof ControllerCallbackRecord)) {
return false;
}
- return mSessionCallback == ((SessionCallbackRecord) obj).mSessionCallback;
+ return mControllerCallback
+ == ((ControllerCallbackRecord) obj).mControllerCallback;
}
@Override
public int hashCode() {
- return mSessionCallback.hashCode();
+ return mControllerCallback.hashCode();
}
}
- final class SessionCreationRequest {
+ final class ControllerCreationRequest {
public final MediaRoute2Info mRoute;
public final int mRequestId;
- SessionCreationRequest(int requestId, @NonNull MediaRoute2Info route) {
+ ControllerCreationRequest(int requestId, @NonNull MediaRoute2Info route) {
mRoute = route;
mRequestId = requestId;
}
@@ -1185,7 +1242,7 @@ public class MediaRouter2 {
@Override
public void notifySessionInfoChanged(@Nullable RoutingSessionInfo sessionInfo) {
- mHandler.sendMessage(obtainMessage(MediaRouter2::changeSessionInfoOnHandler,
+ mHandler.sendMessage(obtainMessage(MediaRouter2::updateControllerOnHandler,
MediaRouter2.this, sessionInfo));
}
diff --git a/media/java/android/media/MediaRouter2Utils.java b/media/java/android/media/MediaRouter2Utils.java
index 49045828dbe8..c15972dcff2e 100644
--- a/media/java/android/media/MediaRouter2Utils.java
+++ b/media/java/android/media/MediaRouter2Utils.java
@@ -29,9 +29,6 @@ public class MediaRouter2Utils {
static final String TAG = "MR2Utils";
static final String SEPARATOR = ":";
- /**
- * @hide
- */
@NonNull
public static String toUniqueId(@NonNull String providerId, @NonNull String id) {
if (TextUtils.isEmpty(providerId)) {
@@ -49,8 +46,6 @@ public class MediaRouter2Utils {
/**
* Gets provider ID from unique ID.
* If the corresponding provider ID could not be generated, it will return null.
- *
- * @hide
*/
@Nullable
public static String getProviderId(@NonNull String uniqueId) {
@@ -75,8 +70,6 @@ public class MediaRouter2Utils {
/**
* Gets the original ID (i.e. non-unique route/session ID) from unique ID.
* If the corresponding ID could not be generated, it will return null.
- *
- * @hide
*/
@Nullable
public static String getOriginalId(@NonNull String uniqueId) {
diff --git a/media/java/android/media/RoutingSessionInfo.java b/media/java/android/media/RoutingSessionInfo.java
index 228addebe029..5383ea219c57 100644
--- a/media/java/android/media/RoutingSessionInfo.java
+++ b/media/java/android/media/RoutingSessionInfo.java
@@ -31,7 +31,6 @@ import java.util.Objects;
/**
* Describes a routing session which is created when a media route is selected.
- * @hide
*/
public final class RoutingSessionInfo implements Parcelable {
@NonNull
@@ -59,6 +58,7 @@ public final class RoutingSessionInfo implements Parcelable {
final List<String> mTransferrableRoutes;
@Nullable
final Bundle mControlHints;
+ final boolean mIsSystemSession;
RoutingSessionInfo(@NonNull Builder builder) {
Objects.requireNonNull(builder, "builder must not be null.");
@@ -78,6 +78,7 @@ public final class RoutingSessionInfo implements Parcelable {
convertToUniqueRouteIds(builder.mTransferrableRoutes));
mControlHints = builder.mControlHints;
+ mIsSystemSession = builder.mIsSystemSession;
}
RoutingSessionInfo(@NonNull Parcel src) {
@@ -93,6 +94,7 @@ public final class RoutingSessionInfo implements Parcelable {
mTransferrableRoutes = ensureList(src.createStringArrayList());
mControlHints = src.readBundle();
+ mIsSystemSession = src.readBoolean();
}
private static String ensureString(String str) {
@@ -193,6 +195,15 @@ public final class RoutingSessionInfo implements Parcelable {
return mControlHints;
}
+ /**
+ * Gets whether this session is in system media route provider.
+ * @hide
+ */
+ @Nullable
+ public boolean isSystemSession() {
+ return mIsSystemSession;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -208,6 +219,7 @@ public final class RoutingSessionInfo implements Parcelable {
dest.writeStringList(mDeselectableRoutes);
dest.writeStringList(mTransferrableRoutes);
dest.writeBundle(mControlHints);
+ dest.writeBoolean(mIsSystemSession);
}
@Override
@@ -278,6 +290,7 @@ public final class RoutingSessionInfo implements Parcelable {
* Builder class for {@link RoutingSessionInfo}.
*/
public static final class Builder {
+ // TODO: Reorder these (important ones first)
final String mId;
final String mClientPackageName;
String mProviderId;
@@ -286,6 +299,7 @@ public final class RoutingSessionInfo implements Parcelable {
final List<String> mDeselectableRoutes;
final List<String> mTransferrableRoutes;
Bundle mControlHints;
+ boolean mIsSystemSession;
/**
* Constructor for builder to create {@link RoutingSessionInfo}.
@@ -333,6 +347,7 @@ public final class RoutingSessionInfo implements Parcelable {
mTransferrableRoutes = new ArrayList<>(sessionInfo.mTransferrableRoutes);
mControlHints = sessionInfo.mControlHints;
+ mIsSystemSession = sessionInfo.mIsSystemSession;
}
/**
@@ -491,6 +506,16 @@ public final class RoutingSessionInfo implements Parcelable {
}
/**
+ * Sets whether this session is in system media route provider.
+ * @hide
+ */
+ @NonNull
+ public Builder setSystemSession(boolean isSystemSession) {
+ mIsSystemSession = isSystemSession;
+ return this;
+ }
+
+ /**
* Builds a routing session info.
*
* @throws IllegalArgumentException if no selected routes are added.
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index 630d8191eff0..fc5d67d50ee5 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -110,12 +110,20 @@ public final class TvInputManager {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef({VIDEO_UNAVAILABLE_REASON_UNKNOWN, VIDEO_UNAVAILABLE_REASON_TUNING,
- VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL, VIDEO_UNAVAILABLE_REASON_BUFFERING,
- VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY})
+ VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL, VIDEO_UNAVAILABLE_REASON_BUFFERING,
+ VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY, VIDEO_UNAVAILABLE_REASON_INSUFFICIENT_RESOURCE,
+ VIDEO_UNAVAILABLE_REASON_CAS_INSUFFICIENT_OUTPUT_PROTECTION,
+ VIDEO_UNAVAILABLE_REASON_CAS_PVR_RECORDING_NOT_ALLOWED,
+ VIDEO_UNAVAILABLE_REASON_CAS_PVR_RECORDING_NOT_ALLOWED,
+ VIDEO_UNAVAILABLE_REASON_CAS_NO_LICENSE, VIDEO_UNAVAILABLE_REASON_CAS_LICENSE_EXPIRED,
+ VIDEO_UNAVAILABLE_REASON_CAS_NEED_ACTIVATION, VIDEO_UNAVAILABLE_REASON_CAS_NEED_PAIRING,
+ VIDEO_UNAVAILABLE_REASON_CAS_NO_CARD, VIDEO_UNAVAILABLE_REASON_CAS_CARD_MUTE,
+ VIDEO_UNAVAILABLE_REASON_CAS_CARD_INVALID, VIDEO_UNAVAILABLE_REASON_CAS_BLACKOUT,
+ VIDEO_UNAVAILABLE_REASON_CAS_REBOOTING, VIDEO_UNAVAILABLE_REASON_CAS_UNKNOWN})
public @interface VideoUnavailableReason {}
static final int VIDEO_UNAVAILABLE_REASON_START = 0;
- static final int VIDEO_UNAVAILABLE_REASON_END = 5;
+ static final int VIDEO_UNAVAILABLE_REASON_END = 18;
/**
* Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
@@ -151,9 +159,88 @@ public final class TvInputManager {
* Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
* {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
* the source is not physically connected, for example the HDMI cable is not connected.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_NOT_CONNECTED = 5;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * the resource is not enough to meet requirement.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_INSUFFICIENT_RESOURCE = 6;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * the output protection level enabled on the device is not sufficient to meet the requirements
+ * in the license policy.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_INSUFFICIENT_OUTPUT_PROTECTION = 7;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * the PVR record is not allowed by the license policy.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_PVR_RECORDING_NOT_ALLOWED = 8;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * no license keys have been provided.
* @hide
*/
- public static final int VIDEO_UNAVAILABLE_REASON_NOT_CONNECTED = VIDEO_UNAVAILABLE_REASON_END;
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_NO_LICENSE = 9;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * Using a license in whhich the keys have expired.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_LICENSE_EXPIRED = 10;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * the device need be activated.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_NEED_ACTIVATION = 11;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * the device need be paired.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_NEED_PAIRING = 12;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * smart card is missed.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_NO_CARD = 13;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * smart card is muted.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_CARD_MUTE = 14;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * smart card is invalid.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_CARD_INVALID = 15;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * of a geographical blackout.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_BLACKOUT = 16;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * CAS system is rebooting.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_REBOOTING = 17;
+ /**
+ * Reason for {@link TvInputService.Session#notifyVideoUnavailable(int)} and
+ * {@link TvView.TvInputCallback#onVideoUnavailable(String, int)}: Video is unavailable because
+ * of unknown CAS error.
+ */
+ public static final int VIDEO_UNAVAILABLE_REASON_CAS_UNKNOWN = VIDEO_UNAVAILABLE_REASON_END;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index 629dc7ce7819..7e1f44cb0899 100755
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -17,6 +17,7 @@
package android.media.tv;
import android.annotation.FloatRange;
+import android.annotation.IntDef;
import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -58,6 +59,8 @@ import android.widget.FrameLayout;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.Preconditions;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
@@ -96,6 +99,53 @@ public abstract class TvInputService extends Service {
public static final String SERVICE_META_DATA = "android.media.tv.input";
/**
+ * Prioirity hint from use case types.
+ *
+ * @hide
+ */
+ @IntDef(prefix = "PRIORITY_HINT_USE_CASE_TYPE_",
+ value = {PRIORITY_HINT_USE_CASE_TYPE_BACKGROUND, PRIORITY_HINT_USE_CASE_TYPE_SCAN,
+ PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK, PRIORITY_HINT_USE_CASE_TYPE_LIVE,
+ PRIORITY_HINT_USE_CASE_TYPE_RECORD})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PriorityHintUseCaseType {}
+
+ /**
+ * Use case of priority hint for {@link android.media.MediaCas#MediaCas(int, String , int)}:
+ * Background.
+ * TODO Link: Tuner#Tuner(Context, string, int).
+ */
+ public static final int PRIORITY_HINT_USE_CASE_TYPE_BACKGROUND = 100;
+
+ /**
+ * Use case of priority hint for {@link android.media.MediaCas#MediaCas(int, String , int)}:
+ * Scan.
+ * TODO Link: Tuner#Tuner(Context, string, int).
+ */
+ public static final int PRIORITY_HINT_USE_CASE_TYPE_SCAN = 200;
+
+ /**
+ * Use case of priority hint for {@link android.media.MediaCas#MediaCas(int, String , int)}:
+ * Playback.
+ * TODO Link: Tuner#Tuner(Context, string, int).
+ */
+ public static final int PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK = 300;
+
+ /**
+ * Use case of priority hint for {@link android.media.MediaCas#MediaCas(int, String , int)}:
+ * Live.
+ * TODO Link: Tuner#Tuner(Context, string, int).
+ */
+ public static final int PRIORITY_HINT_USE_CASE_TYPE_LIVE = 400;
+
+ /**
+ * Use case of priority hint for {@link android.media.MediaCas#MediaCas(int, String , int)}:
+ * Record.
+ * TODO Link: Tuner#Tuner(Context, string, int).
+ */
+ public static final int PRIORITY_HINT_USE_CASE_TYPE_RECORD = 500;
+
+ /**
* Handler instance to handle request from TV Input Manager Service. Should be run in the main
* looper to be synchronously run with {@code Session.mHandler}.
*/
diff --git a/media/java/android/media/tv/tuner/DemuxCapabilities.java b/media/java/android/media/tv/tuner/DemuxCapabilities.java
index aa0649a5cd8b..2c08e5bcdb19 100644
--- a/media/java/android/media/tv/tuner/DemuxCapabilities.java
+++ b/media/java/android/media/tv/tuner/DemuxCapabilities.java
@@ -21,6 +21,7 @@ import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.Size;
import android.annotation.SystemApi;
+import android.media.tv.tuner.filter.Filter;
import android.media.tv.tuner.filter.FilterConfiguration;
import java.lang.annotation.Retention;
@@ -36,11 +37,11 @@ public class DemuxCapabilities {
/** @hide */
@IntDef(flag = true, value = {
- FilterConfiguration.FILTER_TYPE_TS,
- FilterConfiguration.FILTER_TYPE_MMTP,
- FilterConfiguration.FILTER_TYPE_IP,
- FilterConfiguration.FILTER_TYPE_TLV,
- FilterConfiguration.FILTER_TYPE_ALP
+ Filter.TYPE_TS,
+ Filter.TYPE_MMTP,
+ Filter.TYPE_IP,
+ Filter.TYPE_TLV,
+ Filter.TYPE_ALP
})
@Retention(RetentionPolicy.SOURCE)
public @interface FilterCapabilities {}
diff --git a/media/java/android/media/tv/tuner/Descrambler.java b/media/java/android/media/tv/tuner/Descrambler.java
index 23016e9239ca..f46d3ce03cb0 100644
--- a/media/java/android/media/tv/tuner/Descrambler.java
+++ b/media/java/android/media/tv/tuner/Descrambler.java
@@ -18,7 +18,8 @@ package android.media.tv.tuner;
import android.annotation.IntDef;
import android.annotation.Nullable;
-import android.media.tv.tuner.Tuner.Filter;
+import android.annotation.SystemApi;
+import android.media.tv.tuner.filter.Filter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -32,6 +33,7 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
+@SystemApi
public class Descrambler implements AutoCloseable {
/** @hide */
@IntDef(prefix = "PID_TYPE_", value = {PID_TYPE_T, PID_TYPE_MMTP})
@@ -55,6 +57,7 @@ public class Descrambler implements AutoCloseable {
private native int nativeSetKeyToken(byte[] keyToken);
private native int nativeClose();
+ // Called by JNI code
private Descrambler() {}
/**
diff --git a/media/java/android/media/tv/tuner/Lnb.java b/media/java/android/media/tv/tuner/Lnb.java
index a9a15d97e859..a8d2cba46440 100644
--- a/media/java/android/media/tv/tuner/Lnb.java
+++ b/media/java/android/media/tv/tuner/Lnb.java
@@ -126,25 +126,21 @@ public class Lnb implements AutoCloseable {
/**
* Outgoing Diseqc message overflow.
- * @hide
*/
public static final int EVENT_TYPE_DISEQC_RX_OVERFLOW =
Constants.LnbEventType.DISEQC_RX_OVERFLOW;
/**
* Outgoing Diseqc message isn't delivered on time.
- * @hide
*/
public static final int EVENT_TYPE_DISEQC_RX_TIMEOUT =
Constants.LnbEventType.DISEQC_RX_TIMEOUT;
/**
* Incoming Diseqc message has parity error.
- * @hide
*/
public static final int EVENT_TYPE_DISEQC_RX_PARITY_ERROR =
Constants.LnbEventType.DISEQC_RX_PARITY_ERROR;
/**
* LNB is overload.
- * @hide
*/
public static final int EVENT_TYPE_LNB_OVERLOAD = Constants.LnbEventType.LNB_OVERLOAD;
@@ -162,8 +158,7 @@ public class Lnb implements AutoCloseable {
mId = id;
}
- /** @hide */
- public void setCallback(@Nullable LnbCallback callback) {
+ void setCallback(@Nullable LnbCallback callback) {
mCallback = callback;
if (mCallback == null) {
return;
diff --git a/media/java/android/media/tv/tuner/LnbCallback.java b/media/java/android/media/tv/tuner/LnbCallback.java
index 5155f604b77b..78624701c8e0 100644
--- a/media/java/android/media/tv/tuner/LnbCallback.java
+++ b/media/java/android/media/tv/tuner/LnbCallback.java
@@ -17,6 +17,8 @@
package android.media.tv.tuner;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.media.tv.tuner.Lnb.EventType;
/**
@@ -24,6 +26,7 @@ import android.media.tv.tuner.Lnb.EventType;
*
* @hide
*/
+@SystemApi
public interface LnbCallback {
/**
* Invoked when there is a LNB event.
@@ -37,5 +40,5 @@ public interface LnbCallback {
* Equipment Control) message which is specified by EUTELSAT Bus Functional
* Specification Version 4.2.
*/
- void onDiseqcMessage(byte[] diseqcMessage);
+ void onDiseqcMessage(@NonNull byte[] diseqcMessage);
}
diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java
index 44579540b0ce..8723fbb6f9fc 100644
--- a/media/java/android/media/tv/tuner/Tuner.java
+++ b/media/java/android/media/tv/tuner/Tuner.java
@@ -23,14 +23,15 @@ import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.content.Context;
-import android.media.tv.tuner.TunerConstants.FilterStatus;
import android.media.tv.tuner.TunerConstants.Result;
-import android.media.tv.tuner.dvr.Dvr;
-import android.media.tv.tuner.dvr.DvrCallback;
-import android.media.tv.tuner.dvr.DvrSettings;
+import android.media.tv.tuner.dvr.DvrPlayback;
+import android.media.tv.tuner.dvr.DvrRecorder;
+import android.media.tv.tuner.dvr.OnPlaybackStatusChangedListener;
+import android.media.tv.tuner.dvr.OnRecordStatusChangedListener;
+import android.media.tv.tuner.filter.Filter;
import android.media.tv.tuner.filter.Filter.Subtype;
import android.media.tv.tuner.filter.Filter.Type;
-import android.media.tv.tuner.filter.FilterEvent;
+import android.media.tv.tuner.filter.FilterCallback;
import android.media.tv.tuner.filter.TimeFilter;
import android.media.tv.tuner.frontend.FrontendInfo;
import android.media.tv.tuner.frontend.FrontendSettings;
@@ -166,34 +167,13 @@ public final class Tuner implements AutoCloseable {
private native Descrambler nativeOpenDescrambler();
- private native Dvr nativeOpenDvr(int type, long bufferSize);
+ private native DvrRecorder nativeOpenDvrRecorder(long bufferSize);
+ private native DvrPlayback nativeOpenDvrPlayback(long bufferSize);
private static native DemuxCapabilities nativeGetDemuxCapabilities();
/**
- * Callback interface for receiving information from the corresponding filters.
- * TODO: remove
- */
- public interface FilterCallback {
- /**
- * Invoked when there are filter events.
- *
- * @param filter the corresponding filter which sent the events.
- * @param events the filter events sent from the filter.
- */
- void onFilterEvent(@NonNull Filter filter, @NonNull FilterEvent[] events);
- /**
- * Invoked when filter status changed.
- *
- * @param filter the corresponding filter whose status is changed.
- * @param status the new status of the filter.
- */
- void onFilterStatusChanged(@NonNull Filter filter, @FilterStatus int status);
- }
-
-
- /**
* Listener for resource lost.
*
* @hide
@@ -228,8 +208,8 @@ public final class Tuner implements AutoCloseable {
switch (msg.what) {
case MSG_ON_FILTER_STATUS: {
Filter filter = (Filter) msg.obj;
- if (filter.mCallback != null) {
- filter.mCallback.onFilterStatusChanged(filter, msg.arg1);
+ if (filter.getCallback() != null) {
+ filter.getCallback().onFilterStatusChanged(filter, msg.arg1);
}
break;
}
@@ -549,17 +529,6 @@ public final class Tuner implements AutoCloseable {
}
/**
- * Tuner data filter.
- *
- * <p> This class is used to filter wanted data according to the filter's configuration.
- * TODO: remove
- */
- public class Filter {
- FilterCallback mCallback;
- private Filter() {}
- }
-
- /**
* Opens a filter object based on the given types and buffer size.
*
* @param mainType the main type of the filter.
@@ -570,8 +539,6 @@ public final class Tuner implements AutoCloseable {
* executor is used if it's {@code null}.
* @param cb the callback to receive notifications from filter.
* @return the opened filter. {@code null} if the operation failed.
- *
- * @hide
*/
@RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER)
@Nullable
@@ -582,7 +549,7 @@ public final class Tuner implements AutoCloseable {
Filter filter = nativeOpenFilter(
mainType, TunerUtils.getFilterSubtype(mainType, subType), bufferSize);
if (filter != null) {
- filter.mCallback = cb;
+ filter.setCallback(cb);
if (mHandler == null) {
mHandler = createEventHandler();
}
@@ -597,12 +564,11 @@ public final class Tuner implements AutoCloseable {
* executor is used if it's {@code null}.
* @param cb the callback to receive notifications from LNB.
* @return the opened LNB object. {@code null} if the operation failed.
- *
- * @hide
*/
@RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER)
@Nullable
- public Lnb openLnb(@CallbackExecutor @Nullable Executor executor, LnbCallback cb) {
+ public Lnb openLnb(@CallbackExecutor @Nullable Executor executor, @Nullable LnbCallback cb) {
+ TunerUtils.checkTunerPermission(mContext);
return openLnbByName(null, executor, cb);
}
@@ -614,18 +580,26 @@ public final class Tuner implements AutoCloseable {
* executor is used if it's {@code null}.
* @param cb the callback to receive notifications from LNB.
* @return the opened LNB object. {@code null} if the operation failed.
- *
- * @hide
*/
@RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER)
@Nullable
public Lnb openLnbByName(@Nullable String name, @CallbackExecutor @Nullable Executor executor,
- LnbCallback cb) {
+ @NonNull LnbCallback cb) {
TunerUtils.checkTunerPermission(mContext);
// TODO: use resource manager to get LNB ID.
return new Lnb(0);
}
+ /**
+ * Open a time filter object.
+ *
+ * @return the opened time filter object. {@code null} if the operation failed.
+ */
+ @Nullable
+ public TimeFilter openTimeFilter() {
+ return nativeOpenTimeFilter();
+ }
+
private List<Integer> getLnbIds() {
mLnbIds = nativeGetLnbIds();
return mLnbIds;
@@ -674,24 +648,44 @@ public final class Tuner implements AutoCloseable {
}
/**
- * Open a DVR (Digital Video Record) instance.
+ * Open a DVR (Digital Video Record) recorder instance.
*
- * @param type the DVR type to be opened.
* @param bufferSize the buffer size of the output in bytes. It's used to hold output data of
* the attached filters.
* @param executor the executor on which callback will be invoked. The default event handler
* executor is used if it's {@code null}.
- * @param cb the callback to receive notifications from DVR.
- * @return the opened DVR object. {@code null} if the operation failed.
+ * @param l the listener to receive notifications from DVR recorder.
+ * @return the opened DVR recorder object. {@code null} if the operation failed.
+ */
+ @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER)
+ @Nullable
+ public DvrRecorder openDvrRecorder(
+ @BytesLong long bufferSize,
+ @CallbackExecutor @Nullable Executor executor,
+ @Nullable OnRecordStatusChangedListener l) {
+ TunerUtils.checkTunerPermission(mContext);
+ DvrRecorder dvr = nativeOpenDvrRecorder(bufferSize);
+ return dvr;
+ }
+
+ /**
+ * Open a DVR (Digital Video Record) playback instance.
*
- * @hide
+ * @param bufferSize the buffer size of the output in bytes. It's used to hold output data of
+ * the attached filters.
+ * @param executor the executor on which callback will be invoked. The default event handler
+ * executor is used if it's {@code null}.
+ * @param l the listener to receive notifications from DVR recorder.
+ * @return the opened DVR playback object. {@code null} if the operation failed.
*/
@RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER)
@Nullable
- public Dvr openDvr(@DvrSettings.Type int type, @BytesLong long bufferSize,
- @CallbackExecutor @Nullable Executor executor, DvrCallback cb) {
+ public DvrPlayback openDvrPlayback(
+ @BytesLong long bufferSize,
+ @CallbackExecutor @Nullable Executor executor,
+ @Nullable OnPlaybackStatusChangedListener l) {
TunerUtils.checkTunerPermission(mContext);
- Dvr dvr = nativeOpenDvr(type, bufferSize);
+ DvrPlayback dvr = nativeOpenDvrPlayback(bufferSize);
return dvr;
}
}
diff --git a/media/java/android/media/tv/tuner/TunerConstants.java b/media/java/android/media/tv/tuner/TunerConstants.java
index 20b77e663586..5747c0b265f4 100644
--- a/media/java/android/media/tv/tuner/TunerConstants.java
+++ b/media/java/android/media/tv/tuner/TunerConstants.java
@@ -47,37 +47,6 @@ public final class TunerConstants {
*/
public static final int INVALID_STREAM_ID = Constants.Constant.INVALID_STREAM_ID;
- /** @hide */
- @IntDef(flag = true, prefix = "FILTER_STATUS_", value = {FILTER_STATUS_DATA_READY,
- FILTER_STATUS_LOW_WATER, FILTER_STATUS_HIGH_WATER, FILTER_STATUS_OVERFLOW})
- @Retention(RetentionPolicy.SOURCE)
- public @interface FilterStatus {}
-
- /**
- * The status of a filter that the data in the filter buffer is ready to be read.
- */
- public static final int FILTER_STATUS_DATA_READY = Constants.DemuxFilterStatus.DATA_READY;
- /**
- * The status of a filter that the amount of available data in the filter buffer is at low
- * level.
- *
- * The value is set to 25 percent of the buffer size by default. It can be changed when
- * configuring the filter.
- */
- public static final int FILTER_STATUS_LOW_WATER = Constants.DemuxFilterStatus.LOW_WATER;
- /**
- * The status of a filter that the amount of available data in the filter buffer is at high
- * level.
- * The value is set to 75 percent of the buffer size by default. It can be changed when
- * configuring the filter.
- */
- public static final int FILTER_STATUS_HIGH_WATER = Constants.DemuxFilterStatus.HIGH_WATER;
- /**
- * The status of a filter that the filter buffer is full and newly filtered data is being
- * discarded.
- */
- public static final int FILTER_STATUS_OVERFLOW = Constants.DemuxFilterStatus.OVERFLOW;
-
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@@ -101,7 +70,6 @@ public final class TunerConstants {
*/
public static final int INDEX_TYPE_SC_HEVC = Constants.DemuxRecordScIndexType.SC_HEVC;
-
/**
* Indexes can be tagged by Start Code in PES (Packetized Elementary Stream)
* according to ISO/IEC 13818-1.
@@ -114,22 +82,18 @@ public final class TunerConstants {
/**
* SC index for a new I-frame.
- * @hide
*/
public static final int SC_INDEX_I_FRAME = Constants.DemuxScIndex.I_FRAME;
/**
* SC index for a new P-frame.
- * @hide
*/
public static final int SC_INDEX_P_FRAME = Constants.DemuxScIndex.P_FRAME;
/**
* SC index for a new B-frame.
- * @hide
*/
public static final int SC_INDEX_B_FRAME = Constants.DemuxScIndex.B_FRAME;
/**
* SC index for a new sequence.
- * @hide
*/
public static final int SC_INDEX_SEQUENCE = Constants.DemuxScIndex.SEQUENCE;
@@ -149,47 +113,39 @@ public final class TunerConstants {
/**
* SC HEVC index SPS.
- * @hide
*/
public static final int SC_HEVC_INDEX_SPS = Constants.DemuxScHevcIndex.SPS;
/**
* SC HEVC index AUD.
- * @hide
*/
public static final int SC_HEVC_INDEX_AUD = Constants.DemuxScHevcIndex.AUD;
/**
* SC HEVC index SLICE_CE_BLA_W_LP.
- * @hide
*/
public static final int SC_HEVC_INDEX_SLICE_CE_BLA_W_LP =
Constants.DemuxScHevcIndex.SLICE_CE_BLA_W_LP;
/**
* SC HEVC index SLICE_BLA_W_RADL.
- * @hide
*/
public static final int SC_HEVC_INDEX_SLICE_BLA_W_RADL =
Constants.DemuxScHevcIndex.SLICE_BLA_W_RADL;
/**
* SC HEVC index SLICE_BLA_N_LP.
- * @hide
*/
public static final int SC_HEVC_INDEX_SLICE_BLA_N_LP =
Constants.DemuxScHevcIndex.SLICE_BLA_N_LP;
/**
* SC HEVC index SLICE_IDR_W_RADL.
- * @hide
*/
public static final int SC_HEVC_INDEX_SLICE_IDR_W_RADL =
Constants.DemuxScHevcIndex.SLICE_IDR_W_RADL;
/**
* SC HEVC index SLICE_IDR_N_LP.
- * @hide
*/
public static final int SC_HEVC_INDEX_SLICE_IDR_N_LP =
Constants.DemuxScHevcIndex.SLICE_IDR_N_LP;
/**
* SC HEVC index SLICE_TRAIL_CRA.
- * @hide
*/
public static final int SC_HEVC_INDEX_SLICE_TRAIL_CRA =
Constants.DemuxScHevcIndex.SLICE_TRAIL_CRA;
diff --git a/media/java/android/media/tv/tuner/dvr/Dvr.java b/media/java/android/media/tv/tuner/dvr/Dvr.java
index a17773c08a63..4183e3bbe640 100644
--- a/media/java/android/media/tv/tuner/dvr/Dvr.java
+++ b/media/java/android/media/tv/tuner/dvr/Dvr.java
@@ -16,12 +16,12 @@
package android.media.tv.tuner.dvr;
-import android.annotation.BytesLong;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.hardware.tv.tuner.V1_0.Constants;
-import android.media.tv.tuner.Tuner.Filter;
import android.media.tv.tuner.TunerConstants.Result;
+import android.media.tv.tuner.filter.Filter;
import android.os.ParcelFileDescriptor;
import java.lang.annotation.Retention;
@@ -33,40 +33,26 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
-public class Dvr {
+@SystemApi
+public class Dvr implements AutoCloseable {
+
/** @hide */
+ @IntDef(prefix = "TYPE_", value = {TYPE_RECORD, TYPE_PLAYBACK})
@Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = "PLAYBACK_STATUS_",
- value = {PLAYBACK_STATUS_EMPTY, PLAYBACK_STATUS_ALMOST_EMPTY,
- PLAYBACK_STATUS_ALMOST_FULL, PLAYBACK_STATUS_FULL})
- @interface PlaybackStatus {}
+ public @interface Type {}
/**
- * The space of the playback is empty.
- */
- public static final int PLAYBACK_STATUS_EMPTY = Constants.PlaybackStatus.SPACE_EMPTY;
- /**
- * The space of the playback is almost empty.
- *
- * <p> the threshold is set in {@link DvrSettings}.
- */
- public static final int PLAYBACK_STATUS_ALMOST_EMPTY =
- Constants.PlaybackStatus.SPACE_ALMOST_EMPTY;
- /**
- * The space of the playback is almost full.
- *
- * <p> the threshold is set in {@link DvrSettings}.
+ * DVR for recording.
*/
- public static final int PLAYBACK_STATUS_ALMOST_FULL =
- Constants.PlaybackStatus.SPACE_ALMOST_FULL;
+ public static final int TYPE_RECORD = Constants.DvrType.RECORD;
/**
- * The space of the playback is full.
+ * DVR for playback of recorded programs.
*/
- public static final int PLAYBACK_STATUS_FULL = Constants.PlaybackStatus.SPACE_FULL;
+ public static final int TYPE_PLAYBACK = Constants.DvrType.PLAYBACK;
- private long mNativeContext;
- private DvrCallback mCallback;
+ final int mType;
+ long mNativeContext;
private native int nativeAttachFilter(Filter filter);
private native int nativeDetachFilter(Filter filter);
@@ -76,12 +62,10 @@ public class Dvr {
private native int nativeFlushDvr();
private native int nativeClose();
private native void nativeSetFileDescriptor(int fd);
- private native int nativeRead(long size);
- private native int nativeRead(byte[] bytes, long offset, long size);
- private native int nativeWrite(long size);
- private native int nativeWrite(byte[] bytes, long offset, long size);
- private Dvr() {}
+ protected Dvr(int type) {
+ mType = type;
+ }
/**
* Attaches a filter to DVR interface for recording.
@@ -154,12 +138,9 @@ public class Dvr {
/**
* Closes the DVR instance to release resources.
- *
- * @return result status of the operation.
*/
- @Result
- public int close() {
- return nativeClose();
+ public void close() {
+ nativeClose();
}
/**
@@ -171,51 +152,8 @@ public class Dvr {
nativeSetFileDescriptor(fd.getFd());
}
- /**
- * Reads data from the file for DVR playback.
- *
- * @param size the maximum number of bytes to read.
- * @return the number of bytes read.
- */
- public int read(@BytesLong long size) {
- return nativeRead(size);
- }
-
- /**
- * Reads data from the buffer for DVR playback and copies to the given byte array.
- *
- * @param bytes the byte array to store the data.
- * @param offset the index of the first byte in {@code bytes} to copy to.
- * @param size the maximum number of bytes to read.
- * @return the number of bytes read.
- */
- public int read(@NonNull byte[] bytes, @BytesLong long offset, @BytesLong long size) {
- if (size + offset > bytes.length) {
- throw new ArrayIndexOutOfBoundsException(
- "Array length=" + bytes.length + ", offset=" + offset + ", size=" + size);
- }
- return nativeRead(bytes, offset, size);
- }
-
- /**
- * Writes recording data to file.
- *
- * @param size the maximum number of bytes to write.
- * @return the number of bytes written.
- */
- public int write(@BytesLong long size) {
- return nativeWrite(size);
- }
-
- /**
- * Writes recording data to buffer.
- *
- * @param bytes the byte array stores the data to be written to DVR.
- * @param offset the index of the first byte in {@code bytes} to be written to DVR.
- * @param size the maximum number of bytes to write.
- * @return the number of bytes written.
- */
- public int write(@NonNull byte[] bytes, @BytesLong long offset, @BytesLong long size) {
- return nativeWrite(bytes, offset, size);
+ @Type
+ int getType() {
+ return mType;
}
}
diff --git a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java
new file mode 100644
index 000000000000..eb3157434a95
--- /dev/null
+++ b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 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.media.tv.tuner.dvr;
+
+import android.annotation.BytesLong;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.hardware.tv.tuner.V1_0.Constants;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Digital Video Record (DVR) class which provides playback control on Demux's input buffer.
+ *
+ * <p>It's used to play recorded programs.
+ *
+ * @hide
+ */
+@SystemApi
+public class DvrPlayback extends Dvr {
+
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = "PLAYBACK_STATUS_",
+ value = {PLAYBACK_STATUS_EMPTY, PLAYBACK_STATUS_ALMOST_EMPTY,
+ PLAYBACK_STATUS_ALMOST_FULL, PLAYBACK_STATUS_FULL})
+ @interface PlaybackStatus {}
+
+ /**
+ * The space of the playback is empty.
+ */
+ public static final int PLAYBACK_STATUS_EMPTY = Constants.PlaybackStatus.SPACE_EMPTY;
+ /**
+ * The space of the playback is almost empty.
+ *
+ * <p> the threshold is set in {@link DvrSettings}.
+ */
+ public static final int PLAYBACK_STATUS_ALMOST_EMPTY =
+ Constants.PlaybackStatus.SPACE_ALMOST_EMPTY;
+ /**
+ * The space of the playback is almost full.
+ *
+ * <p> the threshold is set in {@link DvrSettings}.
+ */
+ public static final int PLAYBACK_STATUS_ALMOST_FULL =
+ Constants.PlaybackStatus.SPACE_ALMOST_FULL;
+ /**
+ * The space of the playback is full.
+ */
+ public static final int PLAYBACK_STATUS_FULL = Constants.PlaybackStatus.SPACE_FULL;
+
+
+
+ private native long nativeRead(long size);
+ private native long nativeRead(byte[] bytes, long offset, long size);
+
+ private DvrPlayback() {
+ super(Dvr.TYPE_PLAYBACK);
+ }
+
+
+ /**
+ * Reads data from the file for DVR playback.
+ *
+ * @param size the maximum number of bytes to read.
+ * @return the number of bytes read.
+ */
+ @BytesLong
+ public long read(@BytesLong long size) {
+ return nativeRead(size);
+ }
+
+ /**
+ * Reads data from the buffer for DVR playback and copies to the given byte array.
+ *
+ * @param bytes the byte array to store the data.
+ * @param offset the index of the first byte in {@code bytes} to copy to.
+ * @param size the maximum number of bytes to read.
+ * @return the number of bytes read.
+ */
+ @BytesLong
+ public long read(@NonNull byte[] bytes, @BytesLong long offset, @BytesLong long size) {
+ if (size + offset > bytes.length) {
+ throw new ArrayIndexOutOfBoundsException(
+ "Array length=" + bytes.length + ", offset=" + offset + ", size=" + size);
+ }
+ return nativeRead(bytes, offset, size);
+ }
+}
diff --git a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
new file mode 100644
index 000000000000..3128ca5da641
--- /dev/null
+++ b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 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.media.tv.tuner.dvr;
+
+import android.annotation.BytesLong;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+
+/**
+ * Digital Video Record (DVR) recorder class which provides record control on Demux's output buffer.
+ *
+ * @hide
+ */
+@SystemApi
+public class DvrRecorder extends Dvr {
+ private native long nativeWrite(long size);
+ private native long nativeWrite(byte[] bytes, long offset, long size);
+
+ private DvrRecorder() {
+ super(Dvr.TYPE_RECORD);
+ }
+
+ /**
+ * Writes recording data to file.
+ *
+ * @param size the maximum number of bytes to write.
+ * @return the number of bytes written.
+ */
+ @BytesLong
+ public long write(@BytesLong long size) {
+ return nativeWrite(size);
+ }
+
+ /**
+ * Writes recording data to buffer.
+ *
+ * @param bytes the byte array stores the data to be written to DVR.
+ * @param offset the index of the first byte in {@code bytes} to be written to DVR.
+ * @param size the maximum number of bytes to write.
+ * @return the number of bytes written.
+ */
+ @BytesLong
+ public long write(@NonNull byte[] bytes, @BytesLong long offset, @BytesLong long size) {
+ return nativeWrite(bytes, offset, size);
+ }
+}
diff --git a/media/java/android/media/tv/tuner/dvr/DvrSettings.java b/media/java/android/media/tv/tuner/dvr/DvrSettings.java
index 49e875afc5ac..f9dc6821039a 100644
--- a/media/java/android/media/tv/tuner/dvr/DvrSettings.java
+++ b/media/java/android/media/tv/tuner/dvr/DvrSettings.java
@@ -20,10 +20,11 @@ import android.annotation.BytesLong;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.hardware.tv.tuner.V1_0.Constants;
-import android.media.tv.tuner.TunerConstants.FilterStatus;
import android.media.tv.tuner.TunerUtils;
+import android.media.tv.tuner.filter.Filter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -33,6 +34,7 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
+@SystemApi
public class DvrSettings {
/** @hide */
@@ -59,40 +61,64 @@ public class DvrSettings {
public static final int DATA_FORMAT_SHV_TLV = Constants.DataFormat.SHV_TLV;
- /** @hide */
- @IntDef(prefix = "TYPE_", value = {TYPE_RECORD, TYPE_PLAYBACK})
- @Retention(RetentionPolicy.SOURCE)
- public @interface Type {}
-
- /**
- * DVR for recording.
- */
- public static final int TYPE_RECORD = Constants.DvrType.RECORD;
- /**
- * DVR for playback of recorded programs.
- */
- public static final int TYPE_PLAYBACK = Constants.DvrType.PLAYBACK;
-
-
-
+ @Filter.Status
private final int mStatusMask;
+ @BytesLong
private final long mLowThreshold;
+ @BytesLong
private final long mHighThreshold;
+ @BytesLong
private final long mPacketSize;
-
@DataFormat
private final int mDataFormat;
- @Type
- private final int mType;
- private DvrSettings(int statusMask, long lowThreshold, long highThreshold, long packetSize,
- @DataFormat int dataFormat, @Type int type) {
+ private DvrSettings(@Filter.Status int statusMask, @BytesLong long lowThreshold,
+ @BytesLong long highThreshold, @BytesLong long packetSize, @DataFormat int dataFormat) {
mStatusMask = statusMask;
mLowThreshold = lowThreshold;
mHighThreshold = highThreshold;
mPacketSize = packetSize;
mDataFormat = dataFormat;
- mType = type;
+ }
+
+ /**
+ * Gets status mask.
+ */
+ @Filter.Status
+ public int getStatusMask() {
+ return mStatusMask;
+ }
+
+ /**
+ * Gets low threshold in bytes.
+ */
+ @BytesLong
+ public long getLowThreshold() {
+ return mLowThreshold;
+ }
+
+ /**
+ * Sets high threshold in bytes.
+ */
+ @BytesLong
+ public long getHighThreshold() {
+ return mHighThreshold;
+ }
+
+ /**
+ * Gets packet size in bytes.
+ */
+ @BytesLong
+ public long getPacketSize() {
+ return mPacketSize;
+ }
+
+ /**
+ * Gets data format.
+ */
+ @DataFormat
+ public int getDataFormat() {
+ return mDataFormat;
}
/**
@@ -102,7 +128,7 @@ public class DvrSettings {
*/
@RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER)
@NonNull
- public static Builder builder(Context context) {
+ public static Builder builder(@NonNull Context context) {
TunerUtils.checkTunerPermission(context);
return new Builder();
}
@@ -117,14 +143,12 @@ public class DvrSettings {
private long mPacketSize;
@DataFormat
private int mDataFormat;
- @Type
- private int mType;
/**
* Sets status mask.
*/
@NonNull
- public Builder setStatusMask(@FilterStatus int statusMask) {
+ public Builder setStatusMask(@Filter.Status int statusMask) {
this.mStatusMask = statusMask;
return this;
}
@@ -166,21 +190,12 @@ public class DvrSettings {
}
/**
- * Sets settings type.
- */
- @NonNull
- public Builder setType(@Type int type) {
- this.mType = type;
- return this;
- }
-
- /**
* Builds a {@link DvrSettings} object.
*/
@NonNull
public DvrSettings build() {
return new DvrSettings(
- mStatusMask, mLowThreshold, mHighThreshold, mPacketSize, mDataFormat, mType);
+ mStatusMask, mLowThreshold, mHighThreshold, mPacketSize, mDataFormat);
}
}
}
diff --git a/media/java/android/media/tv/tuner/dvr/DvrCallback.java b/media/java/android/media/tv/tuner/dvr/OnPlaybackStatusChangedListener.java
index ee0cfa7ddc2e..a9a1779b8238 100644
--- a/media/java/android/media/tv/tuner/dvr/DvrCallback.java
+++ b/media/java/android/media/tv/tuner/dvr/OnPlaybackStatusChangedListener.java
@@ -16,21 +16,17 @@
package android.media.tv.tuner.dvr;
-import android.media.tv.tuner.TunerConstants.FilterStatus;
-import android.media.tv.tuner.dvr.Dvr.PlaybackStatus;
+import android.annotation.SystemApi;
/**
- * Callback interface for receiving information from DVR interfaces.
+ * Listener interface for receiving information from DVR playback.
*
* @hide
*/
-public interface DvrCallback {
- /**
- * Invoked when record status changed.
- */
- void onRecordStatusChanged(@FilterStatus int status);
+@SystemApi
+public interface OnPlaybackStatusChangedListener {
/**
* Invoked when playback status changed.
*/
- void onPlaybackStatusChanged(@PlaybackStatus int status);
+ void onPlaybackStatusChanged(@DvrPlayback.PlaybackStatus int status);
}
diff --git a/media/java/android/media/tv/tuner/dvr/OnRecordStatusChangedListener.java b/media/java/android/media/tv/tuner/dvr/OnRecordStatusChangedListener.java
new file mode 100644
index 000000000000..cb6ccabe2a73
--- /dev/null
+++ b/media/java/android/media/tv/tuner/dvr/OnRecordStatusChangedListener.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 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.media.tv.tuner.dvr;
+
+import android.annotation.SystemApi;
+import android.media.tv.tuner.filter.Filter;
+
+/**
+ * Listener interface for receiving information from DVR recorder.
+ *
+ * @hide
+ */
+@SystemApi
+public interface OnRecordStatusChangedListener {
+ /**
+ * Invoked when record status changed.
+ */
+ void onRecordStatusChanged(@Filter.Status int status);
+}
diff --git a/media/java/android/media/tv/tuner/filter/AlpFilterConfiguration.java b/media/java/android/media/tv/tuner/filter/AlpFilterConfiguration.java
index fcca6a1615c3..064ab80efb5c 100644
--- a/media/java/android/media/tv/tuner/filter/AlpFilterConfiguration.java
+++ b/media/java/android/media/tv/tuner/filter/AlpFilterConfiguration.java
@@ -19,6 +19,7 @@ package android.media.tv.tuner.filter;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.hardware.tv.tuner.V1_0.Constants;
import android.media.tv.tuner.TunerUtils;
@@ -28,8 +29,10 @@ import java.lang.annotation.RetentionPolicy;
/**
* Filter configuration for a ALP filter.
+ *
* @hide
*/
+@SystemApi
public class AlpFilterConfiguration extends FilterConfiguration {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@@ -57,7 +60,7 @@ public class AlpFilterConfiguration extends FilterConfiguration {
private final int mPacketType;
private final int mLengthType;
- public AlpFilterConfiguration(Settings settings, int packetType, int lengthType) {
+ private AlpFilterConfiguration(Settings settings, int packetType, int lengthType) {
super(settings);
mPacketType = packetType;
mLengthType = lengthType;
@@ -65,7 +68,7 @@ public class AlpFilterConfiguration extends FilterConfiguration {
@Override
public int getType() {
- return FilterConfiguration.FILTER_TYPE_ALP;
+ return Filter.TYPE_ALP;
}
/**
diff --git a/media/java/android/media/tv/tuner/filter/AudioDescriptor.java b/media/java/android/media/tv/tuner/filter/AudioDescriptor.java
index c88c07f8a150..7b1576a9ea26 100644
--- a/media/java/android/media/tv/tuner/filter/AudioDescriptor.java
+++ b/media/java/android/media/tv/tuner/filter/AudioDescriptor.java
@@ -16,11 +16,14 @@
package android.media.tv.tuner.filter;
+import android.annotation.SystemApi;
+
/**
* Meta data from AD (Audio Descriptor) according to ETSI TS 101 154 V2.1.1.
*
* @hide
*/
+@SystemApi
public class AudioDescriptor {
private final byte mAdFade;
private final byte mAdPan;
@@ -68,7 +71,7 @@ public class AudioDescriptor {
*
* <p>A single ASCII character version designator (here "1" indicates revision 1).
*/
- public char getVersionTextTag() {
+ public char getAdVersionTextTag() {
return mVersionTextTag;
}
diff --git a/media/java/android/media/tv/tuner/filter/AvSettings.java b/media/java/android/media/tv/tuner/filter/AvSettings.java
index 93eaaa47d186..bf11893e4bb3 100644
--- a/media/java/android/media/tv/tuner/filter/AvSettings.java
+++ b/media/java/android/media/tv/tuner/filter/AvSettings.java
@@ -18,6 +18,7 @@ package android.media.tv.tuner.filter;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.media.tv.tuner.TunerUtils;
@@ -26,6 +27,7 @@ import android.media.tv.tuner.TunerUtils;
*
* @hide
*/
+@SystemApi
public class AvSettings extends Settings {
private final boolean mIsPassthrough;
diff --git a/media/java/android/media/tv/tuner/filter/DownloadEvent.java b/media/java/android/media/tv/tuner/filter/DownloadEvent.java
index 591e4e54aaae..9f97b6141de0 100644
--- a/media/java/android/media/tv/tuner/filter/DownloadEvent.java
+++ b/media/java/android/media/tv/tuner/filter/DownloadEvent.java
@@ -16,13 +16,14 @@
package android.media.tv.tuner.filter;
-import android.media.tv.tuner.Tuner.Filter;
+import android.annotation.SystemApi;
/**
* Filter event sent from {@link Filter} objects with download type.
*
* @hide
*/
+@SystemApi
public class DownloadEvent extends FilterEvent {
private final int mItemId;
private final int mMpuSequenceNumber;
diff --git a/media/java/android/media/tv/tuner/filter/DownloadSettings.java b/media/java/android/media/tv/tuner/filter/DownloadSettings.java
index fa7744a00e4f..915ad79ffd5a 100644
--- a/media/java/android/media/tv/tuner/filter/DownloadSettings.java
+++ b/media/java/android/media/tv/tuner/filter/DownloadSettings.java
@@ -18,13 +18,16 @@ package android.media.tv.tuner.filter;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.media.tv.tuner.TunerUtils;
/**
* Filter Settings for a Download.
+ *
* @hide
*/
+@SystemApi
public class DownloadSettings extends Settings {
private final int mDownloadId;
diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java
index 3f6154be6af6..06de6e8a83c7 100644
--- a/media/java/android/media/tv/tuner/filter/Filter.java
+++ b/media/java/android/media/tv/tuner/filter/Filter.java
@@ -20,8 +20,8 @@ import android.annotation.BytesLong;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.hardware.tv.tuner.V1_0.Constants;
-import android.media.tv.tuner.Tuner.FilterCallback;
import android.media.tv.tuner.TunerConstants.Result;
import java.lang.annotation.Retention;
@@ -34,6 +34,7 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
+@SystemApi
public class Filter implements AutoCloseable {
/** @hide */
@IntDef(prefix = "TYPE_",
@@ -72,91 +73,107 @@ public class Filter implements AutoCloseable {
public @interface Subtype {}
/**
* Filter subtype undefined.
- * @hide
*/
public static final int SUBTYPE_UNDEFINED = 0;
/**
* Section filter subtype.
- * @hide
*/
public static final int SUBTYPE_SECTION = 1;
/**
* PES filter subtype.
- * @hide
*/
public static final int SUBTYPE_PES = 2;
/**
* Audio filter subtype.
- * @hide
*/
public static final int SUBTYPE_AUDIO = 3;
/**
* Video filter subtype.
- * @hide
*/
public static final int SUBTYPE_VIDEO = 4;
/**
* Download filter subtype.
- * @hide
*/
public static final int SUBTYPE_DOWNLOAD = 5;
/**
* Record filter subtype.
- * @hide
*/
public static final int SUBTYPE_RECORD = 6;
/**
* TS filter subtype.
- * @hide
*/
public static final int SUBTYPE_TS = 7;
/**
* PCR filter subtype.
- * @hide
*/
public static final int SUBTYPE_PCR = 8;
/**
* TEMI filter subtype.
- * @hide
*/
public static final int SUBTYPE_TEMI = 9;
/**
* MMTP filter subtype.
- * @hide
*/
public static final int SUBTYPE_MMTP = 10;
/**
* NTP filter subtype.
- * @hide
*/
public static final int SUBTYPE_NTP = 11;
/**
* Payload filter subtype.
- * @hide
*/
public static final int SUBTYPE_IP_PAYLOAD = 12;
/**
* IP filter subtype.
- * @hide
*/
public static final int SUBTYPE_IP = 13;
/**
* Payload through filter subtype.
- * @hide
*/
public static final int SUBTYPE_PAYLOAD_THROUGH = 14;
/**
* TLV filter subtype.
- * @hide
*/
public static final int SUBTYPE_TLV = 15;
/**
* PTP filter subtype.
- * @hide
*/
public static final int SUBTYPE_PTP = 16;
+
+ /** @hide */
+ @IntDef(flag = true, prefix = "STATUS_", value = {STATUS_DATA_READY, STATUS_LOW_WATER,
+ STATUS_HIGH_WATER, STATUS_OVERFLOW})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Status {}
+
+ /**
+ * The status of a filter that the data in the filter buffer is ready to be read.
+ */
+ public static final int STATUS_DATA_READY = Constants.DemuxFilterStatus.DATA_READY;
+ /**
+ * The status of a filter that the amount of available data in the filter buffer is at low
+ * level.
+ *
+ * The value is set to 25 percent of the buffer size by default. It can be changed when
+ * configuring the filter.
+ */
+ public static final int STATUS_LOW_WATER = Constants.DemuxFilterStatus.LOW_WATER;
+ /**
+ * The status of a filter that the amount of available data in the filter buffer is at high
+ * level.
+ * The value is set to 75 percent of the buffer size by default. It can be changed when
+ * configuring the filter.
+ */
+ public static final int STATUS_HIGH_WATER = Constants.DemuxFilterStatus.HIGH_WATER;
+ /**
+ * The status of a filter that the filter buffer is full and newly filtered data is being
+ * discarded.
+ */
+ public static final int STATUS_OVERFLOW = Constants.DemuxFilterStatus.OVERFLOW;
+
+
private long mNativeContext;
private FilterCallback mCallback;
private final int mId;
@@ -171,6 +188,7 @@ public class Filter implements AutoCloseable {
private native int nativeRead(byte[] buffer, long offset, long size);
private native int nativeClose();
+ // Called by JNI
private Filter(int id) {
mId = id;
}
@@ -178,6 +196,15 @@ public class Filter implements AutoCloseable {
private void onFilterStatus(int status) {
}
+ /** @hide */
+ public void setCallback(FilterCallback cb) {
+ mCallback = cb;
+ }
+ /** @hide */
+ public FilterCallback getCallback() {
+ return mCallback;
+ }
+
/**
* Configures the filter.
*
@@ -241,7 +268,10 @@ public class Filter implements AutoCloseable {
}
/**
- * Flushes the filter. Data in filter buffer is cleared.
+ * Flushes the filter.
+ *
+ * <p>The data which is already produced by filter but not consumed yet will
+ * be cleared.
*
* @return result status of the operation.
*/
@@ -251,7 +281,7 @@ public class Filter implements AutoCloseable {
}
/**
- * Copies filtered data from filter buffer to the given byte array.
+ * Copies filtered data from filter output to the given byte array.
*
* @param buffer the buffer to store the filtered data.
* @param offset the index of the first byte in {@code buffer} to write.
diff --git a/media/java/android/media/tv/tuner/filter/FilterCallback.java b/media/java/android/media/tv/tuner/filter/FilterCallback.java
index 888adc5f51bb..2ad6bd1dfb81 100644
--- a/media/java/android/media/tv/tuner/filter/FilterCallback.java
+++ b/media/java/android/media/tv/tuner/filter/FilterCallback.java
@@ -17,13 +17,14 @@
package android.media.tv.tuner.filter;
import android.annotation.NonNull;
-import android.media.tv.tuner.TunerConstants.FilterStatus;
+import android.annotation.SystemApi;
/**
* Callback interface for receiving information from the corresponding filters.
*
* @hide
*/
+@SystemApi
public interface FilterCallback {
/**
* Invoked when there are filter events.
@@ -38,5 +39,5 @@ public interface FilterCallback {
* @param filter the corresponding filter whose status is changed.
* @param status the new status of the filter.
*/
- void onFilterStatusChanged(@NonNull Filter filter, @FilterStatus int status);
+ void onFilterStatusChanged(@NonNull Filter filter, @Filter.Status int status);
}
diff --git a/media/java/android/media/tv/tuner/filter/FilterConfiguration.java b/media/java/android/media/tv/tuner/filter/FilterConfiguration.java
index c901e2b59185..c1d2275d3bdb 100644
--- a/media/java/android/media/tv/tuner/filter/FilterConfiguration.java
+++ b/media/java/android/media/tv/tuner/filter/FilterConfiguration.java
@@ -17,9 +17,9 @@
package android.media.tv.tuner.filter;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.hardware.tv.tuner.V1_0.Constants;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -32,37 +32,6 @@ import java.lang.annotation.RetentionPolicy;
@SystemApi
public abstract class FilterConfiguration {
- /**
- * TODO: moved to Filter. Remove it here.
- * @hide
- */
- @IntDef(prefix = "FILTER_TYPE_", value =
- {FILTER_TYPE_TS, FILTER_TYPE_MMTP, FILTER_TYPE_IP, FILTER_TYPE_TLV, FILTER_TYPE_ALP})
- @Retention(RetentionPolicy.SOURCE)
- public @interface FilterType {}
-
- /**
- * TS filter type.
- */
- public static final int FILTER_TYPE_TS = Constants.DemuxFilterMainType.TS;
- /**
- * MMTP filter type.
- */
- public static final int FILTER_TYPE_MMTP = Constants.DemuxFilterMainType.MMTP;
- /**
- * IP filter type.
- */
- public static final int FILTER_TYPE_IP = Constants.DemuxFilterMainType.IP;
- /**
- * TLV filter type.
- */
- public static final int FILTER_TYPE_TLV = Constants.DemuxFilterMainType.TLV;
- /**
- * ALP filter type.
- */
- public static final int FILTER_TYPE_ALP = Constants.DemuxFilterMainType.ALP;
-
-
/** @hide */
@IntDef(prefix = "PACKET_TYPE_", value =
{PACKET_TYPE_IPV4, PACKET_TYPE_COMPRESSED, PACKET_TYPE_SIGNALING})
@@ -71,17 +40,14 @@ public abstract class FilterConfiguration {
/**
* IP v4 packet type.
- * @hide
*/
public static final int PACKET_TYPE_IPV4 = 0;
/**
* Compressed packet type.
- * @hide
*/
public static final int PACKET_TYPE_COMPRESSED = 2;
/**
* Signaling packet type.
- * @hide
*/
public static final int PACKET_TYPE_SIGNALING = 4;
@@ -95,12 +61,13 @@ public abstract class FilterConfiguration {
/**
* Gets filter configuration type.
- * @hide
*/
- @FilterType
+ @Filter.Type
public abstract int getType();
- /** @hide */
+ /**
+ * Gets filter Settings.
+ */
@Nullable
public Settings getSettings() {
return mSettings;
@@ -110,7 +77,6 @@ public abstract class FilterConfiguration {
* Builder for {@link FilterConfiguration}.
*
* @param <T> The subclass to be built.
- * @hide
*/
public abstract static class Builder<T extends Builder<T>> {
/* package */ Settings mSettings;
@@ -121,8 +87,8 @@ public abstract class FilterConfiguration {
/**
* Sets filter settings.
*/
- @Nullable
- public T setFrequency(Settings settings) {
+ @NonNull
+ public T setSettings(@Nullable Settings settings) {
mSettings = settings;
return self();
}
diff --git a/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java b/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java
index 98edf1035df3..bf5aaeda4742 100644
--- a/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java
+++ b/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java
@@ -19,13 +19,16 @@ package android.media.tv.tuner.filter;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.Size;
+import android.annotation.SystemApi;
import android.content.Context;
import android.media.tv.tuner.TunerUtils;
/**
* Filter configuration for a IP filter.
+ *
* @hide
*/
+@SystemApi
public class IpFilterConfiguration extends FilterConfiguration {
private final byte[] mSrcIpAddress;
private final byte[] mDstIpAddress;
@@ -33,7 +36,7 @@ public class IpFilterConfiguration extends FilterConfiguration {
private final int mDstPort;
private final boolean mPassthrough;
- public IpFilterConfiguration(Settings settings, byte[] srcAddr, byte[] dstAddr, int srcPort,
+ private IpFilterConfiguration(Settings settings, byte[] srcAddr, byte[] dstAddr, int srcPort,
int dstPort, boolean passthrough) {
super(settings);
mSrcIpAddress = srcAddr;
@@ -45,13 +48,14 @@ public class IpFilterConfiguration extends FilterConfiguration {
@Override
public int getType() {
- return FilterConfiguration.FILTER_TYPE_IP;
+ return Filter.TYPE_IP;
}
/**
* Gets source IP address.
*/
@Size(min = 4, max = 16)
+ @NonNull
public byte[] getSrcIpAddress() {
return mSrcIpAddress;
}
@@ -59,6 +63,7 @@ public class IpFilterConfiguration extends FilterConfiguration {
* Gets destination IP address.
*/
@Size(min = 4, max = 16)
+ @NonNull
public byte[] getDstIpAddress() {
return mDstIpAddress;
}
@@ -113,7 +118,7 @@ public class IpFilterConfiguration extends FilterConfiguration {
* Sets source IP address.
*/
@NonNull
- public Builder setSrcIpAddress(byte[] srcIpAddress) {
+ public Builder setSrcIpAddress(@NonNull byte[] srcIpAddress) {
mSrcIpAddress = srcIpAddress;
return this;
}
@@ -121,7 +126,7 @@ public class IpFilterConfiguration extends FilterConfiguration {
* Sets destination IP address.
*/
@NonNull
- public Builder setDstIpAddress(byte[] dstIpAddress) {
+ public Builder setDstIpAddress(@NonNull byte[] dstIpAddress) {
mDstIpAddress = dstIpAddress;
return this;
}
diff --git a/media/java/android/media/tv/tuner/filter/IpPayloadEvent.java b/media/java/android/media/tv/tuner/filter/IpPayloadEvent.java
index 09489ed86fef..42a124f5a673 100644
--- a/media/java/android/media/tv/tuner/filter/IpPayloadEvent.java
+++ b/media/java/android/media/tv/tuner/filter/IpPayloadEvent.java
@@ -16,13 +16,14 @@
package android.media.tv.tuner.filter;
-import android.media.tv.tuner.Tuner.Filter;
+import android.annotation.SystemApi;
/**
* Filter event sent from {@link Filter} objects with IP payload type.
*
* @hide
*/
+@SystemApi
public class IpPayloadEvent extends FilterEvent {
private final int mDataLength;
diff --git a/media/java/android/media/tv/tuner/filter/MediaEvent.java b/media/java/android/media/tv/tuner/filter/MediaEvent.java
index 0b5c56ba4429..eb2f4a9533ad 100644
--- a/media/java/android/media/tv/tuner/filter/MediaEvent.java
+++ b/media/java/android/media/tv/tuner/filter/MediaEvent.java
@@ -18,13 +18,14 @@ package android.media.tv.tuner.filter;
import android.annotation.BytesLong;
import android.annotation.Nullable;
-import android.media.tv.tuner.Tuner.Filter;
+import android.annotation.SystemApi;
/**
* Filter event sent from {@link Filter} objects with media type.
*
* @hide
*/
+@SystemApi
public class MediaEvent extends FilterEvent{
private final int mStreamId;
private final boolean mIsPtsPresent;
@@ -63,11 +64,11 @@ public class MediaEvent extends FilterEvent{
}
/**
- * Returns whether PTS is present.
+ * Returns whether PTS (Presentation Time Stamp) is present.
*
* @return {@code true} if PTS is present in PES header; {@code false} otherwise.
*/
- public boolean getIsPtsPresent() {
+ public boolean isPtsPresent() {
return mIsPtsPresent;
}
@@ -110,7 +111,7 @@ public class MediaEvent extends FilterEvent{
* @return {@code true} if the data is in secure area, and isn't mappable;
* {@code false} otherwise.
*/
- public boolean getIsSecureMemory() {
+ public boolean isSecureMemory() {
return mIsSecureMemory;
}
@@ -135,7 +136,7 @@ public class MediaEvent extends FilterEvent{
*
* @return {@code true} if the data is in private; {@code false} otherwise.
*/
- public boolean getIsPrivateData() {
+ public boolean isPrivateData() {
return mIsPrivateData;
}
diff --git a/media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java b/media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java
index 248f23a1797b..060182985dd0 100644
--- a/media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java
+++ b/media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java
@@ -18,32 +18,35 @@ package android.media.tv.tuner.filter;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.media.tv.tuner.TunerUtils;
/**
* Filter configuration for a MMTP filter.
+ *
* @hide
*/
+@SystemApi
public class MmtpFilterConfiguration extends FilterConfiguration {
private final int mMmtpPid;
- public MmtpFilterConfiguration(Settings settings, int mmtpPid) {
+ private MmtpFilterConfiguration(Settings settings, int mmtpPid) {
super(settings);
mMmtpPid = mmtpPid;
}
@Override
public int getType() {
- return FilterConfiguration.FILTER_TYPE_MMTP;
+ return Filter.TYPE_MMTP;
}
/**
- * Gets MMTP PID.
+ * Gets MMTP Packet ID.
*
* <p>Packet ID is used to specify packets in MMTP.
*/
- public int getMmtpPid() {
+ public int getMmtpPacketId() {
return mMmtpPid;
}
@@ -69,10 +72,10 @@ public class MmtpFilterConfiguration extends FilterConfiguration {
}
/**
- * Sets MMTP PID.
+ * Sets MMTP Packet ID.
*/
@NonNull
- public Builder setMmtpPid(int mmtpPid) {
+ public Builder setMmtpPacketId(int mmtpPid) {
mMmtpPid = mmtpPid;
return this;
}
diff --git a/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java b/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
index 7f379944b207..093dc6ff7d64 100644
--- a/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
+++ b/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
@@ -16,21 +16,23 @@
package android.media.tv.tuner.filter;
-import android.media.tv.tuner.Tuner.Filter;
+import android.annotation.BytesLong;
+import android.annotation.SystemApi;
/**
* Filter event sent from {@link Filter} objects with MMTP type.
*
* @hide
*/
+@SystemApi
public class MmtpRecordEvent extends FilterEvent {
private final int mScHevcIndexMask;
- private final long mByteNumber;
+ private final long mDataLength;
// This constructor is used by JNI code only
- private MmtpRecordEvent(int scHevcIndexMask, long byteNumber) {
+ private MmtpRecordEvent(int scHevcIndexMask, long dataLength) {
mScHevcIndexMask = scHevcIndexMask;
- mByteNumber = byteNumber;
+ mDataLength = dataLength;
}
/**
@@ -41,9 +43,10 @@ public class MmtpRecordEvent extends FilterEvent {
}
/**
- * Gets the byte number from beginning of the filter's output.
+ * Gets data size in bytes of filtered data.
*/
- public long getByteNumber() {
- return mByteNumber;
+ @BytesLong
+ public long getDataLength() {
+ return mDataLength;
}
}
diff --git a/media/java/android/media/tv/tuner/filter/PesEvent.java b/media/java/android/media/tv/tuner/filter/PesEvent.java
index 60251bf919ad..695e596c98b7 100644
--- a/media/java/android/media/tv/tuner/filter/PesEvent.java
+++ b/media/java/android/media/tv/tuner/filter/PesEvent.java
@@ -16,13 +16,14 @@
package android.media.tv.tuner.filter;
-import android.media.tv.tuner.Tuner.Filter;
+import android.annotation.SystemApi;
/**
* Filter event sent from {@link Filter} objects with PES type.
*
* @hide
*/
+@SystemApi
public class PesEvent extends FilterEvent {
private final int mStreamId;
private final int mDataLength;
diff --git a/media/java/android/media/tv/tuner/filter/RecordSettings.java b/media/java/android/media/tv/tuner/filter/RecordSettings.java
index 4e9d67f60db4..209ed67f23ff 100644
--- a/media/java/android/media/tv/tuner/filter/RecordSettings.java
+++ b/media/java/android/media/tv/tuner/filter/RecordSettings.java
@@ -19,6 +19,7 @@ package android.media.tv.tuner.filter;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.hardware.tv.tuner.V1_0.Constants;
import android.media.tv.tuner.TunerConstants;
@@ -30,8 +31,10 @@ import java.lang.annotation.RetentionPolicy;
/**
* The Settings for the record in DVR.
+ *
* @hide
*/
+@SystemApi
public class RecordSettings extends Settings {
/**
* Indexes can be tagged through TS (Transport Stream) header.
@@ -51,74 +54,61 @@ public class RecordSettings extends Settings {
/**
* TS index FIRST_PACKET.
- * @hide
*/
public static final int TS_INDEX_FIRST_PACKET = Constants.DemuxTsIndex.FIRST_PACKET;
/**
* TS index PAYLOAD_UNIT_START_INDICATOR.
- * @hide
*/
public static final int TS_INDEX_PAYLOAD_UNIT_START_INDICATOR =
Constants.DemuxTsIndex.PAYLOAD_UNIT_START_INDICATOR;
/**
* TS index CHANGE_TO_NOT_SCRAMBLED.
- * @hide
*/
public static final int TS_INDEX_CHANGE_TO_NOT_SCRAMBLED =
Constants.DemuxTsIndex.CHANGE_TO_NOT_SCRAMBLED;
/**
* TS index CHANGE_TO_EVEN_SCRAMBLED.
- * @hide
*/
public static final int TS_INDEX_CHANGE_TO_EVEN_SCRAMBLED =
Constants.DemuxTsIndex.CHANGE_TO_EVEN_SCRAMBLED;
/**
* TS index CHANGE_TO_ODD_SCRAMBLED.
- * @hide
*/
public static final int TS_INDEX_CHANGE_TO_ODD_SCRAMBLED =
Constants.DemuxTsIndex.CHANGE_TO_ODD_SCRAMBLED;
/**
* TS index DISCONTINUITY_INDICATOR.
- * @hide
*/
public static final int TS_INDEX_DISCONTINUITY_INDICATOR =
Constants.DemuxTsIndex.DISCONTINUITY_INDICATOR;
/**
* TS index RANDOM_ACCESS_INDICATOR.
- * @hide
*/
public static final int TS_INDEX_RANDOM_ACCESS_INDICATOR =
Constants.DemuxTsIndex.RANDOM_ACCESS_INDICATOR;
/**
* TS index PRIORITY_INDICATOR.
- * @hide
*/
public static final int TS_INDEX_PRIORITY_INDICATOR = Constants.DemuxTsIndex.PRIORITY_INDICATOR;
/**
* TS index PCR_FLAG.
- * @hide
*/
public static final int TS_INDEX_PCR_FLAG = Constants.DemuxTsIndex.PCR_FLAG;
/**
* TS index OPCR_FLAG.
- * @hide
*/
public static final int TS_INDEX_OPCR_FLAG = Constants.DemuxTsIndex.OPCR_FLAG;
/**
* TS index SPLICING_POINT_FLAG.
- * @hide
*/
public static final int TS_INDEX_SPLICING_POINT_FLAG =
Constants.DemuxTsIndex.SPLICING_POINT_FLAG;
/**
* TS index PRIVATE_DATA.
- * @hide
*/
public static final int TS_INDEX_PRIVATE_DATA = Constants.DemuxTsIndex.PRIVATE_DATA;
/**
* TS index ADAPTATION_EXTENSION_FLAG.
- * @hide
*/
public static final int TS_INDEX_ADAPTATION_EXTENSION_FLAG =
Constants.DemuxTsIndex.ADAPTATION_EXTENSION_FLAG;
diff --git a/media/java/android/media/tv/tuner/filter/SectionEvent.java b/media/java/android/media/tv/tuner/filter/SectionEvent.java
index e211ddab0530..ff1249296efd 100644
--- a/media/java/android/media/tv/tuner/filter/SectionEvent.java
+++ b/media/java/android/media/tv/tuner/filter/SectionEvent.java
@@ -17,7 +17,6 @@
package android.media.tv.tuner.filter;
import android.annotation.SystemApi;
-import android.media.tv.tuner.Tuner.Filter;
/**
* Filter event sent from {@link Filter} objects with section type.
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettings.java b/media/java/android/media/tv/tuner/filter/SectionSettings.java
index b8d0fad5e06c..70788a7515ca 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettings.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettings.java
@@ -16,12 +16,15 @@
package android.media.tv.tuner.filter;
+import android.annotation.SystemApi;
import android.media.tv.tuner.TunerUtils;
/**
* Filter Settings for Section data according to ISO/IEC 13818-1.
+ *
* @hide
*/
+@SystemApi
public class SectionSettings extends Settings {
SectionSettings(int mainType) {
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java b/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
index a2d42d8cfe50..eeeabdfecc01 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
@@ -18,13 +18,16 @@ package android.media.tv.tuner.filter;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.media.tv.tuner.TunerUtils;
/**
* Bits Settings for Section Filters.
+ *
* @hide
*/
+@SystemApi
public class SectionSettingsWithSectionBits extends SectionSettings {
private final byte[] mFilter;
private final byte[] mMask;
@@ -41,6 +44,7 @@ public class SectionSettingsWithSectionBits extends SectionSettings {
/**
* Gets the bytes configured for Section Filter
*/
+ @NonNull
public byte[] getFilterBytes() {
return mFilter;
}
@@ -49,6 +53,7 @@ public class SectionSettingsWithSectionBits extends SectionSettings {
*
* <p>The bits in the bytes are used for filtering.
*/
+ @NonNull
public byte[] getMask() {
return mMask;
}
@@ -60,6 +65,7 @@ public class SectionSettingsWithSectionBits extends SectionSettings {
* <p>Do negative match at the bit position of the configured bytes when the bit at same
* position of the mode is 1.
*/
+ @NonNull
public byte[] getMode() {
return mMode;
}
@@ -93,7 +99,7 @@ public class SectionSettingsWithSectionBits extends SectionSettings {
* Sets filter bytes.
*/
@NonNull
- public Builder setFilter(byte[] filter) {
+ public Builder setFilter(@NonNull byte[] filter) {
mFilter = filter;
return this;
}
@@ -101,7 +107,7 @@ public class SectionSettingsWithSectionBits extends SectionSettings {
* Sets bit mask.
*/
@NonNull
- public Builder setMask(byte[] mask) {
+ public Builder setMask(@NonNull byte[] mask) {
mMask = mask;
return this;
}
@@ -109,7 +115,7 @@ public class SectionSettingsWithSectionBits extends SectionSettings {
* Sets mode.
*/
@NonNull
- public Builder setMode(byte[] mode) {
+ public Builder setMode(@NonNull byte[] mode) {
mMode = mode;
return this;
}
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java b/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
index 0c9cd2bc9e56..c5ff45cfa7de 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
@@ -18,13 +18,16 @@ package android.media.tv.tuner.filter;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.media.tv.tuner.TunerUtils;
/**
* Table information for Section Filter.
+ *
* @hide
*/
+@SystemApi
public class SectionSettingsWithTableInfo extends SectionSettings {
private final int mTableId;
private final int mVersion;
diff --git a/media/java/android/media/tv/tuner/filter/Settings.java b/media/java/android/media/tv/tuner/filter/Settings.java
index d697280a4106..fee7f66c1231 100644
--- a/media/java/android/media/tv/tuner/filter/Settings.java
+++ b/media/java/android/media/tv/tuner/filter/Settings.java
@@ -33,8 +33,6 @@ public abstract class Settings {
/**
* Gets filter settings type.
- *
- * @hide
*/
public int getType() {
return mType;
@@ -45,7 +43,6 @@ public abstract class Settings {
* Builder for {@link Settings}.
*
* @param <T> The subclass to be built.
- * @hide
*/
public abstract static class Builder<T extends Builder<T>> {
/* package */ final int mMainType;
diff --git a/media/java/android/media/tv/tuner/filter/TemiEvent.java b/media/java/android/media/tv/tuner/filter/TemiEvent.java
index 031fa5c4cb0e..9bee9280a8ac 100644
--- a/media/java/android/media/tv/tuner/filter/TemiEvent.java
+++ b/media/java/android/media/tv/tuner/filter/TemiEvent.java
@@ -17,13 +17,14 @@
package android.media.tv.tuner.filter;
import android.annotation.NonNull;
-import android.media.tv.tuner.Tuner.Filter;
+import android.annotation.SystemApi;
/**
* Filter event sent from {@link Filter} objects for Timed External Media Information (TEMI) data.
*
* @hide
*/
+@SystemApi
public class TemiEvent extends FilterEvent {
private final long mPts;
private final byte mDescrTag;
@@ -45,14 +46,14 @@ public class TemiEvent extends FilterEvent {
}
/**
- * Gets TEMI descriptor tag.
+ * Gets TEMI (Timed External Media Information) descriptor tag.
*/
public byte getDescriptorTag() {
return mDescrTag;
}
/**
- * Gets TEMI descriptor.
+ * Gets TEMI (Timed External Media Information) descriptor.
*/
@NonNull
public byte[] getDescriptorData() {
diff --git a/media/java/android/media/tv/tuner/filter/TimeFilter.java b/media/java/android/media/tv/tuner/filter/TimeFilter.java
index c9750040c605..a926d59cdd03 100644
--- a/media/java/android/media/tv/tuner/filter/TimeFilter.java
+++ b/media/java/android/media/tv/tuner/filter/TimeFilter.java
@@ -16,7 +16,7 @@
package android.media.tv.tuner.filter;
-import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.media.tv.tuner.TunerConstants.Result;
/**
@@ -30,7 +30,21 @@ import android.media.tv.tuner.TunerConstants.Result;
*
* @hide
*/
+@SystemApi
public class TimeFilter implements AutoCloseable {
+
+ /**
+ * Timestamp is unavailable.
+ *
+ * <p>Returned by {@link #getSourceTime()} or {@link #getTimeStamp()} when the requested
+ * timestamp is not available.
+ *
+ * @see #getSourceTime()
+ * @see #getTimeStamp()
+ */
+ public static final long TIMESTAMP_UNAVAILABLE = -1L;
+
+
private native int nativeSetTimestamp(long timestamp);
private native int nativeClearTimestamp();
private native Long nativeGetTimestamp();
@@ -39,6 +53,10 @@ public class TimeFilter implements AutoCloseable {
private boolean mEnable = false;
+ // Called by JNI code
+ private TimeFilter() {
+ }
+
/**
* Set timestamp for time based filter.
*
@@ -86,13 +104,12 @@ public class TimeFilter implements AutoCloseable {
*
* @return current timestamp in the time filter. It's based on the 90KHz counter, and it's
* the same format as PTS (Presentation Time Stamp) defined in ISO/IEC 13818-1:2019. The
- * timestamps may or may not be related to PTS or DTS. {@code null} if the timestamp is
- * never set.
+ * timestamps may or may not be related to PTS or DTS. Returns {@link #TIMESTAMP_UNAVAILABLE}
+ * if the timestamp is never set.
*/
- @Nullable
- public Long getTimeStamp() {
+ public long getTimeStamp() {
if (!mEnable) {
- return null;
+ return TIMESTAMP_UNAVAILABLE;
}
return nativeGetTimestamp();
}
@@ -104,12 +121,12 @@ public class TimeFilter implements AutoCloseable {
*
* @return first timestamp of incoming data stream. It's based on the 90KHz counter, and
* it's the same format as PTS (Presentation Time Stamp) defined in ISO/IEC 13818-1:2019.
- * The timestamps may or may not be related to PTS or DTS.
+ * The timestamps may or may not be related to PTS or DTS. Returns
+ * {@link #TIMESTAMP_UNAVAILABLE} if the timestamp is not available.
*/
- @Nullable
- public Long getSourceTime() {
+ public long getSourceTime() {
if (!mEnable) {
- return null;
+ return TIMESTAMP_UNAVAILABLE;
}
return nativeGetSourceTime();
}
diff --git a/media/java/android/media/tv/tuner/filter/TlvFilterConfiguration.java b/media/java/android/media/tv/tuner/filter/TlvFilterConfiguration.java
index eb97fc04362c..b6878e6a13a8 100644
--- a/media/java/android/media/tv/tuner/filter/TlvFilterConfiguration.java
+++ b/media/java/android/media/tv/tuner/filter/TlvFilterConfiguration.java
@@ -18,19 +18,22 @@ package android.media.tv.tuner.filter;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.media.tv.tuner.TunerUtils;
/**
* Filter configuration for a TLV filter.
+ *
* @hide
*/
+@SystemApi
public class TlvFilterConfiguration extends FilterConfiguration {
private final int mPacketType;
private final boolean mIsCompressedIpPacket;
private final boolean mPassthrough;
- public TlvFilterConfiguration(Settings settings, int packetType, boolean isCompressed,
+ private TlvFilterConfiguration(Settings settings, int packetType, boolean isCompressed,
boolean passthrough) {
super(settings);
mPacketType = packetType;
@@ -40,7 +43,7 @@ public class TlvFilterConfiguration extends FilterConfiguration {
@Override
public int getType() {
- return FilterConfiguration.FILTER_TYPE_TLV;
+ return Filter.TYPE_TLV;
}
/**
diff --git a/media/java/android/media/tv/tuner/filter/TsFilterConfiguration.java b/media/java/android/media/tv/tuner/filter/TsFilterConfiguration.java
index 5c38cfa70eb3..f186de60b74a 100644
--- a/media/java/android/media/tv/tuner/filter/TsFilterConfiguration.java
+++ b/media/java/android/media/tv/tuner/filter/TsFilterConfiguration.java
@@ -39,7 +39,7 @@ public class TsFilterConfiguration extends FilterConfiguration {
@Override
public int getType() {
- return FilterConfiguration.FILTER_TYPE_TS;
+ return Filter.TYPE_TS;
}
/**
diff --git a/media/java/android/media/tv/tuner/filter/TsRecordEvent.java b/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
index 1b8485e22dcf..7a14bb863700 100644
--- a/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
+++ b/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
@@ -16,7 +16,8 @@
package android.media.tv.tuner.filter;
-import android.media.tv.tuner.Tuner.Filter;
+import android.annotation.BytesLong;
+import android.annotation.SystemApi;
/**
@@ -24,37 +25,38 @@ import android.media.tv.tuner.Tuner.Filter;
*
* @hide
*/
+@SystemApi
public class TsRecordEvent extends FilterEvent {
private final int mPid;
private final int mTsIndexMask;
private final int mScIndexMask;
- private final long mByteNumber;
+ private final long mDataLength;
// This constructor is used by JNI code only
- private TsRecordEvent(int pid, int tsIndexMask, int scIndexMask, long byteNumber) {
+ private TsRecordEvent(int pid, int tsIndexMask, int scIndexMask, long dataLength) {
mPid = pid;
mTsIndexMask = tsIndexMask;
mScIndexMask = scIndexMask;
- mByteNumber = byteNumber;
+ mDataLength = dataLength;
}
/**
* Gets packet ID.
*/
- public int getTpid() {
+ public int getPacketId() {
return mPid;
}
/**
- * Gets TS index mask.
+ * Gets TS (transport stream) index mask.
*/
@RecordSettings.TsIndexMask
public int getTsIndexMask() {
return mTsIndexMask;
}
/**
- * Gets SC index mask.
+ * Gets SC (Start Code) index mask.
*
* <p>The index type is SC or SC-HEVC, and is set when configuring the filter.
*/
@@ -64,9 +66,10 @@ public class TsRecordEvent extends FilterEvent {
}
/**
- * Gets the byte number from beginning of the filter's output.
+ * Gets data size in bytes of filtered data.
*/
- public long getByteNumber() {
- return mByteNumber;
+ @BytesLong
+ public long getDataLength() {
+ return mDataLength;
}
}
diff --git a/media/java/android/media/tv/tuner/frontend/AnalogFrontendSettings.java b/media/java/android/media/tv/tuner/frontend/AnalogFrontendSettings.java
index 614d79ce99c5..61880ab5f553 100644
--- a/media/java/android/media/tv/tuner/frontend/AnalogFrontendSettings.java
+++ b/media/java/android/media/tv/tuner/frontend/AnalogFrontendSettings.java
@@ -37,7 +37,9 @@ public class AnalogFrontendSettings extends FrontendSettings {
/** @hide */
@IntDef(flag = true,
prefix = "SIGNAL_TYPE_",
- value = {SIGNAL_TYPE_UNDEFINED, SIGNAL_TYPE_PAL, SIGNAL_TYPE_SECAM, SIGNAL_TYPE_NTSC})
+ value = {SIGNAL_TYPE_UNDEFINED, SIGNAL_TYPE_AUTO, SIGNAL_TYPE_PAL, SIGNAL_TYPE_PAL_M,
+ SIGNAL_TYPE_PAL_N, SIGNAL_TYPE_PAL_60, SIGNAL_TYPE_NTSC, SIGNAL_TYPE_NTSC_443,
+ SIGNAL_TYPE_SECAM})
@Retention(RetentionPolicy.SOURCE)
public @interface SignalType {}
@@ -46,25 +48,44 @@ public class AnalogFrontendSettings extends FrontendSettings {
*/
public static final int SIGNAL_TYPE_UNDEFINED = Constants.FrontendAnalogType.UNDEFINED;
/**
+ * AUTO analog signal type.
+ */
+ public static final int SIGNAL_TYPE_AUTO = Constants.FrontendAnalogType.AUTO;
+ /**
* PAL analog signal type.
*/
public static final int SIGNAL_TYPE_PAL = Constants.FrontendAnalogType.PAL;
/**
- * SECM analog signal type.
+ * PAL M analog signal type.
*/
- public static final int SIGNAL_TYPE_SECAM = Constants.FrontendAnalogType.SECAM;
+ public static final int SIGNAL_TYPE_PAL_M = Constants.FrontendAnalogType.PAL_M;
+ /**
+ * PAL N analog signal type.
+ */
+ public static final int SIGNAL_TYPE_PAL_N = Constants.FrontendAnalogType.PAL_N;
+ /**
+ * PAL 60 analog signal type.
+ */
+ public static final int SIGNAL_TYPE_PAL_60 = Constants.FrontendAnalogType.PAL_60;
/**
* NTSC analog signal type.
*/
public static final int SIGNAL_TYPE_NTSC = Constants.FrontendAnalogType.NTSC;
-
+ /**
+ * NTSC 443 analog signal type.
+ */
+ public static final int SIGNAL_TYPE_NTSC_443 = Constants.FrontendAnalogType.NTSC_443;
+ /**
+ * SECM analog signal type.
+ */
+ public static final int SIGNAL_TYPE_SECAM = Constants.FrontendAnalogType.SECAM;
/** @hide */
@IntDef(flag = true,
prefix = "SIF_",
- value = {SIF_UNDEFINED, SIF_BG, SIF_BG_A2, SIF_BG_NICAM, SIF_I, SIF_DK,
- SIF_DK1, SIF_DK2, SIF_DK3, SIF_DK_NICAM, SIF_L, SIF_M, SIF_M_BTSC, SIF_M_A2,
- SIF_M_EIA_J, SIF_I_NICAM, SIF_L_NICAM, SIF_L_PRIME})
+ value = {SIF_UNDEFINED, SIF_AUTO, SIF_BG, SIF_BG_A2, SIF_BG_NICAM, SIF_I, SIF_DK,
+ SIF_DK1_A2, SIF_DK2_A2, SIF_DK3_A2, SIF_DK_NICAM, SIF_L, SIF_M, SIF_M_BTSC, SIF_M_A2,
+ SIF_M_EIAJ, SIF_I_NICAM, SIF_L_NICAM, SIF_L_PRIME})
@Retention(RetentionPolicy.SOURCE)
public @interface SifStandard {}
@@ -73,6 +94,10 @@ public class AnalogFrontendSettings extends FrontendSettings {
*/
public static final int SIF_UNDEFINED = Constants.FrontendAnalogSifStandard.UNDEFINED;
/**
+ * Audo Analog Standard Interchange Format (SIF).
+ */
+ public static final int SIF_AUTO = Constants.FrontendAnalogSifStandard.AUTO;
+ /**
* BG Analog Standard Interchange Format (SIF).
*/
public static final int SIF_BG = Constants.FrontendAnalogSifStandard.BG;
@@ -93,17 +118,17 @@ public class AnalogFrontendSettings extends FrontendSettings {
*/
public static final int SIF_DK = Constants.FrontendAnalogSifStandard.DK;
/**
- * DK1 Analog Standard Interchange Format (SIF).
+ * DK1 A2 Analog Standard Interchange Format (SIF).
*/
- public static final int SIF_DK1 = Constants.FrontendAnalogSifStandard.DK1;
+ public static final int SIF_DK1_A2 = Constants.FrontendAnalogSifStandard.DK1_A2;
/**
- * DK2 Analog Standard Interchange Format (SIF).
+ * DK2 A2 Analog Standard Interchange Format (SIF).
*/
- public static final int SIF_DK2 = Constants.FrontendAnalogSifStandard.DK2;
+ public static final int SIF_DK2_A2 = Constants.FrontendAnalogSifStandard.DK2_A2;
/**
- * DK3 Analog Standard Interchange Format (SIF).
+ * DK3 A2 Analog Standard Interchange Format (SIF).
*/
- public static final int SIF_DK3 = Constants.FrontendAnalogSifStandard.DK3;
+ public static final int SIF_DK3_A2 = Constants.FrontendAnalogSifStandard.DK3_A2;
/**
* DK-NICAM Analog Standard Interchange Format (SIF).
*/
@@ -125,9 +150,9 @@ public class AnalogFrontendSettings extends FrontendSettings {
*/
public static final int SIF_M_A2 = Constants.FrontendAnalogSifStandard.M_A2;
/**
- * M-EIA-J Analog Standard Interchange Format (SIF).
+ * M-EIAJ Analog Standard Interchange Format (SIF).
*/
- public static final int SIF_M_EIA_J = Constants.FrontendAnalogSifStandard.M_EIA_J;
+ public static final int SIF_M_EIAJ = Constants.FrontendAnalogSifStandard.M_EIAJ;
/**
* I-NICAM Analog Standard Interchange Format (SIF).
*/
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java
index 32d03db6f7ee..daaa8688e203 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java
@@ -43,12 +43,11 @@ import android.annotation.NonNull;
import android.content.Context;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2;
-import android.media.MediaRouter2.OnCreateSessionListener;
+import android.media.MediaRouter2.OnGetControllerHintsListener;
import android.media.MediaRouter2.RouteCallback;
import android.media.MediaRouter2.RoutingController;
-import android.media.MediaRouter2.SessionCallback;
+import android.media.MediaRouter2.RoutingControllerCallback;
import android.media.RouteDiscoveryPreference;
-import android.media.RoutingSessionInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
@@ -156,33 +155,34 @@ public class MediaRouter2Test {
}
@Test
- public void testRegisterSessionCallbackWithInvalidArguments() {
+ public void testRegisterControllerCallbackWithInvalidArguments() {
Executor executor = mExecutor;
- SessionCallback callback = new SessionCallback();
+ RoutingControllerCallback callback = new RoutingControllerCallback();
// Tests null executor
assertThrows(NullPointerException.class,
- () -> mRouter2.registerSessionCallback(null, callback));
+ () -> mRouter2.registerControllerCallback(null, callback));
// Tests null callback
assertThrows(NullPointerException.class,
- () -> mRouter2.registerSessionCallback(executor, null));
+ () -> mRouter2.registerControllerCallback(executor, null));
}
@Test
- public void testUnregisterSessionCallbackWithNullCallback() {
+ public void testUnregisterControllerCallbackWithNullCallback() {
// Tests null callback
assertThrows(NullPointerException.class,
- () -> mRouter2.unregisterSessionCallback(null));
+ () -> mRouter2.unregisterControllerCallback(null));
}
@Test
- public void testRequestCreateSessionWithNullRoute() {
- assertThrows(NullPointerException.class, () -> mRouter2.requestCreateSession(null));
+ public void testRequestCreateControllerWithNullRoute() {
+ assertThrows(NullPointerException.class,
+ () -> mRouter2.requestCreateController(null));
}
@Test
- public void testRequestCreateSessionSuccess() throws Exception {
+ public void testRequestCreateControllerSuccess() throws Exception {
final List<String> sampleRouteFeature = new ArrayList<>();
sampleRouteFeature.add(FEATURE_SAMPLE);
@@ -195,9 +195,9 @@ public class MediaRouter2Test {
final List<RoutingController> controllers = new ArrayList<>();
// Create session with this route
- SessionCallback sessionCallback = new SessionCallback() {
+ RoutingControllerCallback controllerCallback = new RoutingControllerCallback() {
@Override
- public void onSessionCreated(RoutingController controller) {
+ public void onControllerCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(createRouteMap(controller.getSelectedRoutes()).containsKey(ROUTE_ID1));
controllers.add(controller);
@@ -205,7 +205,7 @@ public class MediaRouter2Test {
}
@Override
- public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
+ public void onControllerCreationFailed(MediaRoute2Info requestedRoute) {
failureLatch.countDown();
}
};
@@ -215,8 +215,8 @@ public class MediaRouter2Test {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
try {
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
- mRouter2.requestCreateSession(route);
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
+ mRouter2.requestCreateController(route);
assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
// onSessionCreationFailed should not be called.
@@ -224,12 +224,12 @@ public class MediaRouter2Test {
} finally {
releaseControllers(controllers);
mRouter2.unregisterRouteCallback(routeCallback);
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
}
@Test
- public void testRequestCreateSessionFailure() throws Exception {
+ public void testRequestCreateControllerFailure() throws Exception {
final List<String> sampleRouteType = new ArrayList<>();
sampleRouteType.add(FEATURE_SAMPLE);
@@ -242,15 +242,15 @@ public class MediaRouter2Test {
final List<RoutingController> controllers = new ArrayList<>();
// Create session with this route
- SessionCallback sessionCallback = new SessionCallback() {
+ RoutingControllerCallback controllerCallback = new RoutingControllerCallback() {
@Override
- public void onSessionCreated(RoutingController controller) {
+ public void onControllerCreated(RoutingController controller) {
controllers.add(controller);
successLatch.countDown();
}
@Override
- public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
+ public void onControllerCreationFailed(MediaRoute2Info requestedRoute) {
assertEquals(route, requestedRoute);
failureLatch.countDown();
}
@@ -261,8 +261,8 @@ public class MediaRouter2Test {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
try {
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
- mRouter2.requestCreateSession(route);
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
+ mRouter2.requestCreateController(route);
assertTrue(failureLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
// onSessionCreated should not be called.
@@ -270,12 +270,12 @@ public class MediaRouter2Test {
} finally {
releaseControllers(controllers);
mRouter2.unregisterRouteCallback(routeCallback);
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
}
@Test
- public void testRequestCreateSessionMultipleSessions() throws Exception {
+ public void testRequestCreateControllerMultipleSessions() throws Exception {
final List<String> sampleRouteType = new ArrayList<>();
sampleRouteType.add(FEATURE_SAMPLE);
@@ -284,15 +284,15 @@ public class MediaRouter2Test {
final List<RoutingController> createdControllers = new ArrayList<>();
// Create session with this route
- SessionCallback sessionCallback = new SessionCallback() {
+ RoutingControllerCallback controllerCallback = new RoutingControllerCallback() {
@Override
- public void onSessionCreated(RoutingController controller) {
+ public void onControllerCreated(RoutingController controller) {
createdControllers.add(controller);
successLatch.countDown();
}
@Override
- public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
+ public void onControllerCreationFailed(MediaRoute2Info requestedRoute) {
failureLatch.countDown();
}
};
@@ -308,9 +308,9 @@ public class MediaRouter2Test {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
try {
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
- mRouter2.requestCreateSession(route1);
- mRouter2.requestCreateSession(route2);
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
+ mRouter2.requestCreateController(route1);
+ mRouter2.requestCreateController(route2);
assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
// onSessionCreationFailed should not be called.
@@ -321,19 +321,19 @@ public class MediaRouter2Test {
RoutingController controller1 = createdControllers.get(0);
RoutingController controller2 = createdControllers.get(1);
- assertNotEquals(controller1.getSessionId(), controller2.getSessionId());
+ assertNotEquals(controller1.getId(), controller2.getId());
assertTrue(createRouteMap(controller1.getSelectedRoutes()).containsKey(ROUTE_ID1));
assertTrue(createRouteMap(controller2.getSelectedRoutes()).containsKey(ROUTE_ID2));
} finally {
releaseControllers(createdControllers);
mRouter2.unregisterRouteCallback(routeCallback);
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
}
@Test
- public void testSetOnCreateSessionListener() throws Exception {
+ public void testSetOnGetControllerHintsListener() throws Exception {
final List<String> sampleRouteFeature = new ArrayList<>();
sampleRouteFeature.add(FEATURE_SAMPLE);
@@ -343,9 +343,9 @@ public class MediaRouter2Test {
final Bundle createSessionHints = new Bundle();
createSessionHints.putString(TEST_KEY, TEST_VALUE);
- final OnCreateSessionListener listener = new OnCreateSessionListener() {
+ final OnGetControllerHintsListener listener = new OnGetControllerHintsListener() {
@Override
- public Bundle onCreateSession(MediaRoute2Info route) {
+ public Bundle onGetControllerHints(MediaRoute2Info route) {
return createSessionHints;
}
};
@@ -355,9 +355,9 @@ public class MediaRouter2Test {
final List<RoutingController> controllers = new ArrayList<>();
// Create session with this route
- SessionCallback sessionCallback = new SessionCallback() {
+ RoutingControllerCallback controllerCallback = new RoutingControllerCallback() {
@Override
- public void onSessionCreated(RoutingController controller) {
+ public void onControllerCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(createRouteMap(controller.getSelectedRoutes()).containsKey(ROUTE_ID1));
@@ -373,7 +373,7 @@ public class MediaRouter2Test {
}
@Override
- public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
+ public void onControllerCreationFailed(MediaRoute2Info requestedRoute) {
failureLatch.countDown();
}
};
@@ -383,12 +383,12 @@ public class MediaRouter2Test {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
try {
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
// The SampleMediaRoute2ProviderService supposed to set control hints
// with the given creationSessionHints.
- mRouter2.setOnCreateSessionListener(listener);
- mRouter2.requestCreateSession(route);
+ mRouter2.setOnGetControllerHintsListener(listener);
+ mRouter2.requestCreateController(route);
assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
// onSessionCreationFailed should not be called.
@@ -396,12 +396,12 @@ public class MediaRouter2Test {
} finally {
releaseControllers(controllers);
mRouter2.unregisterRouteCallback(routeCallback);
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
}
@Test
- public void testSessionCallbackIsNotCalledAfterUnregistered() throws Exception {
+ public void testRoutingControllerCallbackIsNotCalledAfterUnregistered() throws Exception {
final List<String> sampleRouteType = new ArrayList<>();
sampleRouteType.add(FEATURE_SAMPLE);
@@ -414,15 +414,15 @@ public class MediaRouter2Test {
final List<RoutingController> controllers = new ArrayList<>();
// Create session with this route
- SessionCallback sessionCallback = new SessionCallback() {
+ RoutingControllerCallback controllerCallback = new RoutingControllerCallback() {
@Override
- public void onSessionCreated(RoutingController controller) {
+ public void onControllerCreated(RoutingController controller) {
controllers.add(controller);
successLatch.countDown();
}
@Override
- public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
+ public void onControllerCreationFailed(MediaRoute2Info requestedRoute) {
failureLatch.countDown();
}
};
@@ -432,11 +432,11 @@ public class MediaRouter2Test {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
try {
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
- mRouter2.requestCreateSession(route);
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
+ mRouter2.requestCreateController(route);
// Unregisters session callback
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
// No session callback methods should be called.
assertFalse(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
@@ -444,7 +444,7 @@ public class MediaRouter2Test {
} finally {
releaseControllers(controllers);
mRouter2.unregisterRouteCallback(routeCallback);
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
}
@@ -458,59 +458,49 @@ public class MediaRouter2Test {
MediaRoute2Info routeToCreateSessionWith = routes.get(ROUTE_ID1);
assertNotNull(routeToCreateSessionWith);
- final CountDownLatch onSessionCreatedLatch = new CountDownLatch(1);
- final CountDownLatch onSessionInfoChangedLatchForSelect = new CountDownLatch(1);
- final CountDownLatch onSessionInfoChangedLatchForDeselect = new CountDownLatch(1);
+ final CountDownLatch onControllerCreatedLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatchForSelect = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatchForDeselect = new CountDownLatch(1);
final List<RoutingController> controllers = new ArrayList<>();
// Create session with ROUTE_ID1
- SessionCallback sessionCallback = new SessionCallback() {
+ RoutingControllerCallback controllerCallback = new RoutingControllerCallback() {
@Override
- public void onSessionCreated(RoutingController controller) {
+ public void onControllerCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(getRouteIds(controller.getSelectedRoutes()).contains(ROUTE_ID1));
controllers.add(controller);
- onSessionCreatedLatch.countDown();
+ onControllerCreatedLatch.countDown();
}
@Override
- public void onSessionInfoChanged(RoutingController controller,
- RoutingSessionInfo oldInfo, RoutingSessionInfo newInfo) {
- if (onSessionCreatedLatch.getCount() != 0
+ public void onControllerUpdated(RoutingController controller) {
+ if (onControllerCreatedLatch.getCount() != 0
|| !TextUtils.equals(
- controllers.get(0).getSessionId(), controller.getSessionId())) {
+ controllers.get(0).getId(), controller.getId())) {
return;
}
- if (onSessionInfoChangedLatchForSelect.getCount() != 0) {
- // Check oldInfo
- assertEquals(controller.getSessionId(), oldInfo.getId());
- assertEquals(1, oldInfo.getSelectedRoutes().size());
- assertTrue(oldInfo.getSelectedRoutes().contains(ROUTE_ID1));
- assertTrue(oldInfo.getSelectableRoutes().contains(
- ROUTE_ID4_TO_SELECT_AND_DESELECT));
-
- // Check newInfo
- assertEquals(controller.getSessionId(), newInfo.getId());
- assertEquals(2, newInfo.getSelectedRoutes().size());
- assertTrue(newInfo.getSelectedRoutes().contains(ROUTE_ID1));
- assertTrue(newInfo.getSelectedRoutes().contains(
- ROUTE_ID4_TO_SELECT_AND_DESELECT));
- assertFalse(newInfo.getSelectableRoutes().contains(
- ROUTE_ID4_TO_SELECT_AND_DESELECT));
-
- onSessionInfoChangedLatchForSelect.countDown();
+ if (onControllerUpdatedLatchForSelect.getCount() != 0) {
+ assertEquals(2, controller.getSelectedRoutes().size());
+ assertTrue(getRouteIds(controller.getSelectedRoutes())
+ .contains(ROUTE_ID1));
+ assertTrue(getRouteIds(controller.getSelectedRoutes())
+ .contains(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+ assertFalse(getRouteIds(controller.getSelectableRoutes())
+ .contains(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+
+ onControllerUpdatedLatchForSelect.countDown();
} else {
- // Check newInfo
- assertEquals(controller.getSessionId(), newInfo.getId());
- assertEquals(1, newInfo.getSelectedRoutes().size());
- assertTrue(newInfo.getSelectedRoutes().contains(ROUTE_ID1));
- assertFalse(newInfo.getSelectedRoutes().contains(
- ROUTE_ID4_TO_SELECT_AND_DESELECT));
- assertTrue(newInfo.getSelectableRoutes().contains(
- ROUTE_ID4_TO_SELECT_AND_DESELECT));
-
- onSessionInfoChangedLatchForDeselect.countDown();
+ assertEquals(1, controller.getSelectedRoutes().size());
+ assertTrue(getRouteIds(controller.getSelectedRoutes())
+ .contains(ROUTE_ID1));
+ assertFalse(getRouteIds(controller.getSelectedRoutes())
+ .contains(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+ assertTrue(getRouteIds(controller.getSelectableRoutes())
+ .contains(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+
+ onControllerUpdatedLatchForDeselect.countDown();
}
}
};
@@ -520,9 +510,9 @@ public class MediaRouter2Test {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
try {
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
- mRouter2.requestCreateSession(routeToCreateSessionWith);
- assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
+ mRouter2.requestCreateController(routeToCreateSessionWith);
+ assertTrue(onControllerCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals(1, controllers.size());
RoutingController controller = controllers.get(0);
@@ -535,15 +525,15 @@ public class MediaRouter2Test {
assertNotNull(routeToSelectAndDeselect);
controller.selectRoute(routeToSelectAndDeselect);
- assertTrue(onSessionInfoChangedLatchForSelect.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ assertTrue(onControllerUpdatedLatchForSelect.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
controller.deselectRoute(routeToSelectAndDeselect);
- assertTrue(onSessionInfoChangedLatchForDeselect.await(
+ assertTrue(onControllerUpdatedLatchForDeselect.await(
TIMEOUT_MS, TimeUnit.MILLISECONDS));
} finally {
releaseControllers(controllers);
mRouter2.unregisterRouteCallback(routeCallback);
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
}
@@ -556,43 +546,35 @@ public class MediaRouter2Test {
MediaRoute2Info routeToCreateSessionWith = routes.get(ROUTE_ID1);
assertNotNull(routeToCreateSessionWith);
- final CountDownLatch onSessionCreatedLatch = new CountDownLatch(1);
- final CountDownLatch onSessionInfoChangedLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerCreatedLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatch = new CountDownLatch(1);
final List<RoutingController> controllers = new ArrayList<>();
// Create session with ROUTE_ID1
- SessionCallback sessionCallback = new SessionCallback() {
+ RoutingControllerCallback controllerCallback = new RoutingControllerCallback() {
@Override
- public void onSessionCreated(RoutingController controller) {
+ public void onControllerCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(getRouteIds(controller.getSelectedRoutes()).contains(ROUTE_ID1));
controllers.add(controller);
- onSessionCreatedLatch.countDown();
+ onControllerCreatedLatch.countDown();
}
@Override
- public void onSessionInfoChanged(RoutingController controller,
- RoutingSessionInfo oldInfo, RoutingSessionInfo newInfo) {
- if (onSessionCreatedLatch.getCount() != 0
+ public void onControllerUpdated(RoutingController controller) {
+ if (onControllerCreatedLatch.getCount() != 0
|| !TextUtils.equals(
- controllers.get(0).getSessionId(), controller.getSessionId())) {
+ controllers.get(0).getId(), controller.getId())) {
return;
}
-
- // Check oldInfo
- assertEquals(controller.getSessionId(), oldInfo.getId());
- assertEquals(1, oldInfo.getSelectedRoutes().size());
- assertTrue(oldInfo.getSelectedRoutes().contains(ROUTE_ID1));
- assertTrue(oldInfo.getTransferrableRoutes().contains(ROUTE_ID5_TO_TRANSFER_TO));
-
- // Check newInfo
- assertEquals(controller.getSessionId(), newInfo.getId());
- assertEquals(1, newInfo.getSelectedRoutes().size());
- assertFalse(newInfo.getSelectedRoutes().contains(ROUTE_ID1));
- assertTrue(newInfo.getSelectedRoutes().contains(ROUTE_ID5_TO_TRANSFER_TO));
- assertFalse(newInfo.getTransferrableRoutes().contains(ROUTE_ID5_TO_TRANSFER_TO));
-
- onSessionInfoChangedLatch.countDown();
+ assertEquals(1, controller.getSelectedRoutes().size());
+ assertFalse(getRouteIds(controller.getSelectedRoutes()).contains(ROUTE_ID1));
+ assertTrue(getRouteIds(controller.getSelectedRoutes())
+ .contains(ROUTE_ID5_TO_TRANSFER_TO));
+ assertFalse(getRouteIds(controller.getTransferrableRoutes())
+ .contains(ROUTE_ID5_TO_TRANSFER_TO));
+
+ onControllerUpdatedLatch.countDown();
}
};
@@ -601,9 +583,9 @@ public class MediaRouter2Test {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
try {
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
- mRouter2.requestCreateSession(routeToCreateSessionWith);
- assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
+ mRouter2.requestCreateController(routeToCreateSessionWith);
+ assertTrue(onControllerCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals(1, controllers.size());
RoutingController controller = controllers.get(0);
@@ -615,18 +597,18 @@ public class MediaRouter2Test {
assertNotNull(routeToTransferTo);
controller.transferToRoute(routeToTransferTo);
- assertTrue(onSessionInfoChangedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ assertTrue(onControllerUpdatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
} finally {
releaseControllers(controllers);
mRouter2.unregisterRouteCallback(routeCallback);
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
}
- // TODO: Add tests for onSessionReleased() call.
+ // TODO: Add tests for onSessionReleased() when provider releases the session.
@Test
- public void testRoutingControllerReleaseShouldIgnoreTransferTo() throws Exception {
+ public void testRoutingControllerRelease() throws Exception {
final List<String> sampleRouteType = new ArrayList<>();
sampleRouteType.add(FEATURE_SAMPLE);
@@ -634,29 +616,37 @@ public class MediaRouter2Test {
MediaRoute2Info routeToCreateSessionWith = routes.get(ROUTE_ID1);
assertNotNull(routeToCreateSessionWith);
- final CountDownLatch onSessionCreatedLatch = new CountDownLatch(1);
- final CountDownLatch onSessionInfoChangedLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerCreatedLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerReleasedLatch = new CountDownLatch(1);
final List<RoutingController> controllers = new ArrayList<>();
// Create session with ROUTE_ID1
- SessionCallback sessionCallback = new SessionCallback() {
+ RoutingControllerCallback controllerCallback = new RoutingControllerCallback() {
@Override
- public void onSessionCreated(RoutingController controller) {
+ public void onControllerCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(getRouteIds(controller.getSelectedRoutes()).contains(ROUTE_ID1));
controllers.add(controller);
- onSessionCreatedLatch.countDown();
+ onControllerCreatedLatch.countDown();
}
@Override
- public void onSessionInfoChanged(RoutingController controller,
- RoutingSessionInfo oldInfo, RoutingSessionInfo newInfo) {
- if (onSessionCreatedLatch.getCount() != 0
- || !TextUtils.equals(
- controllers.get(0).getSessionId(), controller.getSessionId())) {
+ public void onControllerUpdated(RoutingController controller) {
+ if (onControllerCreatedLatch.getCount() != 0
+ || !TextUtils.equals(controllers.get(0).getId(), controller.getId())) {
return;
}
- onSessionInfoChangedLatch.countDown();
+ onControllerUpdatedLatch.countDown();
+ }
+
+ @Override
+ public void onControllerReleased(RoutingController controller) {
+ if (onControllerCreatedLatch.getCount() != 0
+ || !TextUtils.equals(controllers.get(0).getId(), controller.getId())) {
+ return;
+ }
+ onControllerReleasedLatch.countDown();
}
};
@@ -665,9 +655,9 @@ public class MediaRouter2Test {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
try {
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
- mRouter2.requestCreateSession(routeToCreateSessionWith);
- assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
+ mRouter2.requestCreateController(routeToCreateSessionWith);
+ assertTrue(onControllerCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals(1, controllers.size());
RoutingController controller = controllers.get(0);
@@ -684,14 +674,25 @@ public class MediaRouter2Test {
// This call should be ignored.
// The onSessionInfoChanged() shouldn't be called.
controller.transferToRoute(routeToTransferTo);
- assertFalse(onSessionInfoChangedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ assertFalse(onControllerUpdatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ // onControllerReleased should be called.
+ assertTrue(onControllerReleasedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
} finally {
releaseControllers(controllers);
mRouter2.unregisterRouteCallback(routeCallback);
- mRouter2.unregisterSessionCallback(sessionCallback);
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
}
+ // TODO: Consider adding tests with bluetooth connection/disconnection.
+ @Test
+ public void testGetSystemController() {
+ final RoutingController systemController = mRouter2.getSystemController();
+ assertNotNull(systemController);
+ assertFalse(systemController.isReleased());
+ }
+
// Helper for getting routes easily
static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) {
Map<String, MediaRoute2Info> routeMap = new HashMap<>();
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java
index cba8452fe9c2..7726e90674f2 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java
@@ -28,7 +28,7 @@ import android.content.Intent;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2;
import android.media.MediaRouter2.RouteCallback;
-import android.media.MediaRouter2.SessionCallback;
+import android.media.MediaRouter2.RoutingControllerCallback;
import android.media.MediaRouter2Manager;
import android.media.RouteDiscoveryPreference;
import android.media.RoutingSessionInfo;
@@ -110,7 +110,7 @@ public class MediaRouterManagerTest {
private final List<MediaRouter2Manager.Callback> mManagerCallbacks = new ArrayList<>();
private final List<RouteCallback> mRouteCallbacks = new ArrayList<>();
- private final List<SessionCallback> mSessionCallbacks = new ArrayList<>();
+ private final List<RoutingControllerCallback> mControllerCallbacks = new ArrayList<>();
public static final List<String> FEATURES_ALL = new ArrayList();
public static final List<String> FEATURES_SPECIAL = new ArrayList();
@@ -213,9 +213,9 @@ public class MediaRouterManagerTest {
addManagerCallback(new MediaRouter2Manager.Callback());
//TODO: remove this when it's not necessary.
addRouterCallback(new MediaRouter2.RouteCallback());
- addSessionCallback(new SessionCallback() {
+ addSessionCallback(new RoutingControllerCallback() {
@Override
- public void onSessionCreated(MediaRouter2.RoutingController controller) {
+ public void onControllerCreated(MediaRouter2.RoutingController controller) {
if (createRouteMap(controller.getSelectedRoutes()).containsKey(ROUTE_ID1)) {
latch.countDown();
}
@@ -227,7 +227,7 @@ public class MediaRouterManagerTest {
mManager.selectRoute(mPackageName, routeToSelect);
assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
- assertEquals(1, mManager.getActiveSessions().size());
+ assertEquals(2, mManager.getActiveSessions().size());
}
@Test
@@ -414,9 +414,9 @@ public class MediaRouterManagerTest {
mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY);
}
- private void addSessionCallback(SessionCallback sessionCallback) {
- mSessionCallbacks.add(sessionCallback);
- mRouter2.registerSessionCallback(mExecutor, sessionCallback);
+ private void addSessionCallback(RoutingControllerCallback controllerCallback) {
+ mControllerCallbacks.add(controllerCallback);
+ mRouter2.registerControllerCallback(mExecutor, controllerCallback);
}
private void clearCallbacks() {
@@ -430,10 +430,10 @@ public class MediaRouterManagerTest {
}
mRouteCallbacks.clear();
- for (SessionCallback sessionCallback : mSessionCallbacks) {
- mRouter2.unregisterSessionCallback(sessionCallback);
+ for (RoutingControllerCallback controllerCallback : mControllerCallbacks) {
+ mRouter2.unregisterControllerCallback(controllerCallback);
}
- mSessionCallbacks.clear();
+ mControllerCallbacks.clear();
}
private void releaseAllSessions() {
diff --git a/packages/CarSystemUI/res/layout/super_notification_shade.xml b/packages/CarSystemUI/res/layout/super_notification_shade.xml
new file mode 100644
index 000000000000..3fe1ea331a07
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/super_notification_shade.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<!-- This is the notification shade window. -->
+<com.android.systemui.statusbar.phone.NotificationShadeWindowView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:sysui="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <com.android.systemui.statusbar.BackDropView
+ android:id="@+id/backdrop"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ sysui:ignoreRightInset="true"
+ >
+ <ImageView android:id="@+id/backdrop_back"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"/>
+ <ImageView android:id="@+id/backdrop_front"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"
+ android:visibility="invisible"/>
+ </com.android.systemui.statusbar.BackDropView>
+
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_for_bubble"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ sysui:ignoreRightInset="true"
+ />
+
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_behind"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ sysui:ignoreRightInset="true"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/status_bar_height"
+ android:orientation="vertical"
+ >
+ <FrameLayout
+ android:id="@+id/status_bar_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ />
+
+ <FrameLayout
+ android:id="@+id/car_top_navigation_bar_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+ </LinearLayout>
+
+ <include layout="@layout/brightness_mirror"/>
+
+ <ViewStub android:id="@+id/fullscreen_user_switcher_stub"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/car_fullscreen_user_switcher"/>
+
+ <include layout="@layout/notification_center_activity"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginBottom="@dimen/navigation_bar_height"
+ android:visibility="invisible"/>
+
+ <include layout="@layout/headsup_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="invisible"/>
+
+ <include layout="@layout/status_bar_expanded"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="invisible"/>
+
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_in_front"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ sysui:ignoreRightInset="true"
+ />
+
+</com.android.systemui.statusbar.phone.NotificationShadeWindowView>
diff --git a/packages/CarSystemUI/res/layout/super_status_bar.xml b/packages/CarSystemUI/res/layout/super_status_bar.xml
index 0b346260896a..c7b22f823ba4 100644
--- a/packages/CarSystemUI/res/layout/super_status_bar.xml
+++ b/packages/CarSystemUI/res/layout/super_status_bar.xml
@@ -1,21 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ 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
- -->
-
-<!-- This is the combined status bar / notification panel window. -->
+**
+** Copyright 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.
+*/
+-->
+
+<!-- This is the status bar window. -->
<com.android.systemui.statusbar.phone.StatusBarWindowView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:sysui="http://schemas.android.com/apk/res-auto"
@@ -23,87 +25,9 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true">
- <com.android.systemui.statusbar.BackDropView
- android:id="@+id/backdrop"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone"
- sysui:ignoreRightInset="true"
- >
- <ImageView android:id="@+id/backdrop_back"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="centerCrop"/>
- <ImageView android:id="@+id/backdrop_front"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="centerCrop"
- android:visibility="invisible"/>
- </com.android.systemui.statusbar.BackDropView>
-
- <com.android.systemui.statusbar.ScrimView
- android:id="@+id/scrim_for_bubble"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:importantForAccessibility="no"
- sysui:ignoreRightInset="true"
- />
-
- <com.android.systemui.statusbar.ScrimView
- android:id="@+id/scrim_behind"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:importantForAccessibility="no"
- sysui:ignoreRightInset="true"
- />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="@dimen/status_bar_height"
- android:orientation="vertical"
- >
- <FrameLayout
- android:id="@+id/status_bar_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- />
-
- <FrameLayout
- android:id="@+id/car_top_navigation_bar_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
- </LinearLayout>
-
- <include layout="@layout/brightness_mirror"/>
-
- <ViewStub android:id="@+id/fullscreen_user_switcher_stub"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout="@layout/car_fullscreen_user_switcher"/>
-
- <include layout="@layout/notification_center_activity"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginBottom="@dimen/navigation_bar_height"
- android:visibility="invisible"/>
-
- <include layout="@layout/headsup_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="invisible"/>
-
- <include layout="@layout/status_bar_expanded"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="invisible"/>
-
- <com.android.systemui.statusbar.ScrimView
- android:id="@+id/scrim_in_front"
+ <FrameLayout
+ android:id="@+id/status_bar_container"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:importantForAccessibility="no"
- sysui:ignoreRightInset="true"
- />
+ android:layout_height="wrap_content" />
</com.android.systemui.statusbar.phone.StatusBarWindowView>
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java
index d8c9d17e7179..78764dd19741 100644
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java
@@ -235,7 +235,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
private void buildNavBarWindows() {
mTopNavigationBarWindow = mSuperStatusBarViewFactory
- .getStatusBarWindowView()
+ .getNotificationShadeWindowView()
.findViewById(R.id.car_top_navigation_bar_container);
mBottomNavigationBarWindow = mCarNavigationBarController.getBottomWindow();
mLeftNavigationBarWindow = mCarNavigationBarController.getLeftWindow();
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarShadeControllerImpl.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarShadeControllerImpl.java
index d1d352a08908..755ed25d64e2 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarShadeControllerImpl.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarShadeControllerImpl.java
@@ -24,10 +24,10 @@ import com.android.systemui.assist.AssistManager;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ShadeControllerImpl;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -41,13 +41,13 @@ public class CarShadeControllerImpl extends ShadeControllerImpl {
@Inject
public CarShadeControllerImpl(CommandQueue commandQueue,
StatusBarStateController statusBarStateController,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
WindowManager windowManager,
Lazy<StatusBar> statusBarLazy,
Lazy<AssistManager> assistManagerLazy,
Lazy<BubbleController> bubbleControllerLazy) {
- super(commandQueue, statusBarStateController, statusBarWindowController,
+ super(commandQueue, statusBarStateController, notificationShadeWindowController,
statusBarKeyguardViewManager, windowManager,
statusBarLazy, assistManagerLazy, bubbleControllerLazy);
}
@@ -61,14 +61,14 @@ public class CarShadeControllerImpl extends ShadeControllerImpl {
return;
}
- mStatusBarWindowController.setStatusBarFocusable(false);
- getCarStatusBar().getStatusBarWindowViewController().cancelExpandHelper();
+ mNotificationShadeWindowController.setNotificationShadeFocusable(false);
+ getCarStatusBar().getNotificationShadeWindowViewController().cancelExpandHelper();
getStatusBarView().collapsePanel(true /* animate */, delayed, speedUpFactor);
getCarStatusBar().animateNotificationPanel(getCarStatusBar().getClosingVelocity(), true);
if (!getCarStatusBar().isTracking()) {
- mStatusBarWindowController.setPanelVisible(false);
+ mNotificationShadeWindowController.setPanelVisible(false);
getCarNotificationView().setVisibility(View.INVISIBLE);
}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index 18485dc283f0..76e9ec64e2f2 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -126,13 +126,13 @@ import com.android.systemui.statusbar.phone.LockscreenLockIconController;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ScrimController;
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.StatusBarNotificationActivityStarter;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -303,7 +303,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
Lazy<AssistManager> assistManagerLazy,
NotificationListener notificationListener,
ConfigurationController configurationController,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
LockscreenLockIconController lockscreenLockIconController,
DozeParameters dozeParameters,
ScrimController scrimController,
@@ -391,7 +391,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
assistManagerLazy,
notificationListener,
configurationController,
- statusBarWindowController,
+ notificationShadeWindowController,
lockscreenLockIconController,
dozeParameters,
scrimController,
@@ -545,7 +545,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
mNotificationPanelBackground = getDefaultWallpaper();
mScrimController.setScrimBehindDrawable(mNotificationPanelBackground);
- FragmentHostManager manager = FragmentHostManager.get(mStatusBarWindow);
+ FragmentHostManager manager = FragmentHostManager.get(mPhoneStatusBarWindow);
manager.addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
mBatteryMeterView = fragment.getView().findViewById(R.id.battery);
@@ -646,9 +646,9 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
carNotificationListener.registerAsSystemService(mContext, mCarUxRestrictionManagerWrapper,
carHeadsUpNotificationManager, mNotificationDataManager);
- mNotificationView = mStatusBarWindow.findViewById(R.id.notification_view);
- View glassPane = mStatusBarWindow.findViewById(R.id.glass_pane);
- mHandleBar = mStatusBarWindow.findViewById(R.id.handle_bar);
+ final View glassPane = mNotificationShadeWindowView.findViewById(R.id.glass_pane);
+ mNotificationView = mNotificationShadeWindowView.findViewById(R.id.notification_view);
+ mHandleBar = mNotificationShadeWindowView.findViewById(R.id.handle_bar);
mNotificationView.setClickHandlerFactory(mNotificationClickHandlerFactory);
mNotificationView.setNotificationDataManager(mNotificationDataManager);
@@ -779,7 +779,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
}
// scroll to top
mNotificationList.scrollToPosition(0);
- mStatusBarWindowController.setPanelVisible(true);
+ mNotificationShadeWindowController.setPanelVisible(true);
mNotificationView.setVisibility(View.VISIBLE);
animateNotificationPanel(mOpeningVelocity, false);
@@ -863,7 +863,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
mOpeningVelocity = DEFAULT_FLING_VELOCITY;
mClosingVelocity = DEFAULT_FLING_VELOCITY;
if (isClosing) {
- mStatusBarWindowController.setPanelVisible(false);
+ mNotificationShadeWindowController.setPanelVisible(false);
mNotificationView.setVisibility(View.INVISIBLE);
mNotificationView.setClipBounds(null);
mNotificationViewController.onVisibilityChanged(false);
@@ -1128,7 +1128,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
// when the on-scroll is called for the first time to open.
mNotificationList.scrollToPosition(0);
}
- mStatusBarWindowController.setPanelVisible(true);
+ mNotificationShadeWindowController.setPanelVisible(true);
mNotificationView.setVisibility(View.VISIBLE);
// clips the view for the notification shade when the user scrolls to open.
@@ -1294,7 +1294,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
@Override
protected View createHeadsUpPanel() {
// In SystemUi the view is already in the window so just return a reference.
- return mStatusBarWindow.findViewById(R.id.notification_headsup);
+ return mNotificationShadeWindowView.findViewById(R.id.notification_headsup);
}
@Override
@@ -1320,7 +1320,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
super.setHeadsUpVisible();
if (mHeadsUpPanel.getVisibility() == View.VISIBLE) {
- mStatusBarWindowController.setHeadsUpShowing(true);
+ mNotificationShadeWindowController.setHeadsUpShowing(true);
mStatusBarWindowController.setForceStatusBarVisible(true);
}
}
@@ -1330,7 +1330,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
super.removeNotificationFromPanel(currentHeadsUpNotification);
// If the panel ended up empty and hidden we can remove it from SystemUi
if (mHeadsUpPanel.getVisibility() != View.VISIBLE) {
- mStatusBarWindowController.setHeadsUpShowing(false);
+ mNotificationShadeWindowController.setHeadsUpShowing(false);
mStatusBarWindowController.setForceStatusBarVisible(false);
}
}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java
index 2a2eb6976653..59f9f94c4d05 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java
@@ -28,8 +28,8 @@ import com.android.systemui.navigationbar.car.CarNavigationBarController;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.phone.NavigationModeController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -53,14 +53,14 @@ public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManage
KeyguardUpdateMonitor keyguardUpdateMonitor,
NavigationModeController navigationModeController,
DockManager dockManager,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
KeyguardStateController keyguardStateController,
NotificationMediaManager notificationMediaManager,
CarNavigationBarController carNavigationBarController,
FullscreenUserSwitcher fullscreenUserSwitcher) {
super(context, callback, lockPatternUtils, sysuiStatusBarStateController,
configurationController, keyguardUpdateMonitor, navigationModeController,
- dockManager, statusBarWindowController, keyguardStateController,
+ dockManager, notificationShadeWindowController, keyguardStateController,
notificationMediaManager);
mShouldHideNavBar = context.getResources()
.getBoolean(R.bool.config_hideNavWhenKeyguardBouncerShown);
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java
index 3abbe32df2da..45da8223943b 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java
@@ -85,12 +85,12 @@ import com.android.systemui.statusbar.phone.LockscreenLockIconController;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -173,7 +173,7 @@ public class CarStatusBarModule {
Lazy<AssistManager> assistManagerLazy,
NotificationListener notificationListener,
ConfigurationController configurationController,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
LockscreenLockIconController lockscreenLockIconController,
DozeParameters dozeParameters,
ScrimController scrimController,
@@ -260,7 +260,7 @@ public class CarStatusBarModule {
assistManagerLazy,
notificationListener,
configurationController,
- statusBarWindowController,
+ notificationShadeWindowController,
lockscreenLockIconController,
dozeParameters,
scrimController,
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 5636cc8a3ca3..de4817cc4c49 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -85,6 +85,7 @@ public class SecureSettings {
Settings.Secure.TTY_MODE_ENABLED,
Settings.Secure.RTT_CALLING_MODE,
Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR,
+ Settings.Secure.MINIMAL_POST_PROCESSING_ALLOWED,
Settings.Secure.NIGHT_DISPLAY_CUSTOM_START_TIME,
Settings.Secure.NIGHT_DISPLAY_CUSTOM_END_TIME,
Settings.Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index ed06fa71cff1..849f22f7e0a2 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -131,6 +131,7 @@ public class SecureSettingsValidators {
VALIDATORS.put(
Secure.INCALL_POWER_BUTTON_BEHAVIOR,
new DiscreteValueValidator(new String[] {"1", "2"}));
+ VALIDATORS.put(Secure.MINIMAL_POST_PROCESSING_ALLOWED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.NIGHT_DISPLAY_CUSTOM_START_TIME, NON_NEGATIVE_INTEGER_VALIDATOR);
VALIDATORS.put(Secure.NIGHT_DISPLAY_CUSTOM_END_TIME, NON_NEGATIVE_INTEGER_VALIDATOR);
VALIDATORS.put(Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE, NON_NEGATIVE_INTEGER_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 449a135fa1c7..f6e5062039d2 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1999,6 +1999,9 @@ class SettingsProtoDumpUtil {
dumpSetting(s, p,
Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
SecureSettingsProto.Doze.PULSE_ON_TAP);
+ dumpSetting(s, p,
+ Settings.Secure.SUPPRESS_DOZE,
+ SecureSettingsProto.Doze.SUPPRESS);
p.end(dozeToken);
dumpSetting(s, p,
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index a337570829e4..b896a2a8d9a4 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -726,7 +726,8 @@ public class SettingsBackupTest {
Settings.Secure.FACE_UNLOCK_RE_ENROLL,
Settings.Secure.TAP_GESTURE,
Settings.Secure.WINDOW_MAGNIFICATION,
- Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_MAGNIFICATION_CONTROLLER);
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_MAGNIFICATION_CONTROLLER,
+ Settings.Secure.SUPPRESS_DOZE);
@Test
public void systemSettingsBackedUpOrBlacklisted() {
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 1c63efc3b5bc..fb9bc522f527 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -221,7 +221,10 @@
<!-- Permission required for CTS test - UiModeManagerTest -->
<uses-permission android:name="android.permission.ENTER_CAR_MODE_PRIORITIZED"/>
- <!-- Permission required for CTS test - CarModeInCallServiceTest -->
+ <!-- Permission required for CTS test - SystemConfigTest -->
+ <uses-permission android:name="android.permission.READ_CARRIER_APP_INFO"/>
+
+ <!-- Permission required for CTS test - CarModeInCallServiceTest -->
<uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
<!-- Permission requried for CTS test - CellBroadcastIntentsTest -->
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index 92dd9fd96111..8a1f6de432f8 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Geen diens nie."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Wissel invoermetode"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Vliegtuigmodus"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN word vereis om vir opdatering voor te berei"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Patroon word vereis om vir opdatering voor te berei"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Wagwoord word vereis om vir opdatering voor te berei"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Patroon word vereis nadat toestel herbegin het"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN word vereis nadat toestel herbegin het"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Wagwoord word vereis nadat toestel herbegin het"</string>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index f94c20f9ad01..0a4aee53b7be 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"ከአገልግሎት መስጫ ክልል ውጪ።"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"የግቤት ስልት ቀይር"</string>
<string name="airplane_mode" msgid="2528005343938497866">"የአውሮፕላን ሁነታ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"ለዝማኔ ለማዘጋጀት ፒን ያስፈልጋል"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"ለዝማኔ ለማዘጋጀት ሥርዓተ ጥለት ያስፈልጋል"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"ለዝማኔ ለማዘጋጀት የይለፍ ቃል ያስፈልጋል"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"መሣሪያ ዳግም ከጀመረ በኋላ ሥርዓተ ጥለት ያስፈልጋል"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"መሣሪያ ዳግም ከተነሳ በኋላ ፒን ያስፈልጋል"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"መሣሪያ ዳግም ከጀመረ በኋላ የይለፍ ቃል ያስፈልጋል"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index 393da273ad49..491dc39aa08d 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -48,7 +48,7 @@
<string name="keyguard_permanent_disabled_sim_instructions" msgid="2490584154727897806">"‏تم إيقاف شريحة SIM بشكل دائم.\n اتصل بمقدم خدمة اللاسلكي للحصول على شريحة SIM أخرى."</string>
<string name="keyguard_sim_locked_message" msgid="4343544458476911044">"‏شريحة SIM مؤمّنة."</string>
<string name="keyguard_sim_puk_locked_message" msgid="6253830777745450550">"‏شريحة SIM مؤمّنة برمز PUK."</string>
- <string name="keyguard_sim_unlock_progress_dialog_message" msgid="2394023844117630429">"‏جارٍ إلغاء تأمين شريحة SIM…"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="2394023844117630429">"‏جارٍ فتح قفل شريحة SIM…"</string>
<string name="keyguard_accessibility_pin_area" msgid="7403009340414014734">"منطقة رقم التعريف الشخصي"</string>
<string name="keyguard_accessibility_password" msgid="3524161948484801450">"كلمة مرور الجهاز"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="6272116591533888062">"‏منطقة رقم التعريف الشخصي لشريحة SIM"</string>
@@ -81,7 +81,7 @@
<string name="kg_puk_enter_puk_hint_multi" msgid="4876780689904862943">"‏SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" غير مفعّلة الآن. أدخل رمز PUK للمتابعة. واتصل بمشغل شبكة الجوّال لمعرفة التفاصيل."</string>
<string name="kg_puk_enter_pin_hint" msgid="6028432138916150399">"أدخل رمز رقم التعريف الشخصي المطلوب"</string>
<string name="kg_enter_confirm_pin_hint" msgid="4261064020391799132">"تأكيد رمز رقم التعريف الشخصي المطلوب"</string>
- <string name="kg_sim_unlock_progress_dialog_message" msgid="4251352015304070326">"‏جارٍ إلغاء تأمين شريحة SIM…"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4251352015304070326">"‏جارٍ فتح قفل شريحة SIM…"</string>
<string name="kg_invalid_sim_pin_hint" msgid="2762202646949552978">"اكتب رمز رقم التعريف الشخصي المكوّن من ٤ إلى ٨ أرقام."</string>
<string name="kg_invalid_sim_puk_hint" msgid="5319756880543857694">"‏يجب أن يتضمن رمز PUK‏ ۸ أرقام أو أكثر."</string>
<string name="kg_invalid_puk" msgid="1774337070084931186">"‏أعد إدخال رمز PUK الصحيح. وستؤدي المحاولات المتكررة إلى إيقاف شريحة SIM نهائيًا."</string>
@@ -113,6 +113,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"لا تتوفر خدمة."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"تبديل أسلوب الإدخال"</string>
<string name="airplane_mode" msgid="2528005343938497866">"وضع الطائرة"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"يجب إدخال رقم التعريف الشخصي للتحضير للتحديث."</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"يجب رسم النقش للتحضير للتحديث."</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"يجب إدخال كلمة المرور للتحضير للتحديث."</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"يجب رسم النقش بعد إعادة تشغيل الجهاز"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"يجب إدخال رقم التعريف الشخصي بعد إعادة تشغيل الجهاز"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"يجب إدخال كلمة المرور بعد إعادة تشغيل الجهاز"</string>
@@ -125,28 +128,28 @@
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"اختار المشرف قفل الجهاز"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"تم حظر الجهاز يدويًا"</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="1337428979661197957">
- <item quantity="zero">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد النقش.</item>
- <item quantity="two">لم يتم إلغاء تأمين الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد النقش.</item>
- <item quantity="few">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعات. تأكيد النقش.</item>
- <item quantity="many">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد النقش.</item>
- <item quantity="other">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد النقش.</item>
- <item quantity="one">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_0">%d</xliff:g> ساعة. تأكيد النقش.</item>
+ <item quantity="zero">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد النقش.</item>
+ <item quantity="two">لم يتم فتح قفل الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد النقش.</item>
+ <item quantity="few">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعات. تأكيد النقش.</item>
+ <item quantity="many">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد النقش.</item>
+ <item quantity="other">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد النقش.</item>
+ <item quantity="one">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_0">%d</xliff:g> ساعة. تأكيد النقش.</item>
</plurals>
<plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="6444519502336330270">
- <item quantity="zero">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
- <item quantity="two">لم يتم إلغاء تأمين الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد رقم التعريف الشخصي.</item>
- <item quantity="few">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
- <item quantity="many">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
- <item quantity="other">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
- <item quantity="one">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_0">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="zero">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="two">لم يتم فتح قفل الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="few">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="many">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="other">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="one">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_0">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
</plurals>
<plurals name="kg_prompt_reason_time_password" formatted="false" msgid="5343961527665116914">
- <item quantity="zero">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
- <item quantity="two">لم يتم إلغاء تأمين الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد كلمة المرور.</item>
- <item quantity="few">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعات. تأكيد كلمة المرور.</item>
- <item quantity="many">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
- <item quantity="other">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
- <item quantity="one">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_0">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
+ <item quantity="zero">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
+ <item quantity="two">لم يتم فتح قفل الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد كلمة المرور.</item>
+ <item quantity="few">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعات. تأكيد كلمة المرور.</item>
+ <item quantity="many">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
+ <item quantity="other">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
+ <item quantity="one">لم يتم فتح قفل الجهاز لمدة <xliff:g id="NUMBER_0">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
</plurals>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"لم يتم التعرف عليها."</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"لم يتم التعرّف عليه."</string>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index 3b51e480b7dd..4367efb8c679 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"কোনো সেৱা নাই।"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ইনপুট পদ্ধতি সলনি কৰক"</string>
<string name="airplane_mode" msgid="2528005343938497866">"এয়াৰপ্লেন ম\'ড"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"আপডে\'টৰ বাবে সাজু হ\'বলৈ পিনৰ আৱশ্যক"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"আপডে\'টৰ বাবে সাজু হ\'বলৈ আর্হিৰ আৱশ্যক"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"আপডে\'টৰ বাবে সাজু হ\'বলৈ পাছৱৰ্ডৰ আৱশ্যক"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত আৰ্হি দিয়াটো বাধ্যতামূলক"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পিন দিয়াটো বাধ্যতামূলক"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পাছৱৰ্ড দিয়াটো বাধ্যতামূলক"</string>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index d63c23f4d1f6..aadd201b06ee 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Xidmət yoxdur."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Daxiletmə metoduna keçin"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Təyyarə rejimi"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Güncəlləməyə hazırlıq üçün PIN kod tələb olunur"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Güncəlləməyə hazırlıq üçün model tələb olunur"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Güncəlləməyə hazırlıq üçün parol tələb olunur"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Cihaz yenidən başladıqdan sonra model tələb olunur"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Cihaz yeniden başladıqdan sonra PIN tələb olunur"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Cihaz yeniden başladıqdan sonra parol tələb olunur"</string>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index e206958d1e95..656e32301153 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -104,6 +104,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Mreža nije dostupna."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Promeni metod unosa"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Režim rada u avionu"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN je obavezan radi pripreme za ažuriranje"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Šablon je obavezan radi pripreme za ažuriranje"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Lozinka je obavezna radi pripreme za ažuriranje"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Treba da unesete šablon kada se uređaj ponovo pokrene"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Treba da unesete PIN kada se uređaj ponovo pokrene"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Treba da unesete lozinku kada se uređaj ponovo pokrene"</string>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 569e705fbcc2..07b6f358dcfc 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Не абслугоўваецца."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Пераключэнне рэжыму ўводу"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Рэжым палёту"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Для падрыхтоўкі да абнаўлення неабходна ўвесці PIN-код"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Для падрыхтоўкі да абнаўлення неабходна ўвесці ўзор разблакіроўкі"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Для падрыхтоўкі да абнаўлення неабходна ўвесці пароль"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Пасля перазапуску прылады патрабуецца ўзор"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Пасля перазапуску прылады патрабуецца PIN-код"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Пасля перазапуску прылады патрабуецца пароль"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index d015be320e20..a8c64f5d9551 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Няма покритие."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Превключване на метода на въвеждане"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Самолетен режим"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"За подготовката за актуализация се изисква ПИН код"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"За подготовката за актуализация се изисква фигура"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"За подготовката за актуализация се изисква парола"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"След рестартиране на устройството се изисква фигура"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"След рестартиране на устройството се изисква ПИН код"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"След рестартиране на устройството се изисква парола"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 8eae6e6e2e18..479e83ab3954 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"কোনো পরিষেবা নেই।"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ইনপুট পদ্ধতি পরিবর্তন করুন"</string>
<string name="airplane_mode" msgid="2528005343938497866">"বিমান মোড"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"আপডেট প্রস্তুত করতে পিন দরকার"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"আপডেট প্রস্তুত করতে প্যাটার্ন দরকার"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"আপডেট প্রস্তুত করতে পাসওয়ার্ড দরকার"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ডিভাইসটি পুনরায় চালু হওয়ার পর প্যাটার্নের প্রয়োজন হবে"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ডিভাইসটি পুনরায় চালু হওয়ার পর পিন প্রয়োজন হবে"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ডিভাইসটি পুনরায় চালু হওয়ার পর পাসওয়ার্ডের প্রয়োজন হবে"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 286b08be1c5e..ada4c134fce7 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -104,6 +104,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Nema mreže."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Promjena načina unosa"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Način rada u avionu"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Za pripremu ažuriranja potreban je PIN"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Za pripremu ažuriranja potreban je uzorak"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Za pripremu ažuriranja potrebna je lozinka"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Potreban je uzorak nakon što se uređaj ponovo pokrene"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Potreban je PIN nakon što se uređaj ponovo pokrene"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Potrebna je lozinka nakon što se uređaj ponovo pokrene"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index cb7fa37b281d..6f5b6829c3e0 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Sense servei"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Canvia el mètode d\'introducció"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Mode d\'avió"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Cal introduir el PIN per preparar l\'actualització"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Cal introduir el patró per preparar l\'actualització"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Cal introduir la contrasenya per preparar l\'actualització"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Cal introduir el patró quan es reinicia el dispositiu"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Cal introduir el PIN quan es reinicia el dispositiu"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Cal introduir la contrasenya quan es reinicia el dispositiu"</string>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index 4f0c0ffa4962..a2f79adff1db 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Žádný signál"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Přepnout metodu zadávání"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Režim Letadlo"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Příprava na aktualizaci vyžaduje PIN"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Příprava na aktualizaci vyžaduje gesto"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Příprava na aktualizaci vyžaduje heslo"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Po restartování zařízení je vyžadováno gesto"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Po restartování zařízení je vyžadován kód PIN"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Po restartování zařízení je vyžadováno heslo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index e486fc625699..ef06269b5630 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ingen dækning."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Skift indtastningsmetode"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Flytilstand"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Du skal angive din pinkode for at forberede opdateringen"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Du skal angive dit mønster for at forberede opdateringen"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Du skal angive din adgangskode for at forberede opdateringen"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Du skal angive et mønster, når du har genstartet enheden"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Der skal angives en pinkode efter genstart af enheden"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Der skal angives en adgangskode efter genstart af enheden"</string>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 06d012f4e84d..fdfce1ffb338 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Dienst nicht verfügbar"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Eingabemethode wechseln"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Flugmodus"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Zur Vorbereitung auf das Update ist eine PIN erforderlich"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Zur Vorbereitung auf das Update ist ein Muster erforderlich"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Zur Vorbereitung auf das Update ist ein Passwort erforderlich"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Nach dem Neustart des Geräts ist die Eingabe des Musters erforderlich"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Nach dem Neustart des Geräts ist die Eingabe der PIN erforderlich"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Nach dem Neustart des Geräts ist die Eingabe des Passworts erforderlich"</string>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 176428421476..8e4578f8445c 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Καμία υπηρεσία."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Εναλλαγή μεθόδου εισαγωγής"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Λειτουργία πτήσης"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Απαιτείται PIN για την προετοιμασία για ενημέρωση"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Απαιτείται μοτίβο για την προετοιμασία για ενημέρωση"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Απαιτείται κωδικός πρόσβασης για την προετοιμασία για ενημέρωση"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Απαιτείται μοτίβο μετά από την επανεκκίνηση της συσκευής"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Απαιτείται PIN μετά από την επανεκκίνηση της συσκευής"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Απαιτείται κωδικός πρόσβασης μετά από την επανεκκίνηση της συσκευής"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index 92a15949a8ab..21cfe48689ae 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"No service"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Switch input method"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Aeroplane mode"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN required to prepare for update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Pattern required to prepare for update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Password required to prepare for update"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pattern required after device restarts"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN required after device restarts"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password required after device restarts"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 719f1a18a744..921ba6b59af9 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"No service"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Switch input method"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Airplane mode"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN required to prepare for update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Pattern required to prepare for update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Password required to prepare for update"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pattern required after device restarts"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN required after device restarts"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password required after device restarts"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index 92a15949a8ab..21cfe48689ae 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"No service"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Switch input method"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Aeroplane mode"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN required to prepare for update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Pattern required to prepare for update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Password required to prepare for update"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pattern required after device restarts"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN required after device restarts"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password required after device restarts"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index 92a15949a8ab..21cfe48689ae 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"No service"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Switch input method"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Aeroplane mode"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN required to prepare for update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Pattern required to prepare for update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Password required to prepare for update"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pattern required after device restarts"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN required after device restarts"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password required after device restarts"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index 975b1f644ef8..fc59d0dfcdc5 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎No service.‎‏‎‎‏‎"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎Switch input method‎‏‎‎‏‎"</string>
<string name="airplane_mode" msgid="2528005343938497866">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‎Airplane mode‎‏‎‎‏‎"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‏‎PIN required to prepare for update‎‏‎‎‏‎"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‏‏‎Pattern required to prepare for update‎‏‎‎‏‎"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎Password required to prepare for update‎‏‎‎‏‎"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎Pattern required after device restarts‎‏‎‎‏‎"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎PIN required after device restarts‎‏‎‎‏‎"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎Password required after device restarts‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 25ab6159998e..ab0c8f351562 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Sin servicio"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambiar método de entrada"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Modo de avión"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Se requiere el PIN para actualizar el sistema"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Se requiere el patrón para actualizar el sistema"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Se requiere la contraseña para actualizar el sistema"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Se requiere el patrón después de reiniciar el dispositivo"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Se requiere el PIN después de reiniciar el dispositivo"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Se requiere la contraseña después de reiniciar el dispositivo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index ce323c7f65a7..3813dddc49a1 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Sin servicio"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambiar método de introducción"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Modo avión"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Debes introducir el PIN para prepararte para la actualización"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Debes dibujar el patrón para prepararte para la actualización"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Debes introducir la contraseña para prepararte para la actualización"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Debes introducir el patrón después de reiniciar el dispositivo"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Debes introducir el PIN después de reiniciar el dispositivo"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Debes introducir la contraseña después de reiniciar el dispositivo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index 331a95c73c5e..f8ad18bba2f7 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Teenus puudub."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Vaheta sisestusmeetodit"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Lennukirežiim"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Värskendamiseks ettevalmistuste tegemiseks tuleb sisestada PIN-kood"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Värskendamiseks ettevalmistuste tegemiseks tuleb sisestada muster"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Värskendamiseks ettevalmistuste tegemiseks tuleb sisestada parool"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pärast seadme taaskäivitamist tuleb sisestada muster"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Pärast seadme taaskäivitamist tuleb sisestada PIN-kood"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Pärast seadme taaskäivitamist tuleb sisestada parool"</string>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index 3ff224b9e55a..8510bee0711b 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ez dago konektatuta inongo saretara."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Aldatu idazketa-metodoa"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Hegaldi modua"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN kodea behar da eguneratzea prestatzeko"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Eredua behar da eguneratzea prestatzeko"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Pasahitza behar da eguneratzea prestatzeko"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Eredua marraztu beharko duzu gailua berrabiarazten denean"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN kodea idatzi beharko duzu gailua berrabiarazten denean"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Pasahitza idatzi beharko duzu gailua berrabiarazten denean"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index 5e696369634e..43d32140b153 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"سرویسی وجود ندارد."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"تغییر روش ورودی"</string>
<string name="airplane_mode" msgid="2528005343938497866">"حالت هواپیما"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"آماده‌سازی برای به‌روزرسانی به پین نیاز دارد"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"آماده‌سازی برای به‌روزرسانی به الگو نیاز دارد"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"آماده‌سازی برای به‌روزرسانی به گذرواژه نیاز دارد"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"بعد از بازنشانی دستگاه باید الگو وارد شود"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"بعد از بازنشانی دستگاه باید پین وارد شود"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"بعد از بازنشانی دستگاه باید گذرواژه وارد شود"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 54bc4d8cba58..7dc12c93e45e 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ei yhteyttä"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Vaihda syöttötapaa."</string>
<string name="airplane_mode" msgid="2528005343938497866">"Lentokonetila"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Päivitykseen valmistautuminen edellyttää PIN-koodia"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Päivitykseen valmistautuminen edellyttää kuviota"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Päivitykseen valmistautuminen edellyttää salasanaa"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Kuvio vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN-koodi vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Salasana vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 3e858c2ecf12..f093c1745e76 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Aucun service"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Changer de méthode d\'entrée"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Mode Avion"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Le NIP est nécessaire pour préparer la mise à jour"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Le schéma est nécessaire pour préparer la mise à jour"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Le mot de passe est nécessaire pour préparer la mise à jour"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Le schéma est exigé après le redémarrage de l\'appareil"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Le NIP est exigé après le redémarrage de l\'appareil"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Le mot de passe est exigé après le redémarrage de l\'appareil"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 8551fab7281f..d6d5a32874c2 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Aucun service."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Changer le mode de saisie"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Mode Avion"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Veuillez saisir le code pour lancer la préparation de la mise à jour"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Veuillez saisir le schéma pour lancer la préparation de la mise à jour"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Veuillez saisir le mot de passe pour lancer la préparation de la mise à jour"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Veuillez dessiner le schéma après le redémarrage de l\'appareil"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Veuillez saisir le code après le redémarrage de l\'appareil"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Veuillez saisir le mot de passe après le redémarrage de l\'appareil"</string>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 420649eeca60..5b8a255b7f26 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Non hai servizo."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambia o método de introdución"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Modo avión"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Necesítase o PIN para preparar o dispositivo co fin de actualizalo"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Necesítase o padrón para preparar o dispositivo co fin de actualizalo"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Necesítase o contrasinal para preparar o dispositivo co fin de actualizalo"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"É necesario o padrón despois do reinicio do dispositivo"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"É necesario o PIN despois do reinicio do dispositivo"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"É necesario o contrasinal despois do reinicio do dispositivo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index b02d3d97b39f..29e2fe040082 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"કોઈ સેવા નથી."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ઇનપુટ પદ્ધતિ સ્વિચ કરો"</string>
<string name="airplane_mode" msgid="2528005343938497866">"એરપ્લેન મોડ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"અપડેટ માટે તૈયાર કરવા માટે પિન જરુરી છે"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"અપડેટ માટે તૈયાર કરવા માટે પૅટર્ન જરુરી છે"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"અપડેટ માટે તૈયાર કરવા માટે પાસવર્ડ જરુરી છે"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ઉપકરણનો પુનઃપ્રારંભ થાય તે પછી પૅટર્ન જરૂરી છે"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ઉપકરણનો પુનઃપ્રારંભ થાય તે પછી પિન જરૂરી છે"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ઉપકરણનો પુનઃપ્રારંભ થાય તે પછી પાસવર્ડ જરૂરી છે"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index f6b15de0e97e..d26c79f9c420 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"कोई सेवा नहीं."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"इनपुट का तरीका बदलें"</string>
<string name="airplane_mode" msgid="2528005343938497866">"हवाई जहाज़ मोड"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"अपडेट के लिए पिन डालना ज़रूरी है"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"अपडेट के लिए पैटर्न डालना ज़रूरी है"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"अपडेट के लिए पासवर्ड डालना ज़रूरी है"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"डिवाइस फिर से चालू होने के बाद पैटर्न ज़रूरी है"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"डिवाइस फिर से चालू होने के बाद पिन ज़रूरी है"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"डिवाइस फिर से चालू होने के बाद पासवर्ड ज़रूरी है"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 49db3f88669a..c8dd9b0a0932 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -104,6 +104,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Nema usluge."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Promjena načina unosa"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Način rada u zrakoplovu"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Za pripremu ažuriranja potreban je PIN"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Za pripremu ažuriranja potreban je uzorak"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Za pripremu ažuriranja potrebna je zaporka"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Nakon ponovnog pokretanja uređaja morate unijeti uzorak"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Nakon ponovnog pokretanja uređaja morate unijeti PIN"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Nakon ponovnog pokretanja uređaja morate unijeti zaporku"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index c26998f01ff0..f0023d20e6bd 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Nincs szolgáltatás."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Beviteli módszer váltása"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Repülős üzemmód"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"A frissítésre való felkészüléshez meg kell adni a PIN-kódot"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"A frissítésre való felkészüléshez meg kell adni a mintát"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"A frissítésre való felkészüléshez meg kell adni a jelszót"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Az eszköz újraindítását követően meg kell adni a mintát"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Az eszköz újraindítását követően meg kell adni a PIN-kódot"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Az eszköz újraindítását követően meg kell adni a jelszót"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index ad949d48fe0c..42247052014f 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ծառայությունն անհասանելի է։"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Փոխել ներածման եղանակը"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Ավիառեժիմ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Թարմացմանը պատրաստվելու համար անհրաժեշտ է մուտքագրել PIN-ը"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Թարմացմանը պատրաստվելու համար անհրաժեշտ է մուտքագրել նախշը"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Թարմացմանը պատրաստվելու համար անհրաժեշտ է մուտքագրել գաղտնաբառը"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել նախշը"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել PIN կոդը"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել գաղտնաբառը"</string>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index 875d8d51c50b..9c00ff72721e 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Tidak ada layanan."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Beralih metode masukan"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Mode pesawat"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN diwajibkan untuk menyiapkan update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Pola diwajibkan untuk menyiapkan update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Sandi diwajibkan untuk menyiapkan update"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pola diperlukan setelah perangkat dimulai ulang"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN diperlukan setelah perangkat dimulai ulang"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Sandi diperlukan setelah perangkat dimulai ulang"</string>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index e40cdca33034..5e3765571c02 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ekkert símasamband."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Skipta um innsláttaraðferð"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Flugstilling"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Slá þarf inn PIN-númer til að undirbúa uppfærsluna"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Teikna þarf mynstur til að undirbúa uppfærsluna"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Gefa þarf upp aðgangsorð til að undirbúa uppfærsluna"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Mynsturs er krafist þegar tækið er endurræst"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN-númers er krafist þegar tækið er endurræst"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Aðgangsorðs er krafist þegar tækið er endurræst"</string>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 16767d1771fe..80deb34656a0 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Nessun servizio."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambia metodo di immissione"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Modalità aereo"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN obbligatorio per la preparazione all\'aggiornamento"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Sequenza obbligatoria per la preparazione all\'aggiornamento"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Password obbligatoria per la preparazione all\'aggiornamento"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Sequenza obbligatoria dopo il riavvio del dispositivo"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN obbligatorio dopo il riavvio del dispositivo"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password obbligatoria dopo il riavvio del dispositivo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index e054f629836e..71f3048ba11c 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"אין שירות."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"החלפת שיטת קלט"</string>
<string name="airplane_mode" msgid="2528005343938497866">"מצב טיסה"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"נדרש קוד אימות להכנת העדכון"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"נדרש קו ביטול נעילה להכנת העדכון"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"נדרשת סיסמה להכנת העדכון"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"יש להזין את קו ביטול הנעילה לאחר הפעלה מחדש של המכשיר"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"יש להזין קוד גישה לאחר הפעלה מחדש של המכשיר"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"יש להזין סיסמה לאחר הפעלה מחדש של המכשיר"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 957d78a8b440..23ff82c6f2a7 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"通信サービスはありません。"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"入力方法の切り替え"</string>
<string name="airplane_mode" msgid="2528005343938497866">"機内モード"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"更新の準備には PIN の入力が必要です"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"更新の準備にはパターンの入力が必要です"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"更新の準備にはパスワードが必要です"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"デバイスの再起動後はパターンの入力が必要となります"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"デバイスの再起動後は PIN の入力が必要となります"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"デバイスの再起動後はパスワードの入力が必要となります"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index d0d15fec7172..25b9b1b22c1c 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"სერვისი არ არის."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"შეყვანის მეთოდის გადართვა"</string>
<string name="airplane_mode" msgid="2528005343938497866">"თვითმფრინავის რეჟიმი"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"განახლების მოსამზადებლად საჭიროა PIN-კოდი"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"განახლების მოსამზადებლად საჭიროა ნიმუში"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"განახლების მოსამზადებლად საჭიროა პაროლი"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"მოწყობილობის გადატვირთვის შემდეგ საჭიროა ნიმუშის დახატვა"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"მოწყობილობის გადატვირთვის შემდეგ საჭიროა PIN-კოდის შეყვანა"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"მოწყობილობის გადატვირთვის შემდეგ საჭიროა პაროლის შეყვანა"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index 96972a7577cf..4989e91ac028 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Қызмет көрсетілмейді."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Енгізу әдісін ауыстыру"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Ұшақ режимі"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Жаңа нұсқа орнатуға дайындау үшін PIN кодын енгізу қажет."</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Жаңа нұсқа орнатуға дайындау үшін өрнек енгізу қажет."</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Жаңа нұсқа орнатуға дайындау үшін құпия сөз енгізу қажет."</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Құрылғы қайта іске қосылғаннан кейін, өрнекті енгізу қажет"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Құрылғы қайта іске қосылғаннан кейін, PIN кодын енгізу қажет"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Құрылғы қайта іске қосылғаннан кейін, құпия сөзді енгізу қажет"</string>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 24b5c23a6732..e5ea9ea105dd 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"គ្មាន​សេវា​ទេ។"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ប្ដូរ​វិធី​បញ្ចូល"</string>
<string name="airplane_mode" msgid="2528005343938497866">"មុខងារ​ពេល​ជិះ​យន្តហោះ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"តម្រូវ​ឱ្យ​មាន​កូដ PIN ដើម្បី​រៀបចំ​ធ្វើបច្ចុប្បន្នភាព"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"តម្រូវ​ឱ្យ​មាន​លំនាំ ដើម្បី​រៀបចំ​ធ្វើបច្ចុប្បន្នភាព"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"តម្រូវ​ឱ្យ​មាន​ពាក្យ​សម្ងាត់ ដើម្បី​រៀបចំ​ធ្វើបច្ចុប្បន្នភាព"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"តម្រូវឲ្យប្រើលំនាំ បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"តម្រូវឲ្យបញ្ចូលកូដ PIN បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"តម្រូវឲ្យបញ្ចូលពាក្យសម្ងាត់ បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index 785ca4338326..8173ca047fe3 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"ಸೇವೆ ಇಲ್ಲ."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ಇನ್‌ಪುಟ್‌‌ ವಿಧಾನ ಬದಲಿಸಿ"</string>
<string name="airplane_mode" msgid="2528005343938497866">"ಏರ್‌ಪ್ಲೇನ್ ಮೋಡ್"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"ಅಪ್‌ಡೇಟ್‌ಗಾಗಿ ಸಿದ್ಧಗೊಳಿಸಲು, ಪಿನ್‌‌ ಅಗತ್ಯವಿದೆ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"ಅಪ್‌ಡೇಟ್‌ಗಾಗಿ ಸಿದ್ಧಗೊಳಿಸಲು, ಪ್ಯಾಟರ್ನ್ ಅಗತ್ಯವಿದೆ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"ಅಪ್‌ಡೇಟ್‌ಗಾಗಿ ಸಿದ್ಧಗೊಳಿಸಲು, ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ಸಾಧನ ಮರುಪ್ರಾರಂಭಗೊಂಡ ನಂತರ ಪ್ಯಾಟರ್ನ್ ಅಗತ್ಯವಿರುತ್ತದೆ"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ಸಾಧನ ಮರುಪ್ರಾರಂಭಗೊಂಡ ನಂತರ ಪಿನ್ ಅಗತ್ಯವಿರುತ್ತದೆ"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ಸಾಧನ ಮರುಪ್ರಾರಂಭಗೊಂಡ ನಂತರ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿರುತ್ತದೆ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index 6ae5935fea1a..06074b2726c3 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"서비스 불가"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"입력 방법 전환"</string>
<string name="airplane_mode" msgid="2528005343938497866">"비행기 모드"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"업데이트를 준비하려면 PIN이 필요합니다."</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"업데이트를 준비하려면 패턴이 필요합니다."</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"업데이트를 준비하려면 비밀번호가 필요합니다."</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"기기가 다시 시작되면 패턴이 필요합니다."</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"기기가 다시 시작되면 PIN이 필요합니다."</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"기기가 다시 시작되면 비밀번호가 필요합니다."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 9675cc9d39b2..022726e43e98 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Байланыш жок."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Киргизүү ыкмасын өзгөртүү"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Учак режими"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Жаңыртууга даярдоо үчүн PIN код талап кылынат"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Жаңыртууга даярдоо үчүн графикалык ачкыч талап кылынат"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Жаңыртууга даярдоо үчүн сырсөз талап кылынат"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Түзмөк кайра күйгүзүлгөндөн кийин графикалык ачкычты тартуу талап кылынат"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Түзмөк кайра күйгүзүлгөндөн кийин PIN-кодду киргизүү талап кылынат"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Түзмөк кайра күйгүзүлгөндөн кийин сырсөздү киргизүү талап кылынат"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index ebaffb13d5b4..25e36c1b3115 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"ບໍ່ມີບໍລິການ"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ສະລັບຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
<string name="airplane_mode" msgid="2528005343938497866">"ໂໝດໃນຍົນ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"ຕ້ອງໃຊ້ PIN ເພື່ອກະກຽມອັບເດດ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"ຕ້ອງໃຊ້ຮູບແບບເພື່ອກະກຽມອັບເດດ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"ຕ້ອງໃຊ້ລະຫັດຜ່ານເພື່ອກະກຽມອັບເດດ"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ຈຳເປັນຕ້ອງມີແບບຮູບປົດລັອກຫຼັງຈາກອຸປະກອນເລີ່ມລະບົບໃໝ່"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ຈຳເປັນຕ້ອງມີ PIN ຫຼັງຈາກອຸປະກອນເລີ່ມລະບົບໃໝ່"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ຈຳເປັນຕ້ອງມີລະຫັດຜ່ານຫຼັງຈາກອຸປະກອນເລີ່ມລະບົບໃໝ່"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index 4d598f6bfb6d..158efe2feabb 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Nėra paslaugos."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Perjungti įvesties metodą"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Lėktuvo režimas"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Kad būtų pasiruošta atnaujinti, reikia įvesti PIN kodą"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Kad būtų pasiruošta atnaujinti, reikia įvesti atrakinimo piešinį"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Kad būtų pasiruošta atnaujinti, reikia įvesti slaptažodį"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Iš naujo paleidus įrenginį būtinas atrakinimo piešinys"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Iš naujo paleidus įrenginį būtinas PIN kodas"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Iš naujo paleidus įrenginį būtinas slaptažodis"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index fad67d536e58..c4a4e7f45b38 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -104,6 +104,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Nav pakalpojuma."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Pārslēgt ievades metodi"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Lidojuma režīms"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Lai sagatavotos atjauninājumam, nepieciešams PIN."</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Lai sagatavotos atjauninājumam, nepieciešama kombinācija."</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Lai sagatavotos atjauninājumam, nepieciešama parole."</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pēc ierīces restartēšanas ir jāievada atbloķēšanas kombinācija."</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Pēc ierīces restartēšanas ir jāievada PIN kods."</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Pēc ierīces restartēšanas ir jāievada parole."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index 1397f467e116..de4a83b97021 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Нема услуга."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Префрли метод за внесување"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Авионски режим"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Потребен е PIN за да се подготви за ажурирање"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Потребна е шема за да се подготви за ажурирање"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Потребна е лозинка за да се подготви за ажурирање"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Потребна е шема по рестартирање на уредот"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Потребен е PIN-код по рестартирање на уредот"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Потребна е лозинка по рестартирање на уредот"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index f82f822ca26c..da26ba788932 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"സേവനമില്ല"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ഇൻപുട്ട് രീതി മാറുക"</string>
<string name="airplane_mode" msgid="2528005343938497866">"ഫ്ലൈറ്റ് മോഡ്"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"അപ്‌ഡേറ്റിനായി തയ്യാറെടുക്കാൻ പിൻ ആവശ്യമാണ്"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"അപ്‌ഡേറ്റിനായി തയ്യാറെടുക്കാൻ പാറ്റേൺ ആവശ്യമാണ്"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"അപ്‌ഡേറ്റിനായി തയ്യാറെടുക്കാൻ പാസ്‌വേഡ് ആവശ്യമാണ്"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ഉപകരണം റീസ്റ്റാർട്ടായശേഷം ‌പാറ്റേൺ വരയ്‌ക്കേണ്ടതുണ്ട്"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ഉപകരണം റീസ്റ്റാർട്ടായശേഷം ‌പിൻ നൽകേണ്ടതുണ്ട്"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ഉപകരണം റീസ്റ്റാർട്ടായശേഷം ‌പാസ്‌വേഡ് നൽകേണ്ടതുണ്ട്"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 462017af1922..fb032f15df7f 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Үйлчилгээ алга."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Оруулах аргыг сэлгэх"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Нислэгийн горим"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Шинэчлэхэд бэлтгэхийн тулд ПИН шаардлагатай"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Шинэчлэхэд бэлтгэхийн тулд хээ шаардлагатай"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Шинэчлэхэд бэлтгэхийн тулд нууц үг шаардлагатай"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Төхөөрөмжийг дахин эхлүүлсний дараа загвар оруулах шаардлагатай"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Төхөөрөмжийг дахин эхлүүлсний дараа ПИН оруулах шаардлагатай"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Төхөөрөмжийг дахин эхлүүлсний дараа нууц үг оруулах шаардлагатай"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index 0166791dc3ba..e79e5c5d9234 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"सेवा नाही."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"इनपुट पद्धत स्विच करा"</string>
<string name="airplane_mode" msgid="2528005343938497866">"विमान मोड"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"अपडेटसाठी तयार करण्याकरिता पिन आवश्यक आहे"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"अपडेटसाठी तयार करण्याकरिता पॅटर्न आवश्यक आहे"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"अपडेटसाठी तयार करण्याकरिता पासवर्ड आवश्यक आहे"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"डिव्हाइस रीस्टार्ट झाल्यावर पॅटर्न आवश्यक आहे"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"डिव्हाइस रीस्टार्ट झाल्यावर पिन आवश्यक आहे"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"डिव्हाइस रीस्टार्ट झाल्यावर पासवर्ड आवश्यक आहे"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index 67500866f3d4..5bc5df4d7c26 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Tiada perkhidmatan."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Tukar kaedah masukan"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Mod Pesawat"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN diperlukan untuk menyediakan kemas kini"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Corak diperlukan untuk menyediakan kemas kini"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Kata laluan diperlukan untuk menyediakan kemas kini"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Corak diperlukan setelah peranti dimulakan semula"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN diperlukan setelah peranti dimulakan semula"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Kata laluan diperlukan setelah peranti dimulakan semula"</string>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index 3b32f06e19cd..43732d8ff260 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"ဝန်ဆောင်မှု မရှိပါ။"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"စာရိုက်စနစ်ပြောင်းရန်"</string>
<string name="airplane_mode" msgid="2528005343938497866">"လေယာဉ်ပျံမုဒ်"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"အပ်ဒိတ်အတွက် ပြင်ဆင်ရန် ပင်နံပါတ် လိုပါသည်"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"အပ်ဒိတ်အတွက် ပြင်ဆင်ရန် ပုံစံလိုပါသည်"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"အပ်ဒိတ်အတွက် ပြင်ဆင်ရန် စကားဝှက် လိုပါသည်"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"စက်ပစ္စည်းကို ပိတ်ပြီးပြန်ဖွင့်လိုက်သည့်အခါတွင် ပုံစံ လိုအပ်ပါသည်"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"စက်ပစ္စည်းကို ပိတ်ပြီးပြန်ဖွင့်လိုက်သည့်အခါတွင် ပင်နံပါတ် လိုအပ်ပါသည်"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"စက်ပစ္စည်းကို ပိတ်ပြီးပြန်ဖွင့်လိုက်သည့်အခါတွင် စကားဝှက် လိုအပ်ပါသည်"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index ebd8f2922ba2..6dd3b2ad6e72 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ingen tilkobling."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Bytt inndatametode"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Flymodus"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN-koden kreves for å klargjøre for oppdateringen"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Mønsteret kreves for å klargjøre for oppdateringen"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Passordet kreves for å klargjøre for oppdateringen"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Du må tegne mønsteret etter at enheten har startet på nytt"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Du må skrive inn PIN-koden etter at enheten har startet på nytt"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Du må skrive inn passordet etter at enheten har startet på nytt"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 0cec32e9a90c..37b2a60ba2de 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"सेवा उपलब्ध छैन।"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"इनपुट विधिलाई स्विच गर्नुहोस्"</string>
<string name="airplane_mode" msgid="2528005343938497866">"हवाइजहाज मोड"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"अद्यावधिक गर्ने कार्यका लागि तयार पार्न PIN चाहिन्छ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"अद्यावधिक गर्ने कार्यका लागि तयार पार्न प्याटर्न चाहिन्छ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"अद्यावधिक गर्ने कार्यका लागि तयार पार्न पासवर्ड चाहिन्छ"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"यन्त्र पुनः सुरु भएपछि ढाँचा आवश्यक पर्दछ"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"यन्त्र पुनः सुरु भएपछि PIN आवश्यक पर्दछ"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"यन्त्र पुनः सुरु भएपछि पासवर्ड आवश्यक पर्दछ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index aa783e84b892..f3c35a405bd6 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Geen service."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Invoermethode wijzigen"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Vliegtuigmodus"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Pincode vereist voor voorbereiding op update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Patroon vereist voor voorbereiding op update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Wachtwoord vereist voor voorbereiding op update"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Patroon vereist nadat het apparaat opnieuw is opgestart"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Pincode vereist nadat het apparaat opnieuw is opgestart"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Wachtwoord vereist nadat het apparaat opnieuw is opgestart"</string>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index 8bbdcf1e9eb6..e92dc42680e1 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"କୌଣସି ସେବା ନାହିଁ।"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ଇନପୁଟ୍‌ ପଦ୍ଧତି ବଦଳାନ୍ତୁ"</string>
<string name="airplane_mode" msgid="2528005343938497866">"ଏରୋପ୍ଲେନ୍‍ ମୋଡ୍"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"ଅପଡେଟ୍ ପାଇଁ ପ୍ରସ୍ତୁତ ହେବାକୁ PIN ଆବଶ୍ୟକ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"ଅପଡେଟ୍ ପାଇଁ ପ୍ରସ୍ତୁତ ହେବାକୁ ପାଟର୍ନ ଆବଶ୍ୟକ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"ଅପଡେଟ୍ ପାଇଁ ପ୍ରସ୍ତୁତ ହେବାକୁ ପାସୱାର୍ଡ ଆବଶ୍ୟକ"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ଡିଭାଇସ୍‍ ରିଷ୍ଟାର୍ଟ ହେବା ପରେ ପାଟର୍ନ ଆବଶ୍ୟକ ଅଟେ"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ଡିଭାଇସ୍‍ ରିଷ୍ଟାର୍ଟ ହେବାପରେ ପାସ୍‌ୱର୍ଡ ଆବଶ୍ୟକ"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ଡିଭାଇସ୍‍ ରିଷ୍ଟାର୍ଟ ହେବା ପରେ ପାସୱର୍ଡ ଆବଶ୍ୟକ ଅଟେ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 78e066526840..5c83ab8a354c 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"ਕੋਈ ਸੇਵਾ ਨਹੀਂ।"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ਇਨਪੁੱਟ ਵਿਧੀ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="airplane_mode" msgid="2528005343938497866">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"ਅੱਪਡੇਟ ਨੂੰ ਤਿਆਰ ਕਰਨ ਲਈ ਪਿੰਨ ਲੋੜੀਂਦਾ ਹੈ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"ਅੱਪਡੇਟ ਨੂੰ ਤਿਆਰ ਕਰਨ ਲਈ ਪੈਟਰਨ ਲੋੜੀਂਦਾ ਹੈ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"ਅੱਪਡੇਟ ਨੂੰ ਤਿਆਰ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਲੋੜੀਂਦਾ ਹੈ"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ਡੀਵਾਈਸ ਦੇ ਮੁੜ-ਚਾਲੂ ਹੋਣ \'ਤੇ ਪੈਟਰਨ ਦੀ ਲੋੜ ਹੈ"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ਡੀਵਾਈਸ ਦੇ ਮੁੜ-ਚਾਲੂ ਹੋਣ \'ਤੇ ਪਿੰਨ ਦੀ ਲੋੜ ਹੈ"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ਡੀਵਾਈਸ ਦੇ ਮੁੜ-ਚਾਲੂ ਹੋਣ \'ਤੇ ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 9b6f857456d6..34633d30086d 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Brak usługi."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Przełączanie metody wprowadzania"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Tryb samolotowy"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Aby przygotować się do aktualizacji, wymagany jest kod PIN"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Aby przygotować się do aktualizacji, wymagany jest wzór"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Aby przygotować się do aktualizacji, wymagane jest hasło"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Po ponownym uruchomieniu urządzenia wymagany jest wzór"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Po ponownym uruchomieniu urządzenia wymagany jest kod PIN"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Po ponownym uruchomieniu urządzenia wymagane jest hasło"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index cc0c044c445a..a770297cfcd6 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Sem serviço."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alterar o método de entrada"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Modo avião"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Insira o PIN para se preparar para a atualização"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Insira o padrão para se preparar para a atualização"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Insira a senha para se preparar para a atualização"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"O padrão é exigido após a reinicialização do dispositivo"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"O PIN é exigido após a reinicialização do dispositivo"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"A senha é exigida após a reinicialização do dispositivo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index 5af8bc09a05b..09cfcf1da02f 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Sem serviço."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alternar o método de introdução"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Modo de avião"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"É necessário introduzir o PIN para a preparação para a atualização."</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"É necessário introduzir o padrão para a preparação para a atualização."</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"É necessário introduzir a palavra-passe para a preparação para a atualização."</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"É necessário um padrão após reiniciar o dispositivo"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"É necessário um PIN após reiniciar o dispositivo"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"É necessária uma palavra-passe após reiniciar o dispositivo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index cc0c044c445a..a770297cfcd6 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Sem serviço."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alterar o método de entrada"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Modo avião"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Insira o PIN para se preparar para a atualização"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Insira o padrão para se preparar para a atualização"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Insira a senha para se preparar para a atualização"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"O padrão é exigido após a reinicialização do dispositivo"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"O PIN é exigido após a reinicialização do dispositivo"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"A senha é exigida após a reinicialização do dispositivo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 8122241e6613..7df2db6f03f1 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -104,6 +104,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Fără serviciu."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Comutați metoda de introducere"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Mod Avion"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Pentru a vă pregăti pentru actualizare este necesar codul PIN"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Pentru a vă pregăti pentru actualizare este necesar modelul"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Pentru a vă pregăti pentru actualizare este necesară parola"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Modelul este necesar după repornirea dispozitivului"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Codul PIN este necesar după repornirea dispozitivului"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Parola este necesară după repornirea dispozitivului"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index b80b479ca29a..ccd3c968cd51 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Нет сигнала."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Сменить способ ввода"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Режим полета"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Для подготовки к обновлению необходимо ввести PIN-код."</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Для подготовки к обновлению необходимо ввести графический ключ."</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Для подготовки к обновлению необходимо ввести пароль."</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"После перезагрузки устройства необходимо ввести графический ключ"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"После перезагрузки устройства необходимо ввести PIN-код"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"После перезагрузки устройства необходимо ввести пароль"</string>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index 1cd876f15d47..3dfc282ccae5 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"සේවාව නැත."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ආදාන ක්‍රමය මාරු කිරීම"</string>
<string name="airplane_mode" msgid="2528005343938497866">"ගුවන් යානා ප්‍රකාරය"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"යාවත්කාලීනය සඳහා සුදානම් කිරීමට PIN අවශ්‍යය"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"යාවත්කාලීනය සඳහා සුදානම් කිරීමට රටාව අවශ්‍යය"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"යාවත්කාලීනය සඳහා සුදානම් කිරීමට මුරපදය අවශ්‍යය"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"උපාංගය නැවත ආරම්භ වූ පසු රටාව අවශ්‍යයි"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"උපාංගය නැවත ආරම්භ වූ පසු PIN අංකය අවශ්‍යයි"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"උපාංගය නැවත ආරම්භ වූ පසු මුරපදය අවශ්‍යයි"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index 801a7dbccf6d..8568e14fecc3 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Žiadny signál."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Prepnúť metódu vstupu"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Režim v lietadle"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Príprava na aktualizáciu vyžaduje zadanie kódu PIN"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Príprava na aktualizáciu vyžaduje zadanie vzoru"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Príprava na aktualizáciu vyžaduje zadanie hesla"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Po reštartovaní zariadenia musíte zadať bezpečnostný vzor"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Po reštartovaní zariadenia musíte zadať kód PIN"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Po reštartovaní zariadenia musíte zadať heslo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index a141ed7ffaa6..16dc4a859d4c 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ni storitve."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Preklop načina vnosa"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Način za letalo"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Za pripravo na posodobitev morate vnesti kodo PIN"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Za pripravo na posodobitev morate vnesti vzorec"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Za pripravo na posodobitev morate vnesti geslo"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Po vnovičnem zagonu naprave je treba vnesti vzorec"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Po vnovičnem zagonu naprave je treba vnesti kodo PIN"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Po vnovičnem zagonu naprave je treba vnesti geslo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 1d34e3f8e099..ec44b61956b9 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Nuk ka shërbim."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Ndërro metodën e hyrjes"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Modaliteti i aeroplanit"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Kërkohet kodi PIN për t\'u përgatitur për përditësimin"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Kërkohet motivi për t\'u përgatitur për përditësimin"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Kërkohet fjalëkalimi për t\'u përgatitur për përditësimin"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Kërkohet motivi pas rinisjes së pajisjes"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Kërkohet kodi PIN pas rinisjes së pajisjes"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Kërkohet fjalëkalimi pas rinisjes së pajisjes"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index f83df3f8925e..24a1125f9a7d 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -104,6 +104,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Мрежа није доступна."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Промени метод уноса"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Режим рада у авиону"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"PIN је обавезан ради припреме за ажурирање"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Шаблон је обавезан ради припреме за ажурирање"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Лозинка је обавезна ради припреме за ажурирање"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Треба да унесете шаблон када се уређај поново покрене"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Треба да унесете PIN када се уређај поново покрене"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Треба да унесете лозинку када се уређај поново покрене"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index a037bffa4da2..a37c4809ccdb 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ingen tjänst."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Byt inmatningsmetod"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Flygplansläge"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Pinkod krävs för att förbereda för uppdatering"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Grafiskt lösenord krävs för att förbereda för uppdatering"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Lösenord krävs för att förbereda för uppdatering"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Du måste ange grafiskt lösenord när du har startat om enheten"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Du måste ange pinkod när du har startat om enheten"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Du måste ange lösenord när du har startat om enheten"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index efa5ecfd44fd..c4a9a1445ceb 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Hakuna mtandao."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Kubadili mbinu ya kuingiza data"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Hali ya ndegeni"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Inahitaji PIN ili kujiandaa kwa ajili ya sasisho"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Inahitaji mchoro ili kujiandaa kwa ajili ya sasisho"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Inahitaji nenosiri ili kujiandaa kwa ajili ya sasisho"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Unafaa kuchora mchoro baada ya kuwasha kifaa upya"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Unafaa kuweka PIN baada ya kuwasha kifaa upya"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Unafaa kuweka nenosiri baada ya kuwasha kifaa upya"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 96dbbb0314d6..a4dc0be3496f 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"சேவை இல்லை."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"உள்ளீட்டு முறையை மாற்றும்"</string>
<string name="airplane_mode" msgid="2528005343938497866">"விமானப் பயன்முறை"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"புதுப்பிப்பிற்குத் தயார்செய்ய பின் தேவை"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"புதுப்பிப்பிற்குத் தயார்செய்ய பேட்டர்ன் தேவை"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"புதுப்பிப்பிற்குத் தயார்செய்ய கடவுச்சொல் தேவை"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"சாதனத்தை மீண்டும் தொடங்கியதும், பேட்டர்னை வரைய வேண்டும்"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"சாதனத்தை மீண்டும் தொடங்கியதும், பின்னை உள்ளிட வேண்டும்"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"சாதனத்தை மீண்டும் தொடங்கியதும், கடவுச்சொல்லை உள்ளிட வேண்டும்"</string>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 74386bc7a487..3e27ce8ba702 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"సేవ లేదు."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ఇన్‌పుట్ పద్ధతిని మార్చు"</string>
<string name="airplane_mode" msgid="2528005343938497866">"విమానం మోడ్"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"అప్‌డేట్‌కు సిద్ధం చేయడానికి పిన్ అవసరం"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"అప్‌డేట్‌కు సిద్ధం చేయడానికి ఆకృతి అవసరం"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"అప్‌డేట్‌కు సిద్ధం చేయడానికి పాస్‌వర్డ్ అవసరం"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"పరికరాన్ని పునఃప్రారంభించిన తర్వాత నమూనాను గీయాలి"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"డివైజ్‌ను పునఃప్రారంభించిన తర్వాత పిన్ నమోదు చేయాలి"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"పరికరాన్ని పునఃప్రారంభించిన తర్వాత పాస్‌వర్డ్‌ను నమోదు చేయాలి"</string>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index aa9e693db0fa..8f94c636d01f 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"ไม่มีบริการ"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"สลับวิธีการป้อนข้อมูล"</string>
<string name="airplane_mode" msgid="2528005343938497866">"โหมดบนเครื่องบิน"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"ต้องใช้ PIN เพื่อเตรียมรับการอัปเดต"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"ต้องใช้รูปแบบเพื่อเตรียมรับการอัปเดต"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"ต้องใช้รหัสผ่านเพื่อเตรียมรับการอัปเดต"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ต้องวาดรูปแบบหลังจากอุปกรณ์รีสตาร์ท"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ต้องระบุ PIN หลังจากอุปกรณ์รีสตาร์ท"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ต้องป้อนรหัสผ่านหลังจากอุปกรณ์รีสตาร์ท"</string>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index 7b7e17dc8dcb..bd87b20a2ccb 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Walang serbisyo."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Magpalit ng pamamaraan ng pag-input"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Airplane mode"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Kinakailangan ang PIN para makapaghanda sa pag-update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Kinakailangan ang pattern para makapaghanda sa pag-update"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Kinakailangan ang password para makapaghanda sa pag-update"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Kailangan ng pattern pagkatapos mag-restart ng device"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Kailangan ng PIN pagkatapos mag-restart ng device"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Kailangan ng password pagkatapos mag-restart ng device"</string>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index 8c0caead0bdb..cf37451a9ed8 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Hizmet yok."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Giriş yöntemini değiştir"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Uçak modu"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Güncellemenin hazırlanması için PIN gerekli"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Güncellemenin hazırlanması için desen gerekli"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Güncellemenin hazırlanması için şifre gerekli"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Cihaz yeniden başladıktan sonra desen gerekir"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Cihaz yeniden başladıktan sonra PIN gerekir"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Cihaz yeniden başladıktan sonra şifre gerekir"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index 6e5ce0f142dc..0ccd012c5221 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -107,6 +107,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Зв’язку немає."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Змінити метод введення"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Режим польоту"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Щоб підготуватися до оновлення, введіть PIN-код"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Щоб підготуватися до оновлення, введіть ключ"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Щоб підготуватися до оновлення, введіть пароль"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Після перезавантаження пристрою потрібно ввести ключ"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Після перезавантаження пристрою потрібно ввести PIN-код"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Після перезавантаження пристрою потрібно ввести пароль"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 7b946aaf40da..981bc03387b5 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"کوئی سروس نہیں ہے۔"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"اندراج کا طریقہ سوئچ کریں"</string>
<string name="airplane_mode" msgid="2528005343938497866">"ہوائی جہاز وضع"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"‏اپ ڈیٹ تیار کرنے کے لیے PIN درکار ہے"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"اپ ڈیٹ تیار کرنے کے لیے پیٹرن درکار ہے"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"اپ ڈیٹ تیار کرنے کے لیے پاس ورڈ درکار ہے"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"آلہ دوبارہ چالو ہونے کے بعد پیٹرن درکار ہوتا ہے"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"‏آلہ دوبارہ چالو ہونے کے بعد PIN درکار ہوتا ہے"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"آلہ دوبارہ چالو ہونے کے بعد پاسورڈ درکار ہوتا ہے"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index a6c2aa055c0b..1905e64ea754 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Aloqa yo‘q."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Matn kiritish usulini almashtirish"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Parvoz rejimi"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Yangilashga tayyorlash uchun PIN kod talab etiladi"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Yangilashga tayyorlash uchun grafik kalit talab etiladi"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Yangilashga tayyorlash uchun parol talab etiladi"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Qurilma o‘chirib yoqilgandan keyin grafik kalit talab qilinadi"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Qurilma o‘chirib yoqilgandan keyin PIN kod talab qilinadi"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Qurilma o‘chirib yoqilgandan keyin parol talab qilinadi"</string>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 31737fca5e4d..cfb156424f35 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Không có dịch vụ."</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Chuyển phương thức nhập"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Chế độ trên máy bay"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Cần nhập mã PIN để chuẩn bị cập nhật"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Cần nhập hình mở khóa để chuẩn bị cập nhật"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Cần nhập mật khẩu để chuẩn bị cập nhật"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Yêu cầu hình mở khóa sau khi thiết bị khởi động lại"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Yêu cầu mã PIN sau khi thiết bị khởi động lại"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Yêu cầu mật khẩu sau khi thiết bị khởi động lại"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index b4bff5fab6d6..be162b0b5790 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"无服务。"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"切换输入法"</string>
<string name="airplane_mode" msgid="2528005343938497866">"飞行模式"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"需要输入 PIN 码才能让设备做好更新准备"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"需要绘制解锁图案才能让设备做好更新准备"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"需要输入密码才能让设备做好更新准备"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"重启设备后需要绘制解锁图案"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"重启设备后需要输入 PIN 码"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"重启设备后需要输入密码"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index b3d387706fa5..33e5b44ac31e 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"沒有服務。"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"轉換輸入方法"</string>
<string name="airplane_mode" msgid="2528005343938497866">"飛行模式"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"必須提供 PIN 碼,才能準備進行更新"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"必須畫出上鎖圖案,才能準備進行更新"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"必須輸入密碼,才能準備進行更新"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"裝置重新啟動後,必須畫出上鎖圖案才能使用"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"裝置重新啟動後,必須輸入 PIN 碼才能使用"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"裝置重新啟動後,必須輸入密碼才能使用"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index 03dec4852771..763233cc2e15 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"沒有服務。"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"切換輸入法"</string>
<string name="airplane_mode" msgid="2528005343938497866">"飛航模式"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"請輸入 PIN 碼,以便為更新作業進行準備"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"請畫出解鎖圖案,以便為更新作業進行準備"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"請輸入密碼,以便為更新作業進行準備"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"裝置重新啟動後需要畫出解鎖圖案"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"裝置重新啟動後需要輸入 PIN 碼"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"裝置重新啟動後需要輸入密碼"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 5ab567f706c3..397c868e6547 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -101,6 +101,9 @@
<string name="keyguard_carrier_default" msgid="6359808469637388586">"Ayikho isevisi"</string>
<string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Shintsha indlela yokufaka"</string>
<string name="airplane_mode" msgid="2528005343938497866">"Imodi yendiza"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Iphinikhodi iyadingeka ukuze kulungiselelwe isibuyekezo"</string>
+ <string name="kg_prompt_reason_prepare_for_update_pattern" msgid="4873394344883271519">"Iphethini iyadingeka ukuze kulungiselelwe isibuyekezo"</string>
+ <string name="kg_prompt_reason_prepare_for_update_password" msgid="5625446803865598337">"Iphasiwedi iyadingeka ukuze kulungiselelwe isibuyekezo"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Iphethini iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Iphinikhodi iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Iphasiwedi iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml
new file mode 100644
index 000000000000..dc070cbaae26
--- /dev/null
+++ b/packages/SystemUI/res/layout/super_notification_shade.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<!-- This is the notification shade window. -->
+<com.android.systemui.statusbar.phone.NotificationShadeWindowView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:sysui="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <com.android.systemui.statusbar.BackDropView
+ android:id="@+id/backdrop"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ sysui:ignoreRightInset="true"
+ >
+ <ImageView android:id="@+id/backdrop_back"
+ android:layout_width="match_parent"
+ android:scaleType="centerCrop"
+ android:layout_height="match_parent" />
+ <ImageView android:id="@+id/backdrop_front"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"
+ android:visibility="invisible" />
+ </com.android.systemui.statusbar.BackDropView>
+
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_for_bubble"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ sysui:ignoreRightInset="true"
+ />
+
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_behind"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ sysui:ignoreRightInset="true"
+ />
+
+ <include layout="@layout/status_bar_expanded"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="invisible" />
+
+ <include layout="@layout/brightness_mirror" />
+
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_in_front"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ sysui:ignoreRightInset="true"
+ />
+
+ <LinearLayout
+ android:id="@+id/lock_icon_container"
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/status_bar_height"
+ android:layout_gravity="top|center_horizontal">
+ <com.android.systemui.statusbar.phone.LockIcon
+ android:id="@+id/lock_icon"
+ android:layout_width="@dimen/keyguard_lock_width"
+ android:layout_height="@dimen/keyguard_lock_height"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="@dimen/keyguard_lock_padding"
+ android:contentDescription="@string/accessibility_unlock_button"
+ android:src="@*android:drawable/ic_lock"
+ android:scaleType="center" />
+ <com.android.keyguard.KeyguardMessageArea
+ android:id="@+id/keyguard_message_area"
+ style="@style/Keyguard.TextView"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/keyguard_lock_padding"
+ android:gravity="center"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:focusable="true" />
+ </LinearLayout>
+</com.android.systemui.statusbar.phone.NotificationShadeWindowView>
diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml
index 9716a00a7f72..8fee2cf9597e 100644
--- a/packages/SystemUI/res/layout/super_status_bar.xml
+++ b/packages/SystemUI/res/layout/super_status_bar.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
-** Copyright 2012, The Android Open Source Project
+** Copyright 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.
@@ -17,7 +17,7 @@
*/
-->
-<!-- This is the combined status bar / notification panel window. -->
+<!-- This is the status bar window. -->
<com.android.systemui.statusbar.phone.StatusBarWindowView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:sysui="http://schemas.android.com/apk/res-auto"
@@ -25,85 +25,8 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true">
- <com.android.systemui.statusbar.BackDropView
- android:id="@+id/backdrop"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone"
- sysui:ignoreRightInset="true"
- >
- <ImageView android:id="@+id/backdrop_back"
- android:layout_width="match_parent"
- android:scaleType="centerCrop"
- android:layout_height="match_parent" />
- <ImageView android:id="@+id/backdrop_front"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="centerCrop"
- android:visibility="invisible" />
- </com.android.systemui.statusbar.BackDropView>
-
- <com.android.systemui.statusbar.ScrimView
- android:id="@+id/scrim_for_bubble"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:importantForAccessibility="no"
- sysui:ignoreRightInset="true"
- />
-
<FrameLayout
android:id="@+id/status_bar_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
-
- <com.android.systemui.statusbar.ScrimView
- android:id="@+id/scrim_behind"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:importantForAccessibility="no"
- sysui:ignoreRightInset="true"
- />
-
- <include layout="@layout/status_bar_expanded"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="invisible" />
-
- <include layout="@layout/brightness_mirror" />
-
- <com.android.systemui.statusbar.ScrimView
- android:id="@+id/scrim_in_front"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:importantForAccessibility="no"
- sysui:ignoreRightInset="true"
- />
-
- <LinearLayout
- android:id="@+id/lock_icon_container"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/status_bar_height"
- android:layout_gravity="top|center_horizontal">
- <com.android.systemui.statusbar.phone.LockIcon
- android:id="@+id/lock_icon"
- android:layout_width="@dimen/keyguard_lock_width"
- android:layout_height="@dimen/keyguard_lock_height"
- android:layout_gravity="center_horizontal"
- android:layout_marginTop="@dimen/keyguard_lock_padding"
- android:contentDescription="@string/accessibility_unlock_button"
- android:src="@*android:drawable/ic_lock"
- android:scaleType="center" />
- <com.android.keyguard.KeyguardMessageArea
- android:id="@+id/keyguard_message_area"
- style="@style/Keyguard.TextView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/keyguard_lock_padding"
- android:gravity="center"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:focusable="true" />
- </LinearLayout>
</com.android.systemui.statusbar.phone.StatusBarWindowView>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index ea7b9bb9b664..4de854314b1a 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is gedeaktiveer"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is geaktiveer"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Swiep op om programme te wissel"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Sleep regs om programme vinnig te wissel"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Wissel oorsig"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Vee alles uit"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Bestuur"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Stil kennisgewings"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekke"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vee alle stil kennisgewings uit"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kennisgewings onderbreek deur Moenie Steur Nie"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Begin nou"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Pasmaak"</string>
<string name="notification_done" msgid="6215117625922713976">"Klaar"</string>
<string name="inline_undo" msgid="9026953267645116526">"Ontdoen"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kennisgewingkontroles"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"kennisgewing-sluimeropsies"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 9412f0f7ee3c..87603ac2051a 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"ኤንኤፍሲ"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"ኤንኤፍሲ ተሰናክሏል"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"ኤንኤፍሲ ነቅቷል"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"የማያ ገጽ ቀረጻ"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ጀምር"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"አቁም"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"መተግበሪያዎችን ለመቀየር ወደ ላይ ያንሸራትቱ"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"መተግበሪያዎችን በፍጥነት ለመቀየር ወደ ቀኝ ይጎትቱ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"አጠቃላይ እይታን ቀያይር"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"ሁሉንም አጽዳ"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"ያቀናብሩ"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"ጸጥ ያሉ ማሳወቂያዎች"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"ውይይቶች"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ሁሉንም ጸጥ ያሉ ማሳወቂያዎችን ያጽዱ"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ማሳወቂያዎች በአትረብሽ ባሉበት ቆመዋል"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"አሁን ጀምር"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"አብጅ"</string>
<string name="notification_done" msgid="6215117625922713976">"ተከናውኗል"</string>
<string name="inline_undo" msgid="9026953267645116526">"ቀልብስ"</string>
+ <string name="demote" msgid="6225813324237153980">"ይህን ማሳወቂያ ውይይት እንዳልሆነ ምልክት ያድርጉበት"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"ተወዳጅ"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"ተወዳጅ አታድርግ"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"ድምጽ ዝጋ"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"ድምጽ ክፈት"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"እንደ አረፋ አሳይ"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"አረፋዎችን አጥፋ"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"ወደ መነሻ ማያ ገጽ አክል"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"የማሳወቂያ መቆጣጠሪያዎች"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"የማሳወቂያ ማሸለቢያ አማራጮች"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index f67526595084..c764004fddfe 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -109,7 +109,7 @@
<string name="accessibility_camera_button" msgid="2938898391716647247">"الكاميرا"</string>
<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>
+ <string name="accessibility_unlock_button" msgid="122785427241471085">"فتح القفل"</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>
@@ -140,7 +140,7 @@
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"جارٍ البحث عن وجهك…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"رمز الوجه"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"زر تكبير/تصغير للتوافق."</string>
- <string name="accessibility_compatibility_zoom_example" msgid="2617218726091234073">"استخدام التكبير/التصغير لتحويل شاشة صغيرة إلى شاشة أكبر"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="2617218726091234073">"استخدام التكبير أو التصغير لتحويل شاشة صغيرة إلى شاشة أكبر"</string>
<string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"تم توصيل البلوتوث."</string>
<string name="accessibility_bluetooth_disconnected" msgid="7195823280221275929">"تم فصل البلوتوث."</string>
<string name="accessibility_no_battery" msgid="3789287732041910804">"ليست هناك بطارية."</string>
@@ -399,6 +399,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"‏الاتصالات قصيرة المدى (NFC)"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"تم إيقاف الاتصال القريب المدى"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"تم تفعيل الاتصال القريب المدى"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"مرّر سريعًا لأعلى لتبديل التطبيقات"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"اسحب لليسار للتبديل السريع بين التطبيقات"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"تبديل \"النظرة العامة\""</string>
@@ -477,13 +483,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"إيقاف ميزة توفير شحن البطارية"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"سيتمكن تطبيق <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> من الوصول إلى كل المعلومات المرئية لك على الشاشة أو التي يتم تشغيلها على جهازك أثناء التسجيل أو الإرسال. ويشمل ذلك معلومات مثل كلمات المرور وتفاصيل الدفع والصور والرسائل والمقاطع الصوتية التي تشغِّلها."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"ستتمكن الخدمة التي تقدّم هذه الوظيفة من الوصول إلى كل المعلومات المرئية لك على الشاشة أو التي يتم تشغيلها على جهازك أثناء التسجيل أو الإرسال. ويشمل ذلك معلومات مثل كلمات المرور وتفاصيل الدفع والصور والرسائل والمقاطع الصوتية التي تشغِّلها."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"هل تريد بدء التسجيل أو الإرسال؟"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"هل تريد بدء التسجيل أو الإرسال باستخدام <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>؟"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"عدم الإظهار مرة أخرى"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"محو الكل"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"إدارة"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"الإشعارات الصامتة"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"المحادثات"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"محو جميع الإشعارات الصامتة"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"الرجاء عدم الإزعاج\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"البدء الآن"</string>
@@ -544,10 +550,10 @@
<string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"أنت متصل بـ <xliff:g id="APPLICATION">%1$s</xliff:g>، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب."</string>
<string name="monitoring_description_app_work" msgid="3713084153786663662">"يخضع الملف الشخصي للعمل لإدارة <xliff:g id="ORGANIZATION">%1$s</xliff:g>. تم ربط الملف الشخصي بـ <xliff:g id="APPLICATION">%2$s</xliff:g>، الذي يمكنه مراقبة أنشطة شبكتك، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nيمكنك الاتصال بالمشرف للحصول على مزيد من المعلومات."</string>
<string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"يخضع الملف الشخصي للعمل لإدارة <xliff:g id="ORGANIZATION">%1$s</xliff:g>. تم ربط هذا الملف الشخصي بـ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>، الذي يمكنه مراقبة أنشطة شبكتك، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nتم ربطك بـ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>، الذي يمكنه مراقبة أنشطة شبكتك الشخصية."</string>
- <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"‏إلغاء القفل باستمرار بواسطة TrustAgent"</string>
- <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"سيظل الجهاز مقفلاً إلى أن يتم إلغاء قفله يدويًا"</string>
+ <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"‏فتح القفل باستمرار بواسطة TrustAgent"</string>
+ <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"سيظل الجهاز مقفلاً إلى أن يتم فتح قفله يدويًا"</string>
<string name="hidden_notifications_title" msgid="1782412844777612795">"الحصول على الإشعارات بشكل أسرع"</string>
- <string name="hidden_notifications_text" msgid="5899627470450792578">"الاطّلاع عليها قبل إلغاء القفل"</string>
+ <string name="hidden_notifications_text" msgid="5899627470450792578">"الاطّلاع عليها قبل فتح القفل"</string>
<string name="hidden_notifications_cancel" msgid="4805370226181001278">"لا، شكرًا"</string>
<string name="hidden_notifications_setup" msgid="2064795578526982467">"إعداد"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -702,6 +708,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"تخصيص"</string>
<string name="notification_done" msgid="6215117625922713976">"تم"</string>
<string name="inline_undo" msgid="9026953267645116526">"تراجع"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"عناصر التحكم في الإشعارات"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"خيارات تأجيل الإشعارات"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index d8a7b26a4aff..2fc393c6ec68 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC নিষ্ক্ৰিয় হৈ আছে"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC সক্ষম হৈ আছে"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"আনটো এপ্ ব্য়ৱহাৰ কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"খৰতকীয়াকৈ আনটো এপ্ ব্য়ৱহাৰ কৰিবলৈ সোঁফালে টানক"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"অৱলোকন ট’গল কৰক"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"বেটাৰি সঞ্চয়কাৰী অফ কৰক"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>এ আপোনাৰ স্ক্ৰীনত দৃশ্যমান হোৱা অথবা ৰেকর্ডিং অথবা কাষ্টিংৰ সময়ত আপোনাৰ ডিভাইচত প্লে\' কৰা সকলো তথ্যলৈ এক্সেছ পাব। এইটোত পাছৱর্ড, পৰিশোধৰ সবিশেষ, ফট\', বার্তাসমূহ আৰু আপুনি প্লে\' কৰা অডিঅ\'ৰ দৰে তথ্য অন্তর্ভুক্ত হয়।"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"এই সুবিধাটো প্ৰদান কৰা সেৱাটোৱে আপোনাৰ স্ক্ৰীনত দৃশ্যমান হোৱা অথবা ৰেকর্ডিং অথবা কাষ্টিংৰ সময়ত আপোনাৰ ডিভাইচত প্লে\' কৰা সকলো তথ্যলৈ এক্সেছ পাব। এইটোত পাছৱর্ড, পৰিশোধৰ সবিশেষ, ফট\', বার্তাসমূহ আৰু আপুনি প্লে\' কৰা অডিঅ\'ৰ দৰে তথ্য অন্তর্ভুক্ত হয়।"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ৰেকর্ডিং অথবা কাষ্টিং আৰম্ভ কৰিবনে?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ৰ জৰিয়তে ৰেকর্ডিং অথবা কাষ্টিং আৰম্ভ কৰিবনে ?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"পুনৰাই নেদেখুৱাব"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"সকলো মচক"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"পৰিচালনা"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"নীৰৱ জাননীসমূহ"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"বাৰ্তালাপসমূহ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"সকলো নীৰৱ জাননী মচক"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"অসুবিধা নিদিব-ই জাননী পজ কৰিছে"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"এতিয়াই আৰম্ভ কৰক"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"নিজৰ উপযোগিতা অনুসৰি"</string>
<string name="notification_done" msgid="6215117625922713976">"সম্পন্ন হ’ল"</string>
<string name="inline_undo" msgid="9026953267645116526">"আনডু কৰক"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"জাননীৰ নিয়ন্ত্ৰণসমূহ"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"জাননীক স্নুজ কৰাৰ বিকল্পসমূহ"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 7511a7f0ee9a..de9c60520d84 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC deaktiv edilib"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC aktiv edilib"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Tətbiqi dəyişmək üçün yuxarı sürüşdürün"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Tətbiqləri cəld dəyişmək üçün sağa çəkin"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"İcmala Keçin"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Batareya Qənaətini deaktiv edin"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tətbiqinin yazma və ya yayım zamanı ekranda görünən və ya cihazdan oxudulan bütün məlumatlara girişi olacaq. Bura parollar, ödəniş detalları, fotolar, mesajlar və oxudulan audio kimi məlumatlar daxildir."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Bu funksiyanı təmin edən xidmətin yazma və ya yayım zamanı ekranda görünən və ya cihazdan oxudulan bütün məlumatlara girişi olacaq. Bura parollar, ödəniş detalları, fotolar, mesajlar və oxudulan audio kimi məlumatlar daxildir."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Yazma və ya yayımlama başladılsın?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ilə yazma və ya yayımlama başladılsın?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Daha göstərmə"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Hamısını silin"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"İdarə edin"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Səssiz bildirişlər"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Söhbətlər"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Səssiz bildirişlərin hamısını silin"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirişlər \"Narahat Etməyin\" rejimi tərəfindən dayandırıldı"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"İndi başlayın"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Fərdiləşdirin"</string>
<string name="notification_done" msgid="6215117625922713976">"Hazırdır"</string>
<string name="inline_undo" msgid="9026953267645116526">"Ləğv edin"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"bildiriş nəzarəti"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"bildiriş təxirə salma seçimləri"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 2b94d67eabf4..a895f35cca72 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -393,6 +393,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je omogućen"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Snimak ekrana"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Počnite"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zaustavite"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Prevucite nagore da biste menjali aplikacije"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Prevucite udesno da biste brzo promenili aplikacije"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Uključi/isključi pregled"</string>
@@ -474,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Obriši sve"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Nečujna obaveštenja"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzacije"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obrišite sva nečujna obaveštenja"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obaveštenja su pauzirana režimom Ne uznemiravaj"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Započni odmah"</string>
@@ -692,6 +696,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Prilagodi"</string>
<string name="notification_done" msgid="6215117625922713976">"Gotovo"</string>
<string name="inline_undo" msgid="9026953267645116526">"Opozovi"</string>
+ <string name="demote" msgid="6225813324237153980">"Označi da ovo obaveštenje nije konverzacija"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Označi kao omiljeno"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Ukloni iz omiljenih"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Isključi zvuk"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Uključi zvuk"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Prikaži kao oblačić"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Isključi oblačiće"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Dodaj na početni ekran"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kontrole obaveštenja"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opcije za odlaganje obaveštenja"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 35b0ddb00424..67aa8996c4ff 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -397,6 +397,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC адключаны"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC уключаны"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Правядзіце ўверх, каб пераключыць праграмы"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Каб хутка пераключыцца паміж праграмамі, перацягніце ўправа"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Уключыць/выключыць агляд"</string>
@@ -473,13 +479,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Адключыць рэжым эканоміі зараду"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Падчас запісу ці трансляцыі праграма \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" будзе мець доступ да ўсёй інфармацыі, адлюстраванай на экране вашай прылады, ці той, якая праз яе прайграецца. Гэта інфармацыя ўключае паролі, звесткі пра аплату, фота, паведамленні і аўдыя, якое вы прайграяце."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Падчас запісу ці трансляцыі служба, якая забяспечвае работу гэтай функцыі, будзе мець доступ да ўсёй інфармацыі, адлюстраванай на экране вашай прылады, ці той, якая праз яе прайграецца. Гэта інфармацыя ўключае паролі, звесткі пра аплату, фота, паведамленні і аўдыя, якое вы прайграяце."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Пачаць запіс або трансляцыю?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Пачаць запіс або трансляцыю з дапамогай праграмы \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\"?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Не паказваць зноў"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Ачысціць усё"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Кіраваць"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Апавяшчэнні без гуку"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Размовы"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Выдаліць усе апавяшчэнні без гуку"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Паказ апавяшчэнняў прыпынены ў рэжыме \"Не турбаваць\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Пачаць зараз"</string>
@@ -698,6 +704,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Наладзіць"</string>
<string name="notification_done" msgid="6215117625922713976">"Гатова"</string>
<string name="inline_undo" msgid="9026953267645116526">"Адрабіць"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"кіраванне апавяшчэннямі"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"параметры адкладвання апавяшчэнняў"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 26102fb26ba2..f83bf96e2b0d 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"КБП"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"КБП е деактивирана"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"КБП е активирана"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Записване на екрана"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Старт"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Стоп"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Прекарайте пръст нагоре, за да превключите между приложенията"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Плъзнете надясно за бързо превключване между приложенията"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Превключване на общия преглед"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Изчистване на всички"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Управление"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучни известия"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Изчистване на всички беззвучни известия"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известията са поставени на пауза от режима „Не безпокойте“"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Стартиране сега"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Персонализиране"</string>
<string name="notification_done" msgid="6215117625922713976">"Готово"</string>
<string name="inline_undo" msgid="9026953267645116526">"Отмяна"</string>
+ <string name="demote" msgid="6225813324237153980">"Отбелязване, че известието не е за разговор"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Означаване като любим"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Не е любим"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Спиране"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Пускане"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Показване като балонче"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Изключване на балончетата"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Добавяне към началния екран"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"контроли за известията"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"опции за отлагане на известията"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index e17905a06d14..10479b134c89 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC অক্ষম করা আছে"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC সক্ষম করা আছে"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"অন্য অ্যাপে যেতে উপরের দিকে সোয়াইপ করুন"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"একটি অ্যাপ ছেড়ে দ্রুত অন্য অ্যাপে যেতে ডান দিকে টেনে আনুন"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"\'এক নজরে\' বৈশিষ্ট্যটি চালু বা বন্ধ করুন"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ব্যাটারি সেভার বন্ধ করুন"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"রেকর্ড করা বা কাস্টিং করার সময় স্ক্রিনে দেখানো বা ডিভাইসে দেখানো সমস্ত তথ্যের অ্যাক্সেস <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-এর থাকবে। এর মধ্যে আপনার পাসওয়ার্ড, পেমেন্টের বিবরণ, ফটো, মেসেজ এবং যে অডিও আপনি চালান সেগুলি সম্পর্কিত তথ্য রয়েছে।"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"রেকর্ড করা বা কাস্টিং করার সময় আপনার স্ক্রিনে দেখানো বা ডিভাইসে চালানো হয়েছে এমন সমস্ত তথ্যের অ্যাক্সেস এই ফাংশন প্রদানকারী পরিষেবার কাছে থাকবে। এর মধ্যে আপনার পাসওয়ার্ড, পেমেন্টের বিবরণ, ফটো, মেসেজ এবং যে অডিও আপনি চালান সেগুলি সম্পর্কিত তথ্য রয়েছে।"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"রেকর্ড অথবা কাস্টিং শুরু করতে চান?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> দিয়ে রেকর্ড করা বা কাস্টিং শুরু করবেন?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"আর দেখাবেন না"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"সবকিছু সাফ করুন"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"পরিচালনা করুন"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"নীরব বিজ্ঞপ্তি"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"কথোপকথন"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"সব নীরব বিজ্ঞপ্তি মুছুন"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'বিরক্ত করবে না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"এখন শুরু করুন"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"কাস্টমাইজ করুন"</string>
<string name="notification_done" msgid="6215117625922713976">"সম্পন্ন"</string>
<string name="inline_undo" msgid="9026953267645116526">"আগের অবস্থায় ফিরে যান"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"বিজ্ঞপ্তির নিয়ন্ত্রণগুলি"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"বিজ্ঞপ্তি মনে করিয়ে দেওয়ার বিকল্পগুলি"</string>
@@ -886,7 +908,7 @@
<string name="notification_channel_general" msgid="4384774889645929705">"সাধারণ বার্তাগুলি"</string>
<string name="notification_channel_storage" msgid="2720725707628094977">"স্টোরেজ"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"হিন্ট"</string>
- <string name="instant_apps" msgid="8337185853050247304">"ঝটপট অ্যাপ"</string>
+ <string name="instant_apps" msgid="8337185853050247304">"ইনস্ট্যান্ট অ্যাপ"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> চলছে"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"অ্যাপটি ইনস্টল না করে চালু করা হয়েছে।"</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"অ্যাপটি ইনস্টল না করে চালু করা হয়েছে। আরও জানতে ট্যাপ করুন।"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 58510118feda..6c89d976731a 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -393,6 +393,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je omogućen"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Snimanje ekrana"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Započnite"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zaustavite"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Prevucite prema gore za promjenu aplikacije"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Prevucite udesno za brzu promjenu aplikacija"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Pregled uključivanja/isključivanja"</string>
@@ -474,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Očisti sve"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Nečujna obavještenja"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obriši sva nečujna obavještenja"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obavještenja su pauzirana načinom rada Ne ometaj"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Započni odmah"</string>
@@ -694,6 +698,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Prilagodi"</string>
<string name="notification_done" msgid="6215117625922713976">"Gotovo"</string>
<string name="inline_undo" msgid="9026953267645116526">"Opozovi"</string>
+ <string name="demote" msgid="6225813324237153980">"Označi da ovo obavještenje nije razgovor"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Omiljeno"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Ukloni iz omiljenog"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Isključi zvuk"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Uključi zvuk"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Prikaži kao oblačić"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Isključi oblačiće"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Dodaj na početni ekran"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kontrole obavještenja"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opcije za odgodu obavještenja"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 9fb7230c591c..f675e20e7dfd 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"L\'NFC està desactivada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"L\'NFC està activada"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravació de la pantalla"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Inicia"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Atura"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Llisca cap amunt per canviar d\'aplicació"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrossega el dit cap a la dreta per canviar ràpidament d\'aplicació"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activa o desactiva Aplicacions recents"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Esborra-ho tot"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gestiona"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificacions silencioses"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Converses"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Esborra totes les notificacions silencioses"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificacions pausades pel mode No molestis"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Comença ara"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalitza"</string>
<string name="notification_done" msgid="6215117625922713976">"Fet"</string>
<string name="inline_undo" msgid="9026953267645116526">"Desfés"</string>
+ <string name="demote" msgid="6225813324237153980">"Marca que la notificació no és una conversa"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Marca com a preferida"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Desmarca com a preferida"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Silencia"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Deixa de silenciar"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Mostra com a bombolla"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Desactiva les bombolles"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Afegeix a la pantalla d\'inici"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"controls de notificació"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opcions per posposar la notificació"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 30724f8e95de..354ccf44af39 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -395,6 +395,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je vypnuto"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je zapnuto"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Záznam obrazovky"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Spustit"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ukončit"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Přejetím nahoru přepnete aplikace"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Přetažením doprava rychle přepnete aplikace"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Přepnout přehled"</string>
@@ -477,6 +480,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Smazat vše"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Spravovat"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Tichá oznámení"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzace"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazat všechna tichá oznámení"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Oznámení jsou pozastavena režimem Nerušit"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Spustit"</string>
@@ -695,6 +699,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Upravit"</string>
<string name="notification_done" msgid="6215117625922713976">"Hotovo"</string>
<string name="inline_undo" msgid="9026953267645116526">"Zpět"</string>
+ <string name="demote" msgid="6225813324237153980">"Označit, že toto oznámení není součástí konverzace"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Přidat mezi oblíbené"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Odebrat z oblíbených"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Ignorovat"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Přestat ignorovat"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Zobrazit jako bublinu"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Vypnout bubliny"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Přidat na plochu"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"Nastavení oznámení"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"Možnosti odložení oznámení"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index e20a2761b768..04e83d4b62ea 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC er deaktiveret"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC er aktiveret"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Optag skærm"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Start"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stop"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Stryg opad for at skifte apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Træk til højre for hurtigt at skifte app"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Slå Oversigt til/fra"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Ryd alle"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Administrer"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Lydløse notifikationer"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ryd alle lydløse notifikationer"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikationer er sat på pause af Forstyr ikke"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start nu"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Tilpas"</string>
<string name="notification_done" msgid="6215117625922713976">"Udfør"</string>
<string name="inline_undo" msgid="9026953267645116526">"Fortryd"</string>
+ <string name="demote" msgid="6225813324237153980">"Markér denne notifikation som ikke en samtale"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Angiv som favorit"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Fjern som favorit"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Slå lyden fra"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Slå lyden til"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Vis som boble"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Slå bobler fra"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Føj til startskærm"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kontrolelementer til notifikationer"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"Indstillinger for udsættelse"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 7defdc1b8972..baf3e7c0006e 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -395,6 +395,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ist deaktiviert"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ist aktiviert"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Nach oben wischen, um Apps zu wechseln"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Zum schnellen Wechseln der Apps nach rechts ziehen"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Übersicht ein-/ausblenden"</string>
@@ -469,13 +475,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Energiesparmodus deaktivieren"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Die App \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" erhält Zugriff auf alle Informationen, die auf deinem Bildschirm sichtbar sind oder von deinem Gerät wiedergegeben werden, während du aufnimmst oder streamst. Dazu gehören beispielsweise Passwörter, Zahlungsdetails, Fotos, Nachrichten und Audioinhalte."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Der Anbieter dieser App erhält Zugriff auf alle Informationen, die auf deinem Bildschirm sichtbar sind oder von deinem Gerät wiedergegeben werden, während du aufnimmst oder streamst. Dazu gehören beispielsweise Passwörter, Zahlungsdetails, Fotos, Nachrichten und Audioinhalte."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Aufnahme oder Stream starten?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Aufnehmen oder Streamen mit der App \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" starten?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Nicht mehr anzeigen"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Alle löschen"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Verwalten"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Lautlose Benachrichtigungen"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Unterhaltungen"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle lautlosen Benachrichtigungen löschen"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Benachrichtigungen durch \"Bitte nicht stören\" pausiert"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Jetzt starten"</string>
@@ -694,6 +700,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Anpassen"</string>
<string name="notification_done" msgid="6215117625922713976">"Fertig"</string>
<string name="inline_undo" msgid="9026953267645116526">"Rückgängig machen"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> – <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"Benachrichtigungseinstellungen"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"Optionen für spätere Erinnerung bei Benachrichtigungen"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 14da101cc0c7..45ad30244812 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Το NFC είναι απενεργοποιημένο"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Το NFC είναι ενεργοποιημένο"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Εγγραφή οθόνης"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Έναρξη"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Διακοπή"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Σύρετε προς τα επάνω για εναλλαγή των εφαρμογών"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Σύρετε προς τα δεξιά για γρήγορη εναλλαγή εφαρμογών"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Εναλλαγή επισκόπησης"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Διαγραφή όλων"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Διαχείριση"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Ειδοποιήσεις σε σίγαση"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Συνομιλίες"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Διαγραφή όλων των ειδοποιήσεων σε σίγαση"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία \"Μην ενοχλείτε\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Έναρξη τώρα"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Προσαρμογή"</string>
<string name="notification_done" msgid="6215117625922713976">"Τέλος"</string>
<string name="inline_undo" msgid="9026953267645116526">"Αναίρεση"</string>
+ <string name="demote" msgid="6225813324237153980">"Επισήμανση αυτής της ειδοποίησης ως μη συνομιλίας"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Αγαπημένη"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Μη αγαπημένη"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Σίγαση"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Κατάργηση σίγασης"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Εμφάνιση ως φούσκας"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Απενεργοποίηση φουσκών"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Προσθήκη στην αρχική οθόνη"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"στοιχεία ελέγχου ειδοποιήσεων"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"επιλογές αναβολής ειδοποιήσεων"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 5f388300c05d..b6a5d1573acc 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Screen record"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Start"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stop"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Swipe up to switch apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Drag right to quickly switch apps"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Toggle Overview"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
@@ -516,7 +520,7 @@
<string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> uses <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> to manage your device."</string>
<string name="monitoring_description_do_body" msgid="7700878065625769970">"Your admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string>
- <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Find out more"</string>
+ <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Learn more"</string>
<string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Open VPN settings"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Customise"</string>
<string name="notification_done" msgid="6215117625922713976">"Done"</string>
<string name="inline_undo" msgid="9026953267645116526">"Undo"</string>
+ <string name="demote" msgid="6225813324237153980">"Mark this notification as not a conversation"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Favourite"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Unfavourite"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Mute"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Unmute"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Show as bubble"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Turn off bubbles"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Add to home screen"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"notification snooze options"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 1da1df3af65a..e194e69c9299 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Screen record"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Start"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stop"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Swipe up to switch apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Drag right to quickly switch apps"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Toggle Overview"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
@@ -516,7 +520,7 @@
<string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> uses <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> to manage your device."</string>
<string name="monitoring_description_do_body" msgid="7700878065625769970">"Your admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string>
- <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Find out more"</string>
+ <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Learn more"</string>
<string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Open VPN settings"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Customise"</string>
<string name="notification_done" msgid="6215117625922713976">"Done"</string>
<string name="inline_undo" msgid="9026953267645116526">"Undo"</string>
+ <string name="demote" msgid="6225813324237153980">"Mark this notification as not a conversation"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Favourite"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Unfavourite"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Mute"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Unmute"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Show as bubble"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Turn off bubbles"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Add to home screen"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"notification snooze options"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 5f388300c05d..b6a5d1573acc 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Screen record"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Start"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stop"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Swipe up to switch apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Drag right to quickly switch apps"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Toggle Overview"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
@@ -516,7 +520,7 @@
<string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> uses <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> to manage your device."</string>
<string name="monitoring_description_do_body" msgid="7700878065625769970">"Your admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string>
- <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Find out more"</string>
+ <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Learn more"</string>
<string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Open VPN settings"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Customise"</string>
<string name="notification_done" msgid="6215117625922713976">"Done"</string>
<string name="inline_undo" msgid="9026953267645116526">"Undo"</string>
+ <string name="demote" msgid="6225813324237153980">"Mark this notification as not a conversation"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Favourite"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Unfavourite"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Mute"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Unmute"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Show as bubble"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Turn off bubbles"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Add to home screen"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"notification snooze options"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 5f388300c05d..b6a5d1573acc 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Screen record"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Start"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stop"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Swipe up to switch apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Drag right to quickly switch apps"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Toggle Overview"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
@@ -516,7 +520,7 @@
<string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> uses <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> to manage your device."</string>
<string name="monitoring_description_do_body" msgid="7700878065625769970">"Your admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string>
- <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Find out more"</string>
+ <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Learn more"</string>
<string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Open VPN settings"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Customise"</string>
<string name="notification_done" msgid="6215117625922713976">"Done"</string>
<string name="inline_undo" msgid="9026953267645116526">"Undo"</string>
+ <string name="demote" msgid="6225813324237153980">"Mark this notification as not a conversation"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Favourite"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Unfavourite"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Mute"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Unmute"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Show as bubble"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Turn off bubbles"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Add to home screen"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"notification snooze options"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index fd3ff45d5070..e3a569a29cae 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎NFC‎‏‎‎‏‎"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎NFC is disabled‎‏‎‎‏‎"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎NFC is enabled‎‏‎‎‏‎"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎Screen Record‎‏‎‎‏‎"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎Start‎‏‎‎‏‎"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎Stop‎‏‎‎‏‎"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎Swipe up to switch apps‎‏‎‎‏‎"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎Drag right to quickly switch apps‎‏‎‎‏‎"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‎Toggle Overview‎‏‎‎‏‎"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎Clear all‎‏‎‎‏‎"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎Manage‎‏‎‎‏‎"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‎‏‎‏‎‎Silent notifications‎‏‎‎‏‎"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎Conversations‎‏‎‎‏‎"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎Clear all silent notifications‎‏‎‎‏‎"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‎‎Notifications paused by Do Not Disturb‎‏‎‎‏‎"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎Start now‎‏‎‎‏‎"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‎Customize‎‏‎‎‏‎"</string>
<string name="notification_done" msgid="6215117625922713976">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎Done‎‏‎‎‏‎"</string>
<string name="inline_undo" msgid="9026953267645116526">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎Undo‎‏‎‎‏‎"</string>
+ <string name="demote" msgid="6225813324237153980">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎Mark this notification as not a conversation‎‏‎‎‏‎"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‎Favorite‎‏‎‎‏‎"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‎‎Unfavorite‎‏‎‎‏‎"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎Mute‎‏‎‎‏‎"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‎‎Unmute‎‏‎‎‏‎"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎Show as bubble‎‏‎‎‏‎"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‎Turn off bubbles‎‏‎‎‏‎"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‎Add to home screen‎‏‎‎‏‎"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ ‎‏‎‎‏‏‎<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎notification controls‎‏‎‎‏‎"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎notification snooze options‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index eb27998f409d..255db9229657 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"La tecnología NFC está inhabilitada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"La tecnología NFC está habilitada"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Grabar pantalla"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Detener"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Desliza el dedo hacia arriba para cambiar de app"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastra a la derecha para cambiar aplicaciones rápidamente"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Ocultar o mostrar Recientes"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Administrar"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificaciones silenciosas"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo \"No interrumpir\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Comenzar ahora"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizar"</string>
<string name="notification_done" msgid="6215117625922713976">"Listo"</string>
<string name="inline_undo" msgid="9026953267645116526">"Deshacer"</string>
+ <string name="demote" msgid="6225813324237153980">"Marcar que la notificación no es una conversación"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Marcar como favorita"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Borrar de las favoritas"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Silenciar"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Dejar de silenciar"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Mostrar como cuadro"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Desactivar cuadros"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Agregar a la pantalla principal"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"controles de notificación"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opciones para posponer notificaciones"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 731d72750eb8..d1d959c84099 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -389,8 +389,11 @@
<string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Al anochecer"</string>
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Hasta el amanecer"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
- <string name="quick_settings_nfc_off" msgid="3465000058515424663">"La conexión NFC está inhabilitada"</string>
- <string name="quick_settings_nfc_on" msgid="1004976611203202230">"La conexión NFC está habilitada"</string>
+ <string name="quick_settings_nfc_off" msgid="3465000058515424663">"El NFC está desactivado"</string>
+ <string name="quick_settings_nfc_on" msgid="1004976611203202230">"El NFC está activado"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Grabación de la pantalla"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Inicio"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Detener"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Desliza el dedo hacia arriba para cambiar de aplicación"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastra hacia la derecha para cambiar rápidamente de aplicación"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Mostrar u ocultar aplicaciones recientes"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gestionar"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificaciones silenciadas"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciadas"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo No molestar"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar ahora"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizar"</string>
<string name="notification_done" msgid="6215117625922713976">"Listo"</string>
<string name="inline_undo" msgid="9026953267645116526">"Deshacer"</string>
+ <string name="demote" msgid="6225813324237153980">"Marcar esta notificación como que no es una conversación"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Favorita"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Quitar de favoritos"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Silenciar"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Activar sonido"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Mostrar como burbuja"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Desactivar las burbujas"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Añadir a la pantalla de inicio"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"Controles de las notificaciones"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"Opciones para posponer las notificaciones"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index ab86e03d24fc..6f69a17f35f0 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC on keelatud"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC on lubatud"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Rakenduste vahetamiseks pühkige üles"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Lohistage paremale, et rakendusi kiiresti vahetada"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Lehe Ülevaade sisse- ja väljalülitamine"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tühjenda kõik"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Haldamine"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Hääletud märguanded"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Vestlused"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kustuta kõik hääletud märguanded"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Režiim Mitte segada peatas märguanded"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Alusta kohe"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Kohandamine"</string>
<string name="notification_done" msgid="6215117625922713976">"Valmis"</string>
<string name="inline_undo" msgid="9026953267645116526">"Võta tagasi"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"märguannete juhtnupud"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"märguannete edasilükkamise valikud"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 18ac0314253f..1b89c5aa92d2 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -57,12 +57,12 @@
<string name="label_view" msgid="6815442985276363364">"Ikusi"</string>
<string name="always_use_device" msgid="210535878779644679">"Ireki <xliff:g id="APPLICATION">%1$s</xliff:g> <xliff:g id="USB_DEVICE">%2$s</xliff:g> konektatzen den guztietan"</string>
<string name="always_use_accessory" msgid="1977225429341838444">"Ireki <xliff:g id="APPLICATION">%1$s</xliff:g> <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> konektatzen den guztietan"</string>
- <string name="usb_debugging_title" msgid="8274884945238642726">"USB arazketa onartu?"</string>
+ <string name="usb_debugging_title" msgid="8274884945238642726">"USB bidezko arazketa onartu?"</string>
<string name="usb_debugging_message" msgid="5794616114463921773">"Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="4003121804294739548">"Eman beti ordenagailu honetatik arazteko baimena"</string>
<string name="usb_debugging_allow" msgid="1722643858015321328">"Baimendu"</string>
- <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ez da onartzen USB arazketa"</string>
- <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Gailu honetan saioa hasita daukan erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string>
+ <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ez da onartzen USB bidezko arazketa"</string>
+ <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Gailu honetan saioa hasita daukan erabiltzaileak ezin du aktibatu USB bidezko arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string>
<string name="usb_contaminant_title" msgid="894052515034594113">"Desgaitu egin da USB ataka"</string>
<string name="usb_contaminant_message" msgid="7730476585174719805">"USB ataka desgaitu egin da gailua likido edo zikinkeriengandik babesteko, eta ez du hautemango osagarririk.\n\nJakinarazpen bat jasoko duzu USB ataka berriz erabiltzeko moduan dagoenean."</string>
<string name="usb_port_enabled" msgid="531823867664717018">"USB ataka gaitu da kargagailuak eta osagarriak hautemateko"</string>
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Desgaituta dago NFC"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Gaituta dago NFC"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Egin gora aplikazioa aldatzeko"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastatu eskuinera aplikazioa azkar aldatzeko"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Aldatu ikuspegi orokorra"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Garbitu guztiak"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Kudeatu"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Soinurik gabeko jakinarazpenak"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Elkarrizketak"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Garbitu soinurik gabeko jakinarazpen guztiak"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ez molestatzeko moduak pausatu egin ditu jakinarazpenak"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Hasi"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Pertsonalizatu"</string>
<string name="notification_done" msgid="6215117625922713976">"Eginda"</string>
<string name="inline_undo" msgid="9026953267645116526">"Desegin"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"jakinarazpena kontrolatzeko aukerak"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"jakinarazpena atzeratzeko aukerak"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 77164b790179..2b765573ac06 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"‏NFC غیرفعال است"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"‏NFC فعال است"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"برای تغییر برنامه‌ها،‌ تند به بالا بکشید"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"برای جابه‌جایی سریع میان برنامه‌ها، به چپ بکشید"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"تغییر وضعیت نمای کلی"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"پاک کردن همه موارد"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"مدیریت"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"اعلان‌های بی‌صدا"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"مکالمه‌ها"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"پاک کردن همه اعلان‌های بی‌صدا"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"اعلان‌ها توسط «مزاحم نشوید» موقتاً متوقف شدند"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"اکنون شروع شود"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"سفارشی کردن"</string>
<string name="notification_done" msgid="6215117625922713976">"تمام"</string>
<string name="inline_undo" msgid="9026953267645116526">"واگرد"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"کنترل‌های اعلان"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"گزینه‌های تعویق اعلان"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index e70b4d5221a2..9b76f39175ab 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC on poistettu käytöstä"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC on käytössä"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Vaihda sovellusta pyyhkäisemällä ylös"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Vaihda sovellusta nopeasti vetämällä oikealle"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Näytä/piilota viimeisimmät"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Poista kaikki"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Muuta asetuksia"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Hiljaiset ilmoitukset"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Keskustelut"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Tyhjennä kaikki hiljaiset ilmoitukset"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Älä häiritse ‑tila keskeytti ilmoitukset"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Aloita nyt"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Muokkaa"</string>
<string name="notification_done" msgid="6215117625922713976">"Valmis"</string>
<string name="inline_undo" msgid="9026953267645116526">"Kumoa"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"Ilmoitusten hallinta"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"Ilmoitusten torkkuasetukset"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index ead29c0a4e48..55eb39ee69f2 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC désactivée"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC activée"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Enregistrement d\'écran"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Démarrer"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Arrêter"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Balayez vers le haut pour changer d\'application"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Balayez l\'écran vers la droite pour changer rapidement d\'application"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Basculer l\'aperçu"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tout effacer"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gérer"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifications silencieuses"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Les notifications sont suspendues par le mode Ne pas déranger"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personnaliser"</string>
<string name="notification_done" msgid="6215117625922713976">"Terminé"</string>
<string name="inline_undo" msgid="9026953267645116526">"Annuler"</string>
+ <string name="demote" msgid="6225813324237153980">"Marquer cette notification comme n\'étant pas une conversation"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Ajouter aux favoris"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Supprimer des favoris"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Ignorer"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Réactiver"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Afficher comme bulle"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Désactiver les bulles"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Ajouter à l\'écran d\'accueil"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"paramètres des notifications"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"options de répétition des notifications"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index b701276c9eec..5b126129311e 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -389,8 +389,11 @@
<string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Activé la nuit"</string>
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Jusqu\'à l\'aube"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
- <string name="quick_settings_nfc_off" msgid="3465000058515424663">"La technologie NFC est désactivée"</string>
+ <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC désactivée"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"La technologie NFC est activée"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Enregistrement de l\'écran"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Démarrer"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Arrêter"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Balayer l\'écran vers le haut pour changer d\'application"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Déplacer vers la droite pour changer rapidement d\'application"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activer/Désactiver l\'aperçu"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tout effacer"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gérer"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifications silencieuses"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications suspendues par le mode Ne pas déranger"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personnaliser"</string>
<string name="notification_done" msgid="6215117625922713976">"Terminé"</string>
<string name="inline_undo" msgid="9026953267645116526">"Annuler"</string>
+ <string name="demote" msgid="6225813324237153980">"Marquer cette notification comme n\'étant pas une conversation"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Ajouter aux favoris"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Supprimer des favoris"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Couper le son"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Réactiver le son"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Afficher sous forme de bulle"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Désactiver les bulles"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Ajouter à l\'écran d\'accueil"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> : <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"paramètres des notifications"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"options de répétition des notifications"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 464684ec0fb8..74ee202f9926 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"A opción NFC está desactivada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"A opción NFC está activada"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravación da pantalla"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Deter"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Pasar o dedo cara arriba para cambiar de aplicación"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastra cara á dereita para cambiar de aplicacións rapidamente"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activar/desactivar Visión xeral"</string>
@@ -465,13 +468,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Desactivar a función Aforro de batería"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> terá acceso a toda a información visible na pantalla ou reproducida desde o teu dispositivo mentres graves ou emitas contido. Isto inclúe información como contrasinais, detalles de pago, fotos, mensaxes e o audio que reproduzas."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"O servizo que proporciona esta función terá acceso a toda a información visible na pantalla ou reproducida desde o teu dispositivo mentres graves ou emitas contido. Isto inclúe información como contrasinais, detalles de pago, fotos, mensaxes e o audio que reproduzas."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Queres iniciar a gravación ou a emisión?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Queres comezar a gravar ou emitir contido con <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Non mostrar outra vez"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Eliminar todas"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Xestionar"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificacións silenciadas"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borra todas as notificacións silenciadas"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"O modo Non molestar puxo en pausa as notificacións"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
@@ -690,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizar"</string>
<string name="notification_done" msgid="6215117625922713976">"Feito"</string>
<string name="inline_undo" msgid="9026953267645116526">"Desfacer"</string>
+ <string name="demote" msgid="6225813324237153980">"Marcar que esta notificación non é unha conversa"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Engadir a favoritos"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Quitar de favoritos"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Silenciar"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Activar son"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Mostrar como unha burbulla"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Desactivar burbullas"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Engadir á pantalla de inicio"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"controis de notificacións"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opcións para adiar notificacións"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index de6b37935022..4b5dd2519055 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -37,7 +37,7 @@
<string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"બૅટરી સેવર વિશે"</string>
<string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"ચાલુ કરો"</string>
<string name="battery_saver_start_action" msgid="4553256017945469937">"બૅટરી સેવર ચાલુ કરો"</string>
- <string name="status_bar_settings_settings_button" msgid="534331565185171556">"સેટિંગ્સ"</string>
+ <string name="status_bar_settings_settings_button" msgid="534331565185171556">"સેટિંગ"</string>
<string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"વાઇ-ફાઇ"</string>
<string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"ઑટો રોટેટ સ્ક્રીન"</string>
<string name="status_bar_settings_mute_label" msgid="914392730086057522">"મ્યૂટ કરો"</string>
@@ -224,7 +224,7 @@
<string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"નોટિફિકેશન શેડ."</string>
<string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ઝડપી સેટિંગ્સ."</string>
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"લૉક સ્ક્રીન."</string>
- <string name="accessibility_desc_settings" msgid="6728577365389151969">"સેટિંગ્સ"</string>
+ <string name="accessibility_desc_settings" msgid="6728577365389151969">"સેટિંગ"</string>
<string name="accessibility_desc_recent_apps" msgid="1748675199348914194">"ઝલક."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"કાર્ય લૉક સ્ક્રીન"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"બંધ કરો"</string>
@@ -295,7 +295,7 @@
</plurals>
<string name="notification_summary_message_format" msgid="5158219088501909966">"<xliff:g id="CONTACT_NAME">%1$s</xliff:g>: <xliff:g id="MESSAGE_CONTENT">%2$s</xliff:g>"</string>
<string name="status_bar_notification_inspect_item_title" msgid="6818779631806163080">"સૂચનાઓની સેટિંગ્સ"</string>
- <string name="status_bar_notification_app_settings_title" msgid="5050006438806013903">"<xliff:g id="APP_NAME">%s</xliff:g> સેટિંગ્સ"</string>
+ <string name="status_bar_notification_app_settings_title" msgid="5050006438806013903">"<xliff:g id="APP_NAME">%s</xliff:g> સેટિંગ"</string>
<string name="accessibility_rotation_lock_off" msgid="3880436123632448930">"સ્ક્રીન આપમેળે ફરશે."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"સ્ક્રીન લેન્ડસ્કેપ ઓરિએન્ટેશનમાં લૉક કરેલ છે."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"સ્ક્રીન પોટ્રેટ ઓરિએન્ટેશનમાં લૉક કરેલ છે."</string>
@@ -333,7 +333,7 @@
<string name="quick_settings_media_device_label" msgid="8034019242363789941">"મીડિયા ઉપકરણ"</string>
<string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"ફક્ત કટોકટીના કૉલ્સ"</string>
- <string name="quick_settings_settings_label" msgid="2214639529565474534">"સેટિંગ્સ"</string>
+ <string name="quick_settings_settings_label" msgid="2214639529565474534">"સેટિંગ"</string>
<string name="quick_settings_time_label" msgid="3352680970557509303">"સમય"</string>
<string name="quick_settings_user_label" msgid="1253515509432672496">"હું"</string>
<string name="quick_settings_user_title" msgid="8673045967216204537">"વપરાશકર્તા"</string>
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC અક્ષમ કરેલ છે"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC સક્ષમ કરેલ છે"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ઍપ સ્વિચ કરવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ઍપને ઝડપથી સ્વિચ કરવા માટે જમણે ખેંચો"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ઝલકને ટૉગલ કરો"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"બધુ સાફ કરો"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"મેનેજ કરો"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"સાઇલન્ટ નોટિફિકેશન"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"વાતચીત"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"બધા સાઇલન્ટ નોટિફિકેશન સાફ કરો"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ખલેલ પાડશો નહીં દ્વારા થોભાવેલ નોટિફિકેશન"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"હવે પ્રારંભ કરો"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"કસ્ટમાઇઝ કરો"</string>
<string name="notification_done" msgid="6215117625922713976">"થઈ ગયું"</string>
<string name="inline_undo" msgid="9026953267645116526">"રદ કરો"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"સૂચના નિયંત્રણો"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"સૂચના સ્નૂઝ કરવાના વિકલ્પો"</string>
@@ -885,7 +908,7 @@
<string name="notification_channel_general" msgid="4384774889645929705">"સામાન્ય સંદેશા"</string>
<string name="notification_channel_storage" msgid="2720725707628094977">"સ્ટોરેજ"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"હિન્ટ"</string>
- <string name="instant_apps" msgid="8337185853050247304">"ઝટપટ ઍપ્લિકેશનો"</string>
+ <string name="instant_apps" msgid="8337185853050247304">"ઝટપટ ઍપ્લિકેશન"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> ચાલી રહી છે"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"ઍપ ઇન્સ્ટૉલ કર્યા વિના ખુલી જાય છે."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"ઍપ ઇન્સ્ટૉલ કર્યા વિના ખુલી જાય છે. વધુ જાણવા માટે ટૅપ કરો."</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 706f8b306e02..c22d234bedd9 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"एनएफ़सी"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC बंद है"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC चालू है"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ऐप्लिकेशन बदलने के लिए ऊपर स्वाइप करें"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ऐप्लिकेशन को झटपट स्विच करने के लिए उसे दाईं ओर खींचें और छोड़ें"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"खास जानकारी टॉगल करें"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"बैटरी सेवर बंद करें"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपकी स्क्रीन पर दिख रही या आपके डिवाइस पर चलाई जा रही जानकारी ऐक्सेस कर सकता है. इसमें पासवर्ड, पैसे चुकाने का ब्यौरा, फ़ोटो, मैसेज, और चलाए गए ऑडियो जैसी जानकारी शामिल है."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"रिकॉर्ड या कास्ट करते समय, वह सेवा जो यह फ़ंक्शन उपलब्ध कराती है, आपके डिवाइस पर चलाई जा रही या स्क्रीन पर दिख रही जानकारी को ऐक्सेस कर सकती है. इसमें पासवर्ड, पैसे चुकाने का ब्यौरा, फ़ोटो, मैसेज, और चलाए गए ऑडियो जैसी जानकारी शामिल है."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"रिकॉर्डिंग या कास्ट करना शुरू करें?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> का इस्तेमाल करके रिकॉर्ड और कास्ट करना शुरू करें?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"फिर से न दिखाएं"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"सभी को हटाएं"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"प्रबंधित करें"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"बिना आवाज़ या वाइब्रेशन वाली सूचनाएं"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"बिना आवाज़ की सभी सूचनाएं हटाएं"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"अब शुरू करें"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"पसंद के मुताबिक बनाएं"</string>
<string name="notification_done" msgid="6215117625922713976">"हो गया"</string>
<string name="inline_undo" msgid="9026953267645116526">"पहले जैसा करें"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"सूचना नियंत्रण"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"सूचना को स्नूज़ (थोड़ी देर के लिए चुप करना) करने के विकल्प"</string>
@@ -886,7 +908,7 @@
<string name="notification_channel_general" msgid="4384774889645929705">"सामान्य संदेश"</string>
<string name="notification_channel_storage" msgid="2720725707628094977">"जगह"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"संकेत"</string>
- <string name="instant_apps" msgid="8337185853050247304">"इंस्टेंट ऐप"</string>
+ <string name="instant_apps" msgid="8337185853050247304">"झटपट ऐप्लिकेशन"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> चल रहा है"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"ऐप्लिकेशन इंस्टॉल किए बिना ही खुल गया है."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"ऐप्लिकेशन इंस्टॉल किए बिना ही खुल गया है. ज़्यादा जानने के लिए टैप करें."</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index bf027fb4f707..128670923f1c 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -393,6 +393,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je omogućen"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Snimač zaslona"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Početak"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zaustavi"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Prijeđite prstom prema gore da biste promijenili aplikaciju"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Povucite udesno da biste brzo promijenili aplikaciju"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Uključivanje/isključivanje pregleda"</string>
@@ -474,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Izbriši sve"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Bešumne obavijesti"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Izbriši sve bešumne obavijesti"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Značajka Ne uznemiravaj pauzirala je Obavijesti"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Započni sad"</string>
@@ -692,6 +696,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Prilagodi"</string>
<string name="notification_done" msgid="6215117625922713976">"Gotovo"</string>
<string name="inline_undo" msgid="9026953267645116526">"Poništi"</string>
+ <string name="demote" msgid="6225813324237153980">"Označi da ova obavijest nije razgovor"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Favorit"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Nije omiljeno"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Zanemari"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Opozovi"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Prikaži u oblačiću"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Isključi oblačiće"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Dodavanje na početni zaslon"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kontrole obavijesti"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opcije odgode obavijesti"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 90c8a1a8f576..a3b6d3fe1480 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Az NFC ki van kapcsolva"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Az NFC be van kapcsolva"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Képernyő rögzítése"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Kezdés"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Leállítás"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Váltás az alkalmazások között felfelé csúsztatással"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Húzza jobbra az ujját az alkalmazások közötti gyors váltáshoz"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Áttekintés be- és kikapcsolása"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Az összes törlése"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Kezelés"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Néma értesítések"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Beszélgetések"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Az összes néma értesítés törlése"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ne zavarjanak funkcióval szüneteltetett értesítések"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Indítás most"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Személyre szabás"</string>
<string name="notification_done" msgid="6215117625922713976">"Kész"</string>
<string name="inline_undo" msgid="9026953267645116526">"Visszavonás"</string>
+ <string name="demote" msgid="6225813324237153980">"Értesítés megjelölése mint nem beszélgetés"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Kedvenc"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Törlés a kedvencek közül"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Némítás"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Némítás feloldása"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Megjelenítés buborékként"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Buborékok kikapcsolása"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Hozzáadás a kezdőképernyőhöz"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> – <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"értesítésvezérlők"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"értesítések halasztási beállításai"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index f25f6ae7152d..5c73ed18d73f 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC-ն անջատված է"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC-ն միացված է"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Սահեցրեք վերև՝ մյուս հավելվածին անցնելու համար"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Քաշեք աջ՝ հավելվածների միջև անցնելու համար"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Միացնել/անջատել համատեսքը"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Անջատել մարտկոցի տնտեսումը"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Ձայնագրման և հեռարձակման ընթացքում <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> հավելվածին հասանելի կլինեն ձեր սարքի էկրանին ցուցադրվող տեղեկությունները և ձեր սարքով նվագարկվող նյութերը։ Սա ներառում է այնպիսի տեղեկություններ, ինչպիսիք են, օրինակ, գաղտնաբառերը, վճարային տվյալները, լուսանկարները, հաղորդագրությունները և նվագարկվող աուդիո ֆայլերը։"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Ձայնագրման և հեռարձակման ընթացքում ծառայությունների մատակարարին հասանելի կլինեն ձեր սարքի էկրանին ցուցադրվող տեղեկությունները և ձեր սարքով նվագարկվող նյութերը։ Սա ներառում է այնպիսի տեղեկություններ, ինչպիսիք են, օրինակ, գաղտնաբառերը, վճարային տվյալները, լուսանկարները, հաղորդագրությունները և նվագարկվող աուդիո ֆայլերը։"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Սկսե՞լ ձայնագրումը կամ հեռարձակումը"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Սկսե՞լ ձայնագրումը կամ հեռարձակումը <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> հավելվածով"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Այլևս ցույց չտալ"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Մաքրել բոլորը"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Կառավարել"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Անձայն ծանուցումներ"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Խոսակցություններ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ջնջել բոլոր անձայն ծանուցումները"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Սկսել հիմա"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Կարգավորել"</string>
<string name="notification_done" msgid="6215117625922713976">"Պատրաստ է"</string>
<string name="inline_undo" msgid="9026953267645116526">"Հետարկել"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"ծանուցման կառավարներ"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"ծանուցման հետաձգման ընտրանքներ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 835725fd940f..bad3e677af0d 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC dinonaktifkan"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC diaktifkan"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Rekaman Layar"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Mulai"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Berhenti"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Geser ke atas untuk beralih aplikasi"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Tarik ke kanan untuk beralih aplikasi dengan cepat"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Aktifkan Ringkasan"</string>
@@ -465,13 +468,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Nonaktifkan Penghemat Baterai"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan memiliki akses ke semua informasi yang terlihat di layar atau diputar dari perangkat saat merekam atau melakukan transmisi. Ini mencakup informasi seperti sandi, detail pembayaran, foto, pesan, dan audio yang Anda putar."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Layanan yang menyediakan fungsi ini akan memiliki akses ke semua informasi yang terlihat di layar atau diputar dari perangkat saat merekam atau melakukan transmisi. Ini mencakup informasi seperti sandi, detail pembayaran, foto, pesan, dan audio yang Anda putar."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Mulai merekam atau melakukan transmisi?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Mulai merekam atau melakukan transmisi dengan <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Jangan tampilkan lagi"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Hapus semua"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Kelola"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifikasi senyap"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Percakapan"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hapus semua notifikasi senyap"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikasi dijeda oleh mode Jangan Ganggu"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Mulai sekarang"</string>
@@ -690,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Sesuaikan"</string>
<string name="notification_done" msgid="6215117625922713976">"Selesai"</string>
<string name="inline_undo" msgid="9026953267645116526">"Urungkan"</string>
+ <string name="demote" msgid="6225813324237153980">"Tandai notifikasi ini sebagai bukan percakapan"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Favorit"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Batal favoritkan"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Bisukan"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Bunyikan"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Tampilkan sebagai balon"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Nonaktifkan balon"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Tambahkan ke layar utama"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kontrol notifikasi"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opsi tunda notifikasi"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 95e401012683..68f04fb506fc 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Slökkt á NFC"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Kveikt á NFC"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Skjáupptaka"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Hefja"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stöðva"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Strjúktu upp til að skipta á milli forrita"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Dragðu til hægri til að skipta hratt á milli forrita"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Kveikja/slökkva á yfirliti"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Hreinsa allt"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Stjórna"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Þöglar tilkynningar"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtöl"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hreinsa allar þöglar tilkynningar"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Byrja núna"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Sérsníða"</string>
<string name="notification_done" msgid="6215117625922713976">"Lokið"</string>
<string name="inline_undo" msgid="9026953267645116526">"Afturkalla"</string>
+ <string name="demote" msgid="6225813324237153980">"Merkja þessa tilkynningu sem „ekki samtal“"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Eftirlæti"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Fjarlægja úr eftirlæti"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Þagga"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Hætta að þagga"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Sýna sem blöðru"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Slökkva á blöðrum"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Bæta á heimaskjá"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"tilkynningastýringar"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"þöggunarstillingar tilkynninga"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 4cec98052cd6..bdf93fa93e15 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC non attiva"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC attiva"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Registrazione dello schermo"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Inizia"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Interrompi"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Scorri verso l\'alto per passare ad altre app"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Trascina verso destra per cambiare velocemente app"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Attiva/disattiva la panoramica"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Cancella tutto"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gestisci"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifiche silenziose"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversazioni"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Cancella tutte le notifiche silenziose"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifiche messe in pausa in base alla modalità Non disturbare"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Avvia adesso"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizza"</string>
<string name="notification_done" msgid="6215117625922713976">"Fine"</string>
<string name="inline_undo" msgid="9026953267645116526">"Annulla"</string>
+ <string name="demote" msgid="6225813324237153980">"Contrassegna questa notifica come \"non è una conversazione\""</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Aggiungi ai preferiti"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Rimuovi dai preferiti"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Disattiva"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Riattiva"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Mostra sotto forma di fumetto"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Disattiva i fumetti"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Aggiungi a schermata Home"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"gestione delle notifiche"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opzioni di posticipazione notifiche"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 949c8db5910b..9cfd0b3a22f6 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -395,6 +395,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"‏NFC מושבת"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"‏NFC מופעל"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"יש להחליק מעלה כדי להחליף אפליקציות"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"יש לגרור ימינה כדי לעבור במהירות בין אפליקציות"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"החלפת מצב של מסכים אחרונים"</string>
@@ -477,6 +483,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"ניקוי הכל"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"ניהול"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"התראות שקטות"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"שיחות"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ניקוי כל ההתראות השקטות"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"התראות הושהו על ידי מצב \'נא לא להפריע\'"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"התחל כעת"</string>
@@ -695,6 +702,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"התאמה אישית"</string>
<string name="notification_done" msgid="6215117625922713976">"סיום"</string>
<string name="inline_undo" msgid="9026953267645116526">"ביטול"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"בקרת התראות"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"אפשרויות של דחיית התראות לטיפול בהמשך"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 2f1ad0922597..0c57372f3ba9 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC は無効です"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC は有効です"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"アプリを切り替えるには上にスワイプ"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"右にドラッグするとアプリを素早く切り替えることができます"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"概要を切り替え"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"バッテリー セーバーを OFF"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>は、記録中やキャスト中に画面上に表示またはデバイスから再生されるすべての情報にアクセスできます。これには、パスワード、お支払いの詳細、写真、メッセージ、再生される音声などの情報が含まれます。"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"この機能を提供するサービスは、記録中やキャスト中に画面上に表示またはデバイスから再生されるすべての情報にアクセスできます。これには、パスワード、お支払いの詳細、写真、メッセージ、再生される音声などの情報が含まれます。"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"記録やキャストを開始しますか?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>で記録やキャストを開始しますか?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"次回から表示しない"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"すべて消去"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"サイレント通知"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"会話"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"サイレント通知がすべて消去されます"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"サイレント モードにより通知は一時停止中です"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"今すぐ開始"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"カスタマイズ"</string>
<string name="notification_done" msgid="6215117625922713976">"完了"</string>
<string name="inline_undo" msgid="9026953267645116526">"元に戻す"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"通知管理"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"通知スヌーズ設定"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 7754572578da..a3827d2a183b 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC გათიშულია"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ჩართულია"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"გადაფურცლეთ ზემოთ აპების გადასართავად"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"აპების სწრაფად გადასართავად ჩავლებით გადაიტანეთ მარჯვნივ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"მიმოხილვის გადართვა"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ბატარეის დამზოგის გამორთვა"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-ს ექნება წვდომა ყველა ინფორმაციაზე, რომელიც თქვენს ეკრანზე გამოჩნდება ან თქვენს მოწყობილობაზე დაიკვრება ჩაწერის ან ტრანსლირების განმავლობაში. აღნიშნული მოიცავს ისეთ ინფორმაციას, როგორიც არის პაროლები, გადახდის დეტალები, ფოტოები, შეტყობინებები და თქვენ მიერ დაკრული აუდიო."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"ამ ფუნქციის მომწოდებელ სერვისს ექნება წვდომა ყველა ინფორმაციაზე, რომელიც თქვენს ეკრანზე გამოჩნდება ან თქვენს მოწყობილობაზე დაიკვრება ჩაწერის ან ტრანსლირების განმავლობაში. აღნიშნული მოიცავს ისეთ ინფორმაციას, როგორიც არის პაროლები, გადახდის დეტალები, ფოტოები, შეტყობინებები და თქვენ მიერ დაკრული აუდიო."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"დაიწყოს ჩაწერა ან ტრანსლირება?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"დაიწყოს ჩაწერა ან ტრანსლირება <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-ით?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"აღარ მაჩვენო"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ყველას გასუფთავება"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"მართვა"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"ჩუმი შეტყობინებები"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"მიმოწერები"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ყველა ჩუმი შეტყობინების გასუფთავება"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"შეტყობინებები დაპაუზდა „არ შემაწუხოთ“ რეჟიმის მეშვეობით"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"დაწყება ახლავე"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"მორგება"</string>
<string name="notification_done" msgid="6215117625922713976">"მზადაა"</string>
<string name="inline_undo" msgid="9026953267645116526">"მოქმედების გაუქმება"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"შეტყობინებების მართვის საშუალებები"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"შეტყობინებების ჩაჩუმების ვარიანტები"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index f60aeaf37ac0..19ae4e2a02d7 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC өшірулі"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC қосулы"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Қолданбалар арасында ауысу үшін жоғары сырғытыңыз"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Қолданбаларды жылдам ауыстырып қосу үшін оңға қарай сүйреңіз"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Шолуды қосу/өшіру"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Battery saver функциясын өшіру"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранда көрсетілетін немесе жазу не трансляциялау кезінде құрылғыда ойнатылған барлық ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және ойнатылатын аудио сияқты ақпарат кіреді."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Осы функцияны ұсынатын қызмет экранда көрсетілетін немесе жазу не трансляциялау кезінде құрылғыда ойнатылған барлық ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және ойнатылатын аудио сияқты ақпарат кіреді."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Жазу немесе трансляциялау басталсын ба?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> арқылы жазу немесе трансляциялау басталсын ба?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Қайта көрсетпеу"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Барлығын тазалау"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Басқару"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Дыбыссыз хабарландырулар"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Сөйлесулер"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Барлық дыбыссыз хабарландыруларды өшіру"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Хабарландырулар \"Мазаламау\" режимінде кідіртілді"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Қазір бастау"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Реттеу"</string>
<string name="notification_done" msgid="6215117625922713976">"Дайын"</string>
<string name="inline_undo" msgid="9026953267645116526">"Қайтару"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"хабарландыруларды басқару элементтері"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"хабарландыруды кідірту опциялары"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 0550adefe547..d6ec177d3909 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"បាន​បិទ NFC"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"បាន​បើក NFC"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"អូស​ឡើង​លើ​ដើម្បី​ប្តូរ​កម្មវិធី"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"អូសទៅស្ដាំដើម្បីប្ដូរកម្មវិធីបានរហ័ស"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"បិទ/បើក​ទិដ្ឋភាពរួម"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"បិទ​កម្មវិធី​សន្សំ​ថ្ម"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> នឹងមានសិទ្ធិ​ចូលប្រើ​ព័ត៌មាន​ទាំងអស់​ដែលអាច​មើលឃើញ​នៅលើ​អេក្រង់​របស់អ្នក ឬដែលចាក់​ពីឧបករណ៍​របស់អ្នក នៅពេល​កំពុង​ថត ឬបញ្ជូន។ ព័ត៌មាន​នេះមាន​ដូចជា ពាក្យសម្ងាត់ ព័ត៌មាន​លម្អិត​អំពីការទូទាត់​ប្រាក់ រូបថត សារ និង​សំឡេង​ដែល​អ្នកចាក់​ជាដើម។"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"សេវាកម្មដែល​ផ្ដល់​មុខងារ​នេះ​នឹងមាន​សិទ្ធិ​ចូលប្រើ​ព័ត៌មាន​ទាំងអស់​ដែល​អាច​មើលឃើញ​នៅលើ​អេក្រង់​របស់អ្នក ឬ​ដែលចាក់​ពីឧបករណ៍​របស់អ្នក នៅពេល​កំពុង​ថត ឬបញ្ជូន។ ព័ត៌មាន​នេះមាន​ដូចជា ពាក្យសម្ងាត់ ព័ត៌មាន​លម្អិត​អំពីការទូទាត់​ប្រាក់ រូបថត សារ និង​សំឡេង​ដែល​អ្នកចាក់​ជាដើម។"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ចាប់ផ្ដើម​ថត ឬបញ្ជូន​មែនទេ?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"ចាប់ផ្ដើម​ថត ឬបញ្ជូន​ដោយប្រើ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ឬ?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"កុំ​បង្ហាញ​ម្ដងទៀត"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"សម្អាត​ទាំងអស់"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"គ្រប់គ្រង"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"ការជូនដំណឹង​ស្ងាត់"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"ការសន្ទនា"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"សម្អាត​ការជូនដំណឹង​ស្ងាត់ទាំងអស់"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ការជូនដំណឹង​បានផ្អាក​ដោយ​មុខងារកុំរំខាន"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ចាប់ផ្ដើម​ឥឡូវ"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"ប្ដូរតាមបំណង"</string>
<string name="notification_done" msgid="6215117625922713976">"រួចរាល់"</string>
<string name="inline_undo" msgid="9026953267645116526">"ត្រឡប់វិញ"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"ការគ្រប់គ្រង​ការជូន​ដំណឹង"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"ជម្រើស​ផ្អាកការ​ជូនដំណឹង"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 154f13b3a9c3..fc0f8e6c8093 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬದಲಿಸಲು ತ್ವರಿತವಾಗಿ ಬಲಕ್ಕೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ಟಾಗಲ್ ನ ಅವಲೋಕನ"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಆಫ್ ಮಾಡಿ"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುವ ಅಥವಾ ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವಾಗ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಆಗುವ ಎಲ್ಲಾ ಮಾಹಿತಿಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತವೆ. ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೊ ಪ್ಲೇಬ್ಯಾಕ್‌ನಂತಹ ಮಾಹಿತಿಯನ್ನು ಇದು ಒಳಗೊಂಡಿದೆ."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"ಈ ವೈಶಿಷ್ಟ್ಯವು ಒದಗಿಸುವ ಸೇವೆಗಳು, ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುವ ಅಥವಾ ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವಾಗ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಆಗುವ ಎಲ್ಲಾ ಮಾಹಿತಿಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತವೆ. ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೊ ಪ್ಲೇಬ್ಯಾಕ್‌ನಂತಹ ಮಾಹಿತಿಯನ್ನು ಇದು ಒಳಗೊಂಡಿದೆ."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಬೇಕೆ?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಬಳಸಿಕೊಂಡು ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸುವುದೇ?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸದಿರು"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"ನಿರ್ವಹಿಸಿ"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳು"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"ಸಂವಾದಗಳು"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ಎಲ್ಲಾ ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಎನ್ನುವ ಮೂಲಕ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ಈಗ ಪ್ರಾರಂಭಿಸಿ"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"ಕಸ್ಟಮೈಜ್‌ ಮಾಡಿ"</string>
<string name="notification_done" msgid="6215117625922713976">"ಮುಗಿದಿದೆ"</string>
<string name="inline_undo" msgid="9026953267645116526">"ರದ್ದುಮಾಡಿ"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳು"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"ಅಧಿಸೂಚನೆ ಸ್ನೂಜ್ ಆಯ್ಕೆಗಳು"</string>
@@ -886,7 +908,7 @@
<string name="notification_channel_general" msgid="4384774889645929705">"ಸಾಮಾನ್ಯ ಸಂದೇಶಗಳು"</string>
<string name="notification_channel_storage" msgid="2720725707628094977">"ಸಂಗ್ರಹಣೆ"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"ಸುಳಿವುಗಳು"</string>
- <string name="instant_apps" msgid="8337185853050247304">"ತತ್‌ಕ್ಷಣ ಆಪ್‌ಗಳು"</string>
+ <string name="instant_apps" msgid="8337185853050247304">"ಇನ್‌ಸ್ಟಂಟ್ ಆ್ಯಪ್‌ಗಳು"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> ರನ್ ಆಗುತ್ತಿದೆ"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡದೆ ಆ್ಯಪ್‌ ತೆರೆಯಲಾಗಿದೆ."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡದೆ ಆ್ಯಪ್‌ ತೆರೆಯಲಾಗಿದೆ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index b72a30ea3ca2..eb3ebc918edb 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 사용 중지됨"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 사용 설정됨"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"위로 스와이프하여 앱 전환"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"앱을 빠르게 전환하려면 오른쪽으로 드래그"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"최근 사용 버튼 전환"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"절전 모드 사용 중지"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>이(가) 녹화 또는 전송 중에 화면에 표시되거나 기기에서 재생되는 모든 정보에 액세스할 수 있습니다. 여기에는 비밀번호, 결제 세부정보, 사진, 메시지, 재생하는 오디오 같은 정보가 포함됩니다."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"이 기능을 제공하는 서비스는 녹화 또는 전송 중에 화면에 표시되거나 기기에서 재생되는 모든 정보에 액세스할 수 있습니다. 여기에는 비밀번호, 결제 세부정보, 사진, 메시지, 재생하는 오디오 같은 정보가 포함됩니다."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"녹화 또는 전송을 시작하시겠습니까?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>(으)로 녹화 또는 전송을 시작하시겠습니까?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"다시 표시 안함"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"모두 지우기"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"관리"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"무음 알림"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"대화"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"무음 알림 모두 삭제"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 일시중지된 알림"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"시작하기"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"맞춤설정"</string>
<string name="notification_done" msgid="6215117625922713976">"완료"</string>
<string name="inline_undo" msgid="9026953267645116526">"실행취소"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"알림 관리"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"알림 일시 중지 옵션"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index d2f674f50cd0..06f81614d1e2 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC өчүрүлгөн"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC иштетилген"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Колдонмолорду которуштуруу үчүн өйдө сүрүңүз"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Колдонмолорду тез которуштуруу үчүн оңго сүйрөңүз"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Сереп салууну өчүрүү/күйгүзүү"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Батареяны үнөмдөгүч режимин өчүрүү"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Бул функцияны аткарган <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> кызматы экраныңызда көрүнүп турган бардык маалыматты же жаздыруу жана тышкы экранга чыгаруу учурунда түзмөгүңүздө ойнотулган маалыматты колдоно алат. Буга сырсөздөр, төлөмдүн чоо-жайы, сүрөттөр, билдирүүлөр жана ойнотулган аудио кирет."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Бул функцияны аткарган кызмат экраныңызда көрүнүп турган бардык маалыматты же жаздыруу жана тышкы экранга чыгаруу учурунда түзмөгүңүздө ойнотулган маалыматты колдоно алат. Буга сырсөздөр, төлөмдүн чоо-жайы, сүрөттөр, билдирүүлөр жана ойнотулган аудио кирет."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Жаздырылып же тышкы экранга чыгарылып башталсынбы?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> менен жаздырылып же тышкы экранга чыгарылып башталсынбы?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Экинчи көрсөтүлбөсүн"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Баарын тазалап салуу"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Башкаруу"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Үнсүз билдирмелер"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Жазышуулар"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Маанилүү эмес билдирмелердин баарын өчүрүү"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"Тынчымды алба\" режиминде билдирмелер тындырылды"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Азыр баштоо"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Ыңгайлаштыруу"</string>
<string name="notification_done" msgid="6215117625922713976">"Бүттү"</string>
<string name="inline_undo" msgid="9026953267645116526">"Кайтаруу"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"эскертмелерди башкаруу каражаттары"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"эскертмени тындыруу опциялары"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index ca689724a4cf..3013e1e94c34 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ປັດຂື້ນເພື່ອສະຫຼັບແອັບ"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ລາກໄປຂວາເພື່ອສະຫຼັບແອັບດ່ວນ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ສະຫຼັບພາບຮວມ"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ປິດຕົວປະຢັດແບັດເຕີຣີ"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ຈະມີສິດເຂົ້າເຖິງຂໍ້ມູນທັງໝົດທີ່ປາກົດຢູ່ໜ້າຈໍຂອງທ່ານ ຫຼື ຫຼິ້ນຈາກອຸປະກອນຂອງທ່ານໃນເວລາບັນທຶກ ຫຼື ສົ່ງສັນຍານໜ້າຈໍ. ນີ້ຮວມເຖິງຂໍ້ມູນຕ່າງໆ ເຊັ່ນ: ລະຫັດຜ່ານ, ລາຍລະອຽດການຈ່າຍເງິນ, ຮູບ, ຂໍ້ຄວາມ ແລະ ສຽງທີ່ທ່ານຫຼິ້ນ."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"ບໍລິການທີ່ສະໜອງຄວາມສາມາດນີ້ຈະມີສິດເຂົ້າເຖິງຂໍ້ມູນທັງໝົດທີ່ປາກົດຢູ່ໜ້າຈໍຂອງທ່ານ ຫຼື ຫຼິ້ນຈາກອຸປະກອນຂອງທ່ານໃນເວລາບັນທຶກ ຫຼື ສົ່ງສັນຍານໜ້າຈໍ. ນີ້ຮວມເຖິງຂໍ້ມູນຕ່າງໆ ເຊັ່ນ: ລະຫັດຜ່ານ, ລາຍລະອຽດການຈ່າຍເງິນ, ຮູບ, ຂໍ້ຄວາມ ແລະ ສຽງທີ່ທ່ານຫຼິ້ນ."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ເລີ່ມການບັນທຶກ ຫຼື ການສົ່ງສັນຍານໜ້າຈໍບໍ?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"ເລີ່ມການບັນທຶກ ຫຼື ການສົ່ງສັນຍານໜ້າຈໍກັບ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ບໍ?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"ບໍ່​ຕ້ອງ​ສະ​ແດງ​ອີກ"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ລຶບລ້າງທັງໝົດ"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"ຈັດການ"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"ການແຈ້ງເຕືອນແບບງຽບ"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"ການສົນທະນາ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ລຶບລ້າງການແຈ້ງເຕືອນແບບງຽບທັງໝົດ"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ຢຸດການແຈ້ງເຕືອນໂດຍໂໝດຫ້າມລົບກວນແລ້ວ"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ເລີ່ມດຽວນີ້"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"ປັບແຕ່ງ"</string>
<string name="notification_done" msgid="6215117625922713976">"ສຳເລັດແລ້ວ"</string>
<string name="inline_undo" msgid="9026953267645116526">"ຍົກເລີກ"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"ການຄວບຄຸມການແຈ້ງເຕືອນ"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"ຕົວເລືອກການເລື່ອນການແຈ້ງເຕືອນ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 49d678bbc238..c6b50d92e3ed 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -395,6 +395,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"ALR"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"ALR išjungtas"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"ALR įjungtas"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ekrano įrašas"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Pradėti"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stabdyti"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Perbraukite aukštyn, kad perjungtumėte programas"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Vilkite į dešinę, kad greitai perjungtumėte programas"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Perjungti apžvalgą"</string>
@@ -477,6 +480,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Viską išvalyti"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Tvarkyti"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Tylieji pranešimai"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Pokalbiai"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Išvalyti visus tylius pranešimus"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pranešimai pristabdyti naudojant netrukdymo režimą"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Pradėti dabar"</string>
@@ -695,6 +699,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Tinkinti"</string>
<string name="notification_done" msgid="6215117625922713976">"Atlikta"</string>
<string name="inline_undo" msgid="9026953267645116526">"Anuliuoti"</string>
+ <string name="demote" msgid="6225813324237153980">"Žymėti šį pranešimą kaip ne pokalbį"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Mėgstamiausi"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Pašalinti iš mėgstamiausių"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Nutildyti"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Rodyti"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Rodyti kaip debesėlį"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Išjungti debesėlius"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Pridėti prie pagrindinio ekrano"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"pranešimų valdikliai"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"pranešimų snaudimo parinktys"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 197319261ec1..b519f053b1ce 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -393,6 +393,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ir atspējoti"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ir iespējoti"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Velciet augšup, lai pārslēgtu lietotnes"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Lai ātri pārslēgtu lietotnes, velciet pa labi"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Pārskata pārslēgšana"</string>
@@ -468,13 +474,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Izslēgt akumulatora jaudas taupīšanas režīmu"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> iegūs piekļuvi visai informācijai, kas ierakstīšanas vai apraides laikā tiks rādīta jūsu ekrānā vai atskaņota jūsu ierīcē. Atļauja attiecas uz tādu informāciju kā paroles, maksājumu informācija, fotoattēli, ziņojumi un jūsu atskaņotais audio saturs."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Pakalpojums, kas nodrošina šo funkciju, iegūs piekļuvi visai informācijai, kas ierakstīšanas vai apraides laikā tiks rādīta jūsu ekrānā vai atskaņota jūsu ierīcē. Atļauja attiecas uz tādu informāciju kā paroles, maksājumu informācija, fotoattēli, ziņojumi un jūsu atskaņotais audio saturs."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Vai vēlaties sākt ierakstīšanu/apraidi?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Vai vēlaties sākt ierakstīšanu vai apraidi, izmantojot lietotni <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Vairs nerādīt"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Dzēst visu"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Pārvaldīt"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Klusie paziņojumi"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Sarunas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Notīrīt visus klusos paziņojumus"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Sākt tūlīt"</string>
@@ -693,6 +699,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Pielāgot"</string>
<string name="notification_done" msgid="6215117625922713976">"Gatavs"</string>
<string name="inline_undo" msgid="9026953267645116526">"Atsaukt"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"paziņojumu vadīklas"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"paziņojumu atlikšanas opcijas"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 0294a1f7adba..9080b576d4a9 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC е оневозможено"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC е овозможено"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Снимање екран"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Започни"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Сопри"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Повлечете нагоре за да се префрлите од една на друга апликација"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Повлечете надесно за брзо префрлање меѓу апликациите"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Вклучи/исклучи преглед"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Избриши сѐ"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Управувајте"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Тивки известувања"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Исчисти ги сите тивки известувања"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известувањата се паузирани од „Не вознемирувај“"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Започни сега"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Приспособете"</string>
<string name="notification_done" msgid="6215117625922713976">"Готово"</string>
<string name="inline_undo" msgid="9026953267645116526">"Врати"</string>
+ <string name="demote" msgid="6225813324237153980">"Означи го известувањево како „не е разговор“"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Омилен"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Неомилен"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Исклучи звук"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Вклучи звук"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Прикажи како балонче"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Исклучи балончиња"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Додај на почетниот екран"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"контроли за известувањето"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"опции за одложување на известувањето"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index a8303139756c..b761c445297f 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC പ്രവർത്തനക്ഷമമാക്കി"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ആപ്പുകൾ മാറാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ആപ്പുകൾ പെട്ടെന്ന് മാറാൻ വലത്തോട്ട് വലിച്ചിടുക"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"അവലോകനം മാറ്റുക"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ബാറ്ററി ലാഭിക്കൽ ഓഫാക്കുക"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"റെക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്‌റ്റ് ചെയ്യുമ്പോഴോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്യുന്നതോ നിങ്ങളുടെ സ്‌ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആയ എല്ലാ വിവരങ്ങളിലേക്കും <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> എന്നതിന് ആക്‌സസ് ഉണ്ടായിരിക്കും. നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഒഡിയോ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, പേയ്‌മെന്റ് വിശദാംശങ്ങൾ, പാസ്‌വേഡുകൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"റെക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്‌റ്റ് ചെയ്യുമ്പോഴോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്യുന്നതോ നിങ്ങളുടെ സ്‌ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആയ എല്ലാ വിവരങ്ങളിലേക്കും ഈ ഫംഗ്‌ഷൻ ലഭ്യമാക്കുന്ന സേവനത്തിന് ആക്‌സസ് ഉണ്ടായിരിക്കും. നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഒഡിയോ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, പേയ്‌മെന്റ് വിശദാംശങ്ങൾ, പാസ്‌വേഡുകൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"റെക്കോർഡ് ചെയ്യൽ അല്ലെങ്കിൽ കാസ്റ്റ് ചെയ്യൽ ആരംഭിക്കണോ?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ഉപയോഗിച്ച് റെക്കോർഡ് ചെയ്യൽ അല്ലെങ്കിൽ കാസ്‌റ്റ് ചെയ്യൽ ആരംഭിക്കണോ?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"വീണ്ടും കാണിക്കരുത്"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"എല്ലാം മായ്‌ക്കുക"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"മാനേജ് ചെയ്യുക"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"നിശബ്‌ദ അറിയിപ്പുകൾ"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"സംഭാഷണങ്ങൾ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"എല്ലാ നിശബ്‌ദ അറിയിപ്പുകളും മായ്ക്കുക"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ശല്യപ്പെടുത്തരുത്\' വഴി അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തി"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ഇപ്പോൾ ആരംഭിക്കുക"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"ഇഷ്‌ടാനുസൃതമാക്കുക"</string>
<string name="notification_done" msgid="6215117625922713976">"പൂർത്തിയായി"</string>
<string name="inline_undo" msgid="9026953267645116526">"പഴയപടിയാക്കുക"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"അറിയിപ്പ് നിയന്ത്രണങ്ങൾ"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"അറിയിപ്പ് സ്‌നൂസ് ഓപ്ഷനുകൾ"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index e5497eab6d37..4f9b447bcd69 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC-г цуцалсан"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC-г идэвхжүүлсэн"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Апп сэлгэхийн тулд дээш шударна уу"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Аппуудыг хурдан сэлгэхийн тулд баруун тийш чирнэ үү"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Тоймыг унтраах/асаах"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Бүгдийг арилгах"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Удирдах"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Чимээгүй мэдэгдэл"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Харилцан яриа"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бүх чимээгүй мэдэгдлийг арилгах"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Бүү саад бол горимын түр зогсоосон мэдэгдэл"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Одоо эхлүүлэх"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Тохируулах"</string>
<string name="notification_done" msgid="6215117625922713976">"Дууссан"</string>
<string name="inline_undo" msgid="9026953267645116526">"Болих"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"мэдэгдлийн удирдлага"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"мэдэгдэл түр хойшлуулагчийн сонголт"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 3eb74b76ba44..99f48e6b4cb9 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC अक्षम केले आहे"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC सक्षम केले आहे"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"अ‍ॅप्स स्विच करण्यासाठी वर स्वाइप करा"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"अ‍ॅप्स वर झटपट स्विच करण्यासाठी उजवीकडे ड्रॅग करा"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"अवलोकन टॉगल करा."</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"बॅटरी सेव्हर बंद करा"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"तुमच्या स्क्रीनवर दृश्यमान असलेल्या किंवा रेकॉर्ड किंवा कास्ट करताना तुमच्या डिव्हाइसमधून प्ले केलेल्या सर्व माहितीचा अ‍ॅक्सेस <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ला असेल. यामध्ये पासवर्ड, पेमेंट तपशील, फोटो, मेसेज आणि तुम्ही प्ले केलेला ऑडिओ यासारख्या माहितीचा समावेश असतो."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"हे कार्य पुरवठा करणाऱ्या सेवेस तुमच्या स्क्रीनवर दृश्यमान असलेल्या किंवा रेकॉर्ड किंवा कास्ट करताना तुमच्या डिव्हाइसमधून प्ले केलेल्या सर्व माहितीचा अ‍ॅक्सेस असेल. यामध्ये पासवर्ड, पेमेंट तपशील, फोटो, मेसेज आणि तुम्ही प्ले केलेला ऑडिओ यासारख्या माहितीचा समावेश असतो."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"रेकॉर्ड किंवा कास्ट करणे सुरू करायचे आहे का ?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ने रेकॉर्ड करणे किंवा कास्ट करणे सुरू करा?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"पुन्हा दर्शवू नका"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"सर्व साफ करा"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"व्यवस्थापित करा"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"सायलंट सूचना"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"संभाषणे"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सर्व सायलंट सूचना साफ करा"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"व्यत्यय आणून नकाद्वारे सूचना थांबवल्या"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"आता सुरू करा"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"कस्टमाइझ करा"</string>
<string name="notification_done" msgid="6215117625922713976">"पूर्ण झाले"</string>
<string name="inline_undo" msgid="9026953267645116526">"पहिल्यासारखे करा"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"सूचना नियंत्रणे"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"सूचना स्नूझ पर्याय"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index b632bcdf4a57..42c51b7844a6 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC dilumpuhkan"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC didayakan"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Leret ke atas untuk menukar apl"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Seret ke kanan untuk beralih apl dengan pantas"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Togol Ikhtisar"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Kosongkan semua"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Urus"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Pemberitahuan senyap"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Perbualan"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kosongkan semua pemberitahuan senyap"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pemberitahuan dijeda oleh Jangan Ganggu"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Mulakan sekarang"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Sesuaikan"</string>
<string name="notification_done" msgid="6215117625922713976">"Selesai"</string>
<string name="inline_undo" msgid="9026953267645116526">"Buat asal"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kawalan pemberitahuan"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"pilihan tunda pemberitahuan"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 45893c1f22d6..dd5acfab0c21 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ကို ပိတ်ထားသည်"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ကို ဖွင့်ထားသည်"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"အက်ပ်များကို ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"အက်ပ်များကို ပြောင်းရန် ညာဘက်သို့ ဖိဆွဲပါ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ဖွင့်၊ ပိတ် အနှစ်ချုပ်"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ဘက်ထရီ အားထိန်းကို ပိတ်ရန်"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> သည် အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် သင့်မျက်နှာပြင်တွင် မြင်ရသော (သို့) သင့်စက်တွင် ဖွင့်ထားသော အချက်အလက်မှန်သမျှကို သုံးနိုင်ပါမည်။ ၎င်းတွင် စကားဝှက်များ၊ ငွေပေးချေမှုအသေးစိတ်များ၊ ဓာတ်ပုံများ၊ မက်ဆေ့ဂျ်များနှင့် သင်ဖွင့်သည့်အသံကဲ့သို့သော အချက်အလက်များ ပါဝင်သည်။"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"ဤလုပ်ဆောင်ချက်ကို ပေးအပ်သည့် ဝန်ဆောင်မှုသည် အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် သင့်မျက်နှာပြင်တွင် မြင်ရသော (သို့) သင့်စက်တွင် ဖွင့်ထားသော အချက်အလက်မှန်သမျှကို သုံးနိုင်ပါမည်။ ၎င်းတွင် စကားဝှက်များ၊ ငွေပေးချေမှုအသေးစိတ်များ၊ ဓာတ်ပုံများ၊ မက်ဆေ့ဂျ်များနှင့် သင်ဖွင့်သည့်အသံကဲ့သို့သော အချက်အလက်များ ပါဝင်သည်။"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ဖမ်းယူခြင်း သို့မဟုတ် ကာစ်လုပ်ခြင်း စတင်မလား။"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> နှင့် ဖမ်းယူခြင်း သို့မဟုတ် ကာစ်လုပ်ခြင်း စတင်မလား။"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"နောက်ထပ် မပြပါနှင့်"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"အားလုံး ဖယ်ရှားရန်"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"စီမံရန်"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"အကြောင်းကြားချက်များကို အသံတိတ်ခြင်း"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"စကားဝိုင်းများ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"အသံတိတ် အကြောင်းကြားချက်များအားလုံးကို ရှင်းလင်းရန်"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"အကြောင်းကြားချက်များကို \'မနှောင့်ယှက်ရ\' က ခေတ္တရပ်ထားသည်"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ယခု စတင်ပါ"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"စိတ်ကြိုက်ပြုလုပ်ရန်"</string>
<string name="notification_done" msgid="6215117625922713976">"ပြီးပါပြီ"</string>
<string name="inline_undo" msgid="9026953267645116526">"တစ်ဆင့်နောက်ပြန်ရန်"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"အကြောင်းကြားချက် ထိန်းချုပ်မှုများ"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"အကြောင်းကြားချက်များကို ဆိုင်းငံ့ရန် ရွေးချယ်စရာများ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index d07bd8e44824..97d6792ee6bb 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC er slått av"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC er slått på"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Sveip opp for å bytte apper"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Dra til høyre for å bytte apper raskt"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Slå oversikten av eller på"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Slå av batterisparing"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> får tilgang til all informasjon som er synlig på skjermen din, eller som spilles av fra enheten når du tar opp eller caster. Dette inkluderer informasjon som passord, betalingsopplysninger, bilder, meldinger og lyd du spiller av."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Tjenesten som leverer denne funksjonen, får tilgang til all informasjon som er synlig på skjermen din, eller som spilles av fra enheten når du tar opp eller caster. Dette inkluderer informasjon som passord, betalingsopplysninger, bilder, meldinger og lyd du spiller av."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Vil du starte opptak eller casting?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Vil du starte opptak eller casting med <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Ikke vis igjen"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Fjern alt"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Administrer"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Lydløse varsler"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Fjern alle lydløse varsler"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Varsler er satt på pause av «Ikke forstyrr»"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start nå"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Tilpass"</string>
<string name="notification_done" msgid="6215117625922713976">"Ferdig"</string>
<string name="inline_undo" msgid="9026953267645116526">"Angre"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"varselinnstillinger"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"slumrealternativer for varsler"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index ba6b0ed3e374..1345b098f06e 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC लाई असक्षम पारिएको छ"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC लाई सक्षम पारिएको छ"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"अनुप्रयोगहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"अनुप्रयोगहरू बदल्न द्रुत गतिमा दायाँतिर ड्र्याग गर्नुहोस्"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"परिदृश्य टगल गर्नुहोस्"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"सबै हटाउनुहोस्"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"व्यवस्थित गर्नुहोस्"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"मौन सूचनाहरू"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"वार्तालापहरू"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सबै मौन सूचनाहरू हटाउनुहोस्"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"अहिले सुरु गर्नुहोस्"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"आफू अनुकूल पार्नुहोस्"</string>
<string name="notification_done" msgid="6215117625922713976">"सम्पन्‍न भयो"</string>
<string name="inline_undo" msgid="9026953267645116526">"अन्डू गर्नुहोस्"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"सूचना सम्बन्धी नियन्त्रणहरू"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"सूचना स्नुज गर्ने विकल्पहरू"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 638fcad69320..71d2388264fb 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is uitgeschakeld"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is ingeschakeld"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Schermopname"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Starten"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stoppen"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Veeg omhoog om te schakelen tussen apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Sleep naar rechts om snel tussen apps te schakelen"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Overzicht in-/uitschakelen"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Alles wissen"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Beheren"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Stille meldingen"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekken"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle stille meldingen wissen"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Meldingen onderbroken door \'Niet storen\'"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Nu starten"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Aanpassen"</string>
<string name="notification_done" msgid="6215117625922713976">"Gereed"</string>
<string name="inline_undo" msgid="9026953267645116526">"Ongedaan maken"</string>
+ <string name="demote" msgid="6225813324237153980">"Deze melding markeren als geen gesprek"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Markeren als favoriet"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Favoriet verwijderen"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Negeren"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Negeren opheffen"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Weergeven als ballon"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Ballonnen uitschakelen"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Toevoegen aan startscherm"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"beheeropties voor meldingen"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"snooze-opties voor meldingen"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 7586be567fde..85841feeff14 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ସକ୍ଷମ କରାଯାଇଛି"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ଆପ୍‌କୁ ବଦଳ କରିବା ପାଇଁ ସ୍ଵାଇପ୍ କରନ୍ତୁ"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ଆପ୍‌ଗୁଡ଼ିକ ମଧ୍ୟରେ ଶୀଘ୍ର ବଦଳ କରିବା ପାଇଁ ଡାହାଣକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀକୁ ଟୋଗଲ୍ କରନ୍ତୁ"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅଫ୍‍ କରନ୍ତୁ"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ରେ ସମସ୍ତ ସୂଚନାକୁ ଆକ୍ସେସ୍ ରହିବ ଯାହା ଆପଣଙ୍କର ସ୍କ୍ରିନ୍‌ରେ ଦେଖାଯିବ ବା ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ବେଳେ ଆପଣଙ୍କର ଡିଭାଇସ୍ ଠାରୁ ଚାଲିବ। ପାସ୍‌ୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ଫଟୋ, ମେସେଜ୍ ଏବଂ ଆପଣ ଚଲାଉଥିବା ଅଡିଓ ପରି ସୂଚନା ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"ଏହି ପ୍ରକାର୍ଯ୍ୟ ପ୍ରଦାନ କରୁଥିବା ସେବା ସମସ୍ତ ସୂଚନାକୁ ଆକ୍ସେସ୍ ରହିବ ଯାହା ସ୍କ୍ରିନ୍‌ରେ ଦେଖାଯିବ ବା ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ବେଳେ ଆପଣଙ୍କର ଡିଭାଇସ୍ ଠାରୁ ଚାଲିବ। ପାସ୍‌ୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ଫଟୋ, ମେସେଜ୍ ଏବଂ ଆପଣ ଚଲାଉଥିବା ଅଡିଓ ପରି ସୂଚନା ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ଆରମ୍ଭ କରିବେ?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ସହ ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ଆରମ୍ଭ କରିବେ?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ସମସ୍ତ ଖାଲି କରନ୍ତୁ"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"ପରିଚାଳନା କରନ୍ତୁ"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ସମସ୍ତ ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଖାଲି କରନ୍ତୁ"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତି ପଜ୍‍ ହୋଇଛି"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"କଷ୍ଟମାଇଜ୍‌ କରନ୍ତୁ"</string>
<string name="notification_done" msgid="6215117625922713976">"ହୋଇଗଲା"</string>
<string name="inline_undo" msgid="9026953267645116526">"ପୂର୍ବସ୍ଥାନକୁ ଫେରାଇଆଣନ୍ତୁ"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"ବିଜ୍ଞପ୍ତି ନିୟନ୍ତ୍ରଣ"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"ବିଜ୍ଞପ୍ତି ସ୍ନୁଜ୍‍ ବିକଳ୍ପ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 6e1f23060614..4ea51ddbde9e 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ਐਪਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ਐਪਾਂ ਵਿਚਾਲੇ ਤੇਜ਼ੀ ਨਾਲ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਘਸੀਟੋ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ਰੂਪ-ਰੇਖਾ ਨੂੰ ਟੌਗਲ ਕਰੋ"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਕਰੋ"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਕੋਲ ਬਾਕੀ ਸਾਰੀ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ ਜੋ ਕਿ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਣਯੋਗ ਹੈ ਜਾਂ ਰਿਕਾਰਡਿੰਗ ਜਾਂ ਕਾਸਟ ਕਰਨ ਵੇਲੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਜਾਂਦੀ ਹੈ। ਇਸ ਵਿੱਚ ਪਾਸਵਰਡ, ਭੁਗਤਾਨ ਵੇਰਵੇ, ਫ਼ੋਟੋਆਂ, ਸੁਨੇਹੇ ਅਤੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਚਲਾਏ ਆਡੀਓ ਦੀ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ।"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"ਇਸ ਫੰਕਸ਼ਨ ਦੇ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਕੋਲ ਬਾਕੀ ਸਾਰੀ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ ਜੋ ਕਿ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਣਯੋਗ ਹੁੰਦੀ ਹੈ ਜਾਂ ਰਿਕਾਰਡਿੰਗ ਜਾਂ ਕਾਸਟ ਕਰਨ ਵੇਲੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਜਾਂਦੀ ਹੈ। ਇਸ ਵਿੱਚ ਪਾਸਵਰਡ, ਭੁਗਤਾਨ ਵੇਰਵੇ, ਫ਼ੋਟੋਆਂ, ਸੁਨੇਹੇ ਅਤੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਚਲਾਏ ਆਡੀਓ ਦੀ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ।"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ਕੀ ਰਿਕਾਰਡਿੰਗ ਜਾਂ ਕਾਸਟ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰਨਾ ਹੈ?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਨਾਲ ਰਿਕਾਰਡਿੰਗ ਜਾਂ ਕਾਸਟ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰਨਾ ਹੈ?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"ਸ਼ਾਂਤ ਸੂਚਨਾਵਾਂ"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"ਗੱਲਾਂਬਾਤਾਂ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ਸਾਰੀਆਂ ਖਾਮੋਸ਼ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ਹੁਣ ਚਾਲੂ ਕਰੋ"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"ਵਿਉਂਤਬੱਧ ਕਰੋ"</string>
<string name="notification_done" msgid="6215117625922713976">"ਹੋ ਗਿਆ"</string>
<string name="inline_undo" msgid="9026953267645116526">"ਅਣਕੀਤਾ ਕਰੋ"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"ਸੂਚਨਾ ਕੰਟਰੋਲ"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"ਸੂਚਨਾ ਸਨੂਜ਼ ਵਿਕਲਪ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 307d4172c849..515d659d2c5b 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -395,6 +395,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"Komunikacja NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Komunikacja NFC jest wyłączona"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Komunikacja NFC jest włączona"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Przesuń w górę, by przełączyć aplikacje"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Szybko przeciągnij w prawo, by przełączyć aplikacje"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Przełącz Przegląd"</string>
@@ -477,6 +483,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Usuń wszystkie"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Zarządzaj"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Ciche powiadomienia"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Rozmowy"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Usuń wszystkie ciche powiadomienia"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Powiadomienia wstrzymane przez tryb Nie przeszkadzać"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Rozpocznij teraz"</string>
@@ -695,6 +702,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Dostosuj"</string>
<string name="notification_done" msgid="6215117625922713976">"Gotowe"</string>
<string name="inline_undo" msgid="9026953267645116526">"Cofnij"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"sterowanie powiadomieniami"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opcje odkładania powiadomień"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index c1dd243ab4a0..d486b9b2a7ed 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"A NFC está desativada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"A NFC está ativada"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravação de tela"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Parar"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Deslize para cima para alternar entre os apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arraste para a direita para alternar rapidamente entre os apps"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Alternar Visão geral"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Limpar tudo"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gerenciar"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificações silenciosas"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizar"</string>
<string name="notification_done" msgid="6215117625922713976">"Concluído"</string>
<string name="inline_undo" msgid="9026953267645116526">"Desfazer"</string>
+ <string name="demote" msgid="6225813324237153980">"Marcar esta notificação como não sendo uma conversa"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Adicionar como favorito"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Remover dos favoritos"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Desativar som"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Ativar som"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Mostrar como balão"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Desativar balões"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Adicionar à tela inicial"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"controles de notificação"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opções de adiamento de notificação"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 9a5a4b3f4ebd..d17b0026802f 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"O NFC está desativado"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"O NFC está ativado"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravação de ecrã"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Parar"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Deslizar rapidamente para cima para mudar de aplicação"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arraste para a direita para mudar rapidamente de aplicação."</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Ativar/desativar Vista geral"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Limpar tudo"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gerir"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificações silenciosas"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Limpar todas as notificações silenciosas"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações colocadas em pausa pelo modo Não incomodar."</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Começar agora"</string>
@@ -557,7 +561,7 @@
<string name="screen_pinning_toast" msgid="2083944237147005811">"Para soltar este ecrã, toque sem soltar nos botões Anterior e Vista geral."</string>
<string name="screen_pinning_toast_recents_invisible" msgid="6343770487795352573">"Para soltar este ecrã, toque sem soltar nos botões Anterior e Página inicial."</string>
<string name="screen_pinning_toast_gesture_nav" msgid="2884536903398445645">"Para soltar este ecrã, deslize rapidamente para cima sem soltar."</string>
- <string name="screen_pinning_positive" msgid="3285785989665266984">"Compreendi"</string>
+ <string name="screen_pinning_positive" msgid="3285785989665266984">"OK"</string>
<string name="screen_pinning_negative" msgid="6882816864569211666">"Não, obrigado"</string>
<string name="screen_pinning_start" msgid="5695091877402422575">"Ecrã fixo"</string>
<string name="screen_pinning_exit" msgid="5114993350662745840">"Ecrã solto"</string>
@@ -621,7 +625,7 @@
<string name="tuner_warning_title" msgid="7721976098452135267">"Diversão para alguns, mas não para todos"</string>
<string name="tuner_warning" msgid="1861736288458481650">"O Sintonizador da interface do sistema disponibiliza-lhe formas adicionais ajustar e personalizar a interface do utilizador do Android. Estas funcionalidades experimentais podem ser alteradas, deixar de funcionar ou desaparecer em versões futuras. Prossiga com cuidado."</string>
<string name="tuner_persistent_warning" msgid="230466285569307806">"Estas funcionalidades experimentais podem ser alteradas, deixar de funcionar ou desaparecer em versões futuras. Prossiga com cuidado."</string>
- <string name="got_it" msgid="477119182261892069">"Compreendi"</string>
+ <string name="got_it" msgid="477119182261892069">"OK"</string>
<string name="tuner_toast" msgid="3812684836514766951">"Parabéns! O Sintonizador da interface do sistema foi adicionado às Definições"</string>
<string name="remove_from_settings" msgid="633775561782209994">"Remover das Definições"</string>
<string name="remove_from_settings_prompt" msgid="551565437265615426">"Pretende remover o Sintonizador da interface do sistema das Definições e deixar de utilizar todas as respetivas funcionalidades?"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizar"</string>
<string name="notification_done" msgid="6215117625922713976">"Concluído"</string>
<string name="inline_undo" msgid="9026953267645116526">"Anular"</string>
+ <string name="demote" msgid="6225813324237153980">"Marcar esta notificação como não sendo uma conversa"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Adicionar aos favoritos"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Remover dos favoritos"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Ignorar"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Ativar"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Mostrar como balão"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Desativar balões"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Adicionar ao ecrã principal"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"controlos de notificação"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opções de suspensão de notificações"</string>
@@ -921,7 +933,7 @@
<string name="auto_saver_enabled_title" msgid="4294726198280286333">"Poupança de bateria agendada ativada"</string>
<string name="auto_saver_enabled_text" msgid="7889491183116752719">"A Poupança de bateria é ativada automaticamente quando o nível de bateria está abaixo de <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
<string name="open_saver_setting_action" msgid="2111461909782935190">"Definições"</string>
- <string name="auto_saver_okay_action" msgid="7815925750741935386">"Compreendi"</string>
+ <string name="auto_saver_okay_action" msgid="7815925750741935386">"OK"</string>
<string name="heap_dump_tile_name" msgid="2464189856478823046">"Despejar pilha SysUI"</string>
<string name="sensor_privacy_mode" msgid="4462866919026513692">"Sensores desativados"</string>
<string name="device_services" msgid="1549944177856658705">"Serviços do dispositivo"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index c1dd243ab4a0..d486b9b2a7ed 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"A NFC está desativada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"A NFC está ativada"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravação de tela"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Parar"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Deslize para cima para alternar entre os apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arraste para a direita para alternar rapidamente entre os apps"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Alternar Visão geral"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Limpar tudo"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gerenciar"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificações silenciosas"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizar"</string>
<string name="notification_done" msgid="6215117625922713976">"Concluído"</string>
<string name="inline_undo" msgid="9026953267645116526">"Desfazer"</string>
+ <string name="demote" msgid="6225813324237153980">"Marcar esta notificação como não sendo uma conversa"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Adicionar como favorito"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Remover dos favoritos"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Desativar som"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Ativar som"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Mostrar como balão"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Desativar balões"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Adicionar à tela inicial"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"controles de notificação"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opções de adiamento de notificação"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 63c2c0a54da9..2674504db62e 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -393,6 +393,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Serviciul NFC este dezactivat"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Serviciul NFC este activat"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Glisați în sus pentru a comuta între aplicații"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Glisați la dreapta pentru a comuta rapid între aplicații"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Comutați secțiunea Recente"</string>
@@ -468,13 +474,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Dezactivați economisirea bateriei"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Începeți să înregistrați sau să proiectați?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Începeți să înregistrați sau să proiectați cu <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Nu se mai afișează"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Ștergeți toate notificările"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Gestionați"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificări silențioase"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversații"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ștergeți toate notificările silențioase"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificări întrerupte prin „Nu deranja”"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Începeți acum"</string>
@@ -693,6 +699,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizați"</string>
<string name="notification_done" msgid="6215117625922713976">"Terminat"</string>
<string name="inline_undo" msgid="9026953267645116526">"Anulați"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"comenzile notificării"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opțiuni de amânare a notificării"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 2da136fa7a8a..915698972541 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -395,6 +395,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"Модуль NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Модуль NFC отключен"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Модуль NFC включен"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Чтобы переключиться между приложениями, проведите по экрану вверх."</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Перетащите вправо, чтобы быстро переключиться между приложениями"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Переключить режим обзора"</string>
@@ -471,13 +477,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Отключить режим энергосбережения"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Во время записи или трансляции у приложения \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" будет доступ ко всей информации, которая видна на экране или воспроизводится с устройства, в том числе к паролям, сведениям о платежах, фотографиям, сообщениям и прослушиваемым аудиозаписям."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Во время записи или трансляции у сервиса, предоставляющего эту функцию, будет доступ ко всей информации, которая видна на экране или воспроизводится с устройства, в том числе к паролям, сведениям о платежах, фотографиям, сообщениям и прослушиваемым аудиозаписям."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Начать запись или трансляцию?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Начать запись или трансляцию через приложение \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\"?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Больше не показывать"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Очистить все"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Настроить"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучные уведомления"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Чаты"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Отклонить все беззвучные уведомления"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"В режиме \"Не беспокоить\" уведомления заблокированы"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Начать"</string>
@@ -696,6 +702,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Настроить"</string>
<string name="notification_done" msgid="6215117625922713976">"Готово"</string>
<string name="inline_undo" msgid="9026953267645116526">"Отменить"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g>: <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"настройки уведомлений"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"параметры отсрочки уведомлений"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 94a744842e19..84e01d093f3d 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC අබලයි"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC සබලයි"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"යෙදුම් මාරු කිරීමට ස්වයිප් කරන්න"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ඉක්මනින් යෙදුම් මාරු කිරීමට දකුණට අදින්න"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"දළ විශ්ලේෂණය ටොගල කරන්න"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"බැටරි සුරැකුම ක්‍රියාවිරහිත කරන්න"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ට පටිගත කරන හෝ විකාශ කරන අතරතුර ඔබේ තිරයේ දිස් වන හෝ ඔබේ උපාංගයෙන් වාදනය කරන සියලු තොරතුරු වෙත ප්‍රවේශ ලැබෙනු ඇත. මෙහි මුරපද, ගෙවීම් විස්තර, ඡායාරූප, පණිවිඩ සහ ඔබ වාදනය කරන ඕඩියෝ යනාදි තොරතුරු ඇතුළත් වේ."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"මෙම ශ්‍රිතය සපයන සේවාවට පටිගත කරන හෝ විකාශ කරන අතරතුර ඔබේ තිරයේ දිස් වන හෝ ඔබේ උපාංගයෙන් වාදනය කරන සියලු තොරතුරු වෙත ප්‍රවේශය ලැබෙනු ඇත. මෙහි මුරපද, ගෙවීම් විස්තර, ඡායාරූප, පණිවිඩ සහ ඔබ වාදනය කරන ඕඩියෝ යනාදි තොරතුරු ඇතුළත් වේ."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"පටිගත කිරීම හෝ විකාශය කිරීම ආරම්භ කරන්නද?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> සමග පටිගත කිරීම හෝ විකාශය කිරීම ආරම්භ කරන්නද?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"නැවත නොපෙන්වන්න"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"සියල්ල හිස් කරන්න"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"කළමනාකරණය කරන්න"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"නිහඬ දැනුම්දීම්"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"සංවාද"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"සියලු නිහඬ දැනුම්දීම් හිස් කරන්න"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"බාධා නොකරන්න මගින් විරාම කරන ලද දැනුම්දීම්"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"දැන් අරඹන්න"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"අභිරුචිකරණය"</string>
<string name="notification_done" msgid="6215117625922713976">"නිමයි"</string>
<string name="inline_undo" msgid="9026953267645116526">"පසුගමනය කරන්න"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"දැනුම්දීම් පාලන"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"දැනුම්දීම් මදක් නතර කිරීමේ විකල්ප"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index c38c855e73dc..fced8a42acf4 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -395,6 +395,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je deaktivované"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je aktivované"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Záznam obrazovky"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Začať"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ukončiť"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Potiahnutím nahor prepnete aplikácie"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Presunutím doprava rýchlo prepnete aplikácie"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Prepnúť prehľad"</string>
@@ -477,6 +480,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Vymazať všetko"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Spravovať"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Tiché upozornenia"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzácie"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazať všetky tiché upozornenia"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Upozornenia sú pozastavené režimom bez vyrušení"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Spustiť"</string>
@@ -695,6 +699,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Prispôsobiť"</string>
<string name="notification_done" msgid="6215117625922713976">"Hotovo"</string>
<string name="inline_undo" msgid="9026953267645116526">"Späť"</string>
+ <string name="demote" msgid="6225813324237153980">"Označiť, že toto upozornenie nie je konverzácia"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Obľúbená"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Odstrániť z obľúbených"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Vypnúť zvuk"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Zapnúť zvuk"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Zobraziť ako bublinu"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Vypnúť bubliny"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Pridať na plochu"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"ovládacie prvky pre upozornenia"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"možnosti stlmenia upozornení"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 2c8893e1ed60..4816a6634dd7 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -395,6 +395,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Tehnologija NFC je onemogočena"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Tehnologija NFC je omogočena"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Za preklop aplikacij povlecite navzgor"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Povlecite v desno za hiter preklop med aplikacijami"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Vklop/izklop pregleda"</string>
@@ -471,13 +477,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Izklop varčevanja z energijo akumulatorja"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bo imela dostop do vseh podatkov, ki so med snemanjem ali predvajanjem prikazani na vašem zaslonu ali se predvajajo iz vaše naprave. To vključuje podatke, kot so gesla, podrobnosti o plačilu, fotografije, sporočila in zvok, ki ga predvajate."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Storitev, ki zagotavlja to funkcijo, bo imela dostop do vseh podatkov, ki so med snemanjem ali predvajanjem prikazani na vašem zaslonu ali se predvajajo iz vaše naprave. To vključuje podatke, kot so gesla, podrobnosti o plačilu, fotografije, sporočila in zvok, ki ga predvajate."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Želite začeti snemati ali predvajati?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Želite začeti snemati ali predvajati z aplikacijo <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Tega ne prikaži več"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Izbriši vse"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Upravljanje"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Tiha obvestila"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Pogovori"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Brisanje vseh tihih obvestil"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Začni zdaj"</string>
@@ -696,6 +702,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Prilagodi"</string>
<string name="notification_done" msgid="6215117625922713976">"Dokončano"</string>
<string name="inline_undo" msgid="9026953267645116526">"Razveljavi"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kontrolniki obvestil"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"možnosti preložitve obvestil"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 445f8ca49cd5..14d72b4e1675 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC është çaktivizuar"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC është aktivizuar"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Rrëshqit shpejt lart për të ndërruar aplikacionet"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Zvarrit djathtas për të ndërruar aplikacionet me shpejtësi"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Kalo te përmbledhja"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Pastroji të gjitha"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Menaxho"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Njoftimet në heshtje"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Bisedat"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Pastro të gjitha njoftimet në heshtje"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Njoftimet janë vendosur në pauzë nga modaliteti \"Mos shqetëso\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Fillo tani"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Personalizo"</string>
<string name="notification_done" msgid="6215117625922713976">"U krye"</string>
<string name="inline_undo" msgid="9026953267645116526">"Zhbëj"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"kontrollet e njoftimit"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"opsionet e shtyrjes së njoftimit"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index acff2692608e..29e7e1044d61 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -393,6 +393,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC је онемогућен"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC је омогућен"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Снимак екрана"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Почните"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Зауставите"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Превуците нагоре да бисте мењали апликације"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Превуците удесно да бисте брзо променили апликације"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Укључи/искључи преглед"</string>
@@ -474,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Обриши све"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Управљајте"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Нечујна обавештења"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Конверзације"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Обришите сва нечујна обавештења"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Обавештења су паузирана режимом Не узнемиравај"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Започни одмах"</string>
@@ -692,6 +696,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Прилагоди"</string>
<string name="notification_done" msgid="6215117625922713976">"Готово"</string>
<string name="inline_undo" msgid="9026953267645116526">"Опозови"</string>
+ <string name="demote" msgid="6225813324237153980">"Означи да ово обавештење није конверзација"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Означи као омиљено"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Уклони из омиљених"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Искључи звук"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Укључи звук"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Прикажи као облачић"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Искључи облачиће"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Додај на почетни екран"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"контроле обавештења"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"опције за одлагање обавештења"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index d63206a31416..b0d78779daad 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC är inaktiverat"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC är aktiverat"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Skärminspelning"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Starta"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stoppa"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Byt appar genom att svepa uppåt"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Tryck och dra åt höger för att snabbt byta mellan appar"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Aktivera och inaktivera översikten"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Rensa alla"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Hantera"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Ljudlösa aviseringar"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Konversationer"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Rensa alla ljudlösa aviseringar"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Aviseringar har pausats via Stör ej"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Starta nu"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Anpassa"</string>
<string name="notification_done" msgid="6215117625922713976">"Klar"</string>
<string name="inline_undo" msgid="9026953267645116526">"Ångra"</string>
+ <string name="demote" msgid="6225813324237153980">"Markera aviseringen som icke-konversation"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Favorit"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Ta bort från favoriter"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Dölj"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Visa"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Visa som bubbla"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Inaktivera bubblor"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Lägg till på startskärmen"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"inställningar för aviseringar"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"alternativ för att snooza aviseringar"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 9f319a68c474..ecaefb0c0e4e 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC imezimwa"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC imewashwa"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Telezesha kidole juu ili ubadilishe programu"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Buruta kulia ili ubadilishe programu haraka"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Washa Muhtasari"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Zima Kiokoa Betri"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> itaweza kufikia maelezo yote yanayoonekana kwenye skrini yako au yanayochezwa kwenye kifaa chako wakati wa kurekodi au kutuma. Hii ni pamoja na maelezo kama vile manenosiri, maelezo ya malipo, picha, ujumbe na sauti unayocheza."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Huduma inayotoa utendaji huu itaweza kufikia maelezo yote yanayoonekana kwenye skrini yako au yanayochezwa kwenye kifaa chako wakati wa kurekodi au kutuma. Hii ni pamoja na maelezo kama vile manenosiri, maelezo ya malipo, picha, ujumbe na sauti unayocheza."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Ungependa kuanza kurekodi au kutuma?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Ungependa kuanza kurekodi au kutuma ukitumia <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Usionyeshe tena"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Futa zote"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Dhibiti"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Arifa zisizo na sauti"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Mazungumzo"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Futa arifa zote zisizo na sauti"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kipengele cha Usinisumbue kimesitisha arifa"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Anza sasa"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Weka mapendeleo"</string>
<string name="notification_done" msgid="6215117625922713976">"Nimemaliza"</string>
<string name="inline_undo" msgid="9026953267645116526">"Tendua"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"vidhibiti vya arifa"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"chaguo za kuahirisha arifa"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index d4c3c05a7007..0bea7d6305d6 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC முடக்கப்பட்டது"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC இயக்கப்பட்டது"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, மேல்நோக்கி ஸ்வைப் செய்க"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ஆப்ஸை வேகமாக மாற்ற, வலப்புறம் இழுக்கவும்"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"மேலோட்டப் பார்வையை நிலைமாற்று"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"பேட்டரி சேமிப்பானை ஆஃப் செய்"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> உங்கள் திரையில் தெரியும் தகவல்கள், ரெக்கார்டு செய்யும்போதோ அனுப்பும்போதோ உங்கள் சாதனத்திலிருந்து பிளே ஆகும் அனைத்து தகவல்கள் ஆகியவற்றுக்கான அணுகலைக் கொண்டிருக்கும். கடவுச்சொற்கள், பேமெண்ட் தொடர்பான தகவல்கள், படங்கள், மெசேஜ்கள், நீங்கள் பிளே செய்யும் ஆடியோ போன்ற அனைத்துத் தகவல்களும் இதில் அடங்கும்."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"இந்தச் செயல்பாட்டை வழங்கும் சேவையானது உங்கள் திரையில் தெரியும் தகவல்கள், ரெக்கார்டு செய்யும்போதோ அனுப்பும்போதோ உங்கள் சாதனத்திலிருந்து பிளே ஆகும் அனைத்துத் தகவல்கள் ஆகியவற்றுக்கான அணுகலைக் கொண்டிருக்கும். கடவுச்சொற்கள், பேமெண்ட் தொடர்பான தகவல்கள், படங்கள், மெசேஜ்கள், நீங்கள் பிளே செய்யும் ஆடியோ போன்ற அனைத்துத் தகவல்களும் இதில் அடங்கும்."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ரெக்கார்டிங் செய்யவோ அனுப்புவதற்கோ தொடங்கிவிட்டீர்களா?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> மூலம் ரெக்கார்டிங் செய்யவோ அனுப்புவதற்கோ தொடங்கிவீட்டீர்களா?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"மீண்டும் காட்டாதே"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"எல்லாவற்றையும் அழி"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"அறிவிப்புகளை நிர்வகி"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"ஒலியில்லாத அறிவிப்புகள்"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"உரையாடல்கள்"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ஒலியில்லாத அழைப்புகள் அனைத்தையும் அழிக்கும்"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தின் மூலம் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"இப்போது தொடங்கு"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"தனிப்பயனாக்கு"</string>
<string name="notification_done" msgid="6215117625922713976">"முடிந்தது"</string>
<string name="inline_undo" msgid="9026953267645116526">"செயல்தவிர்"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"அறிவிப்புக் கட்டுப்பாடுகள்"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"அறிவிப்பை உறக்கநிலையாக்கும் விருப்பங்கள்"</string>
@@ -946,10 +968,7 @@
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"சிஸ்டம் நேவிகேஷன் மாற்றப்பட்டது. மாற்றங்களைச் செய்ய ‘அமைப்புகளுக்குச்’ செல்லவும்."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"சிஸ்டம் நேவிகேஷனை மாற்ற ’அமைப்புகளுக்குச்’ செல்லவும்"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"இயக்க நேரம்"</string>
- <!-- no translation found for magnification_overlay_title (6584179429612427958) -->
- <skip />
- <!-- no translation found for magnification_window_title (4863914360847258333) -->
- <skip />
- <!-- no translation found for magnification_controls_title (8421106606708891519) -->
- <skip />
+ <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification Overlay Window"</string>
+ <string name="magnification_window_title" msgid="4863914360847258333">"பெரிதாக்கல் சாளரம்"</string>
+ <string name="magnification_controls_title" msgid="8421106606708891519">"பெரிதாக்கல் சாளரக் கட்டுப்பாடுகள்"</string>
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 1baf89c5f0d5..bb624902beb0 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC నిలిపివేయబడింది"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ప్రారంభించబడింది"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"యాప్‌లను మార్చడం కోసం ఎగువకు స్వైప్ చేయండి"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి కుడి వైపుకు లాగండి"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"స్థూలదృష్టిని టోగుల్ చేయి"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"బ్యాటరీ సేవర్‌ను ఆఫ్ చేయండి"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"రికార్డ్ చేస్తున్నప్పుడు లేదా ప్రసారం చేస్తున్నప్పుడు, మీ స్క్రీన్‌పై ప్రదర్శించబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన సమాచారం మొత్తాన్ని, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> యాక్సెస్ చేయగలుగుతుంది. ఈ సమాచారంలో, పాస్‌వర్డ్‌లు, చెల్లింపు వివరాలు, ఫోటోలు, సందేశాలు, మీరు ప్లే చేసే ఆడియో వంటివి ఉంటాయి."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"రికార్డ్ చేస్తున్నప్పుడు లేదా ప్రసారం చేస్తున్నప్పుడు మీ స్క్రీన్‌పై ప్రదర్శించబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన సమాచారం మొత్తాన్ని, ఈ ఫంక్షన్‌ను అందిస్తున్న సర్వీసు యాక్సెస్ చేయగలదు. ఈ సమాచారంలో, పాస్‌వర్డ్‌లు, చెల్లింపు వివరాలు, ఫోటోలు, సందేశాలు, మీరు ప్లే చేసే ఆడియో వంటివి ఉంటాయి."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"రికార్డ్ చేయడం లేదా ప్రసారం చేయడం ప్రారంభించాలా?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>తో రికార్డ్ చేయడం లేదా ప్రసారం చేయడం ప్రారంభించాలా?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"మళ్లీ చూపవద్దు"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"అన్నీ క్లియర్ చేయండి"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"నిర్వహించండి"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"నిశ్శబ్ద నోటిఫికేషన్‌లు"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"సంభాషణలు"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"అన్ని నిశ్శబ్ద నోటిఫికేషన్‌లను క్లియర్ చేస్తుంది"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"అంతరాయం కలిగించవద్దు ద్వారా నోటిఫికేషన్‌లు పాజ్ చేయబడ్డాయి"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ఇప్పుడే ప్రారంభించు"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"అనుకూలపరచండి"</string>
<string name="notification_done" msgid="6215117625922713976">"పూర్తయింది"</string>
<string name="inline_undo" msgid="9026953267645116526">"చర్యరద్దు చేయి"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"నోటిఫికేషన్ నియంత్రణలు"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"నోటిఫికేషన్ తాత్కాలిక ఆపివేత ఎంపికలు"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 569b05c8dedb..54c3d7335728 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ถูกปิดใช้งาน"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"เปิดใช้งาน NFC แล้ว"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"เลื่อนขึ้นเพื่อสลับแอป"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ลากไปทางขวาเพื่อสลับแอปอย่างรวดเร็ว"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"สลับภาพรวม"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ปิดโหมดประหยัดแบตเตอรี่"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> จะมีสิทธิ์เข้าถึงข้อมูลทั้งหมดที่ปรากฏบนหน้าจอหรือเปิดจากอุปกรณ์ของคุณขณะบันทึกหรือแคสต์ ซึ่งรวมถึงข้อมูลอย่างเช่นรหัสผ่าน รายละเอียดการชำระเงิน รูปภาพ ข้อความ และเสียงที่คุณเล่น"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"บริการที่มีฟังก์ชันนี้จะมีสิทธิ์เข้าถึงข้อมูลทั้งหมดที่ปรากฏบนหน้าจอหรือเปิดจากอุปกรณ์ของคุณขณะบันทึกหรือแคสต์ ซึ่งรวมถึงข้อมูลอย่างเช่นรหัสผ่าน รายละเอียดการชำระเงิน รูปภาพ ข้อความ และเสียงที่คุณเล่น"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"เริ่มบันทึกหรือแคสต์ใช่ไหม"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"เริ่มบันทึกหรือแคสต์ด้วย <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> เลยไหม"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"ไม่ต้องแสดงข้อความนี้อีก"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ล้างทั้งหมด"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"จัดการ"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"การแจ้งเตือนแบบไม่มีเสียง"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"การสนทนา"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ล้างการแจ้งเตือนแบบไม่มีเสียงทั้งหมด"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"หยุดการแจ้งเตือนชั่วคราวโดย \"ห้ามรบกวน\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"เริ่มเลย"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"ปรับแต่ง"</string>
<string name="notification_done" msgid="6215117625922713976">"เสร็จสิ้น"</string>
<string name="inline_undo" msgid="9026953267645116526">"เลิกทำ"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"ส่วนควบคุมการแจ้งเตือน"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"ตัวเลือกการปิดเสียงแจ้งเตือนชั่วคราว"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 027eaabdcc0d..ef812fff45cd 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Naka-disable ang NFC"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Naka-enable ang NFC"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Mag-swipe pataas upang lumipat ng app"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"I-drag pakanan para mabilisang magpalipat-lipat ng app"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"I-toggle ang Overview"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"I-off ang Pangtipid sa Baterya"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"Magkakaroon ng access ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sa lahat ng impormasyong nakikita sa iyong screen o pine-play mula sa device mo habang nagre-record o nagka-cast. Kasama rito ang impormasyong tulad ng mga password, detalye ng pagbabayad, larawan, mensahe, at audio na pine-play mo."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Ang serbisyong nagbibigay ng function na ito ay magkakaroon ng access sa lahat ng impormasyong nakikita sa iyong screen o pine-play mula sa device mo habang nagre-record o nagka-cast. Kasama rito ang impormasyong tulad ng mga password, detalye ng pagbabayad, larawan, mensahe, at audio na pine-play mo."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Magsimulang mag-record o mag-cast?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Simulang mag-record o mag-cast gamit ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Huwag ipakitang muli"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"I-clear lahat"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Pamahalaan"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Mga silent na notification"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Mga Pag-uusap"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"I-clear ang lahat ng silent na notification"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Mga notification na na-pause ng Huwag Istorbohin"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Magsimula ngayon"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"I-customize"</string>
<string name="notification_done" msgid="6215117625922713976">"Tapos Na"</string>
<string name="inline_undo" msgid="9026953267645116526">"I-undo"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"mga kontrol ng notification"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"mga opsyon sa pag-snooze ng notification"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index e9f08d3eeac0..470606f48981 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC devre dışı"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC etkin"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Uygulamalar arasında geçiş yapmak için yukarı kaydırın"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Uygulamaları hızlıca değiştirmek için sağa kaydırın"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Genel bakışı aç/kapat"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Pil Tasarrufu\'nu kapat"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, ekranınızda görünen veya kayıt ya da yayın sırasında cihazınızdan oynatılan tüm bilgilere erişecektir. Bu bilgiler arasında şifreler, ödeme detayları, fotoğraflar, mesajlar ve çaldığınız sesler gibi bilgiler yer alır."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Bu işlevi sağlayan hizmet, ekranınızda görünen veya kayıt ya da yayın sırasında cihazınızdan oynatılan tüm bilgilere erişecektir. Bu bilgiler arasında şifreler, ödeme detayları, fotoğraflar, mesajlar ve çaldığınız sesler gibi bilgiler yer alır."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Kayıt veya yayınlama başlatılsın mı?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ile kayıt veya yayınlama başlatılsın mı?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Bir daha gösterme"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tümünü temizle"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Yönet"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Sessiz bildirimler"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Görüşmeler"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Sessiz bildirimlerin tümünü temizle"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirimler, Rahatsız Etmeyin özelliği tarafından duraklatıldı"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Şimdi başlat"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Özelleştir"</string>
<string name="notification_done" msgid="6215117625922713976">"Bitti"</string>
<string name="inline_undo" msgid="9026953267645116526">"Geri al"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"Bildirim kontrolleri"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"bildirim erteleme seçenekleri"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 3640c802a06e..496206a18668 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -395,6 +395,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC вимкнено"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ввімкнено"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Проводьте пальцем угору, щоб переходити між додатками"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Перетягуйте праворуч, щоб швидко переходити між додатками"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Увімкнути або вимкнути огляд"</string>
@@ -477,6 +483,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Очистити все"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Керувати"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучні сповіщення"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Чати"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Очистити всі беззвучні сповіщення"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Режим \"Не турбувати\" призупинив сповіщення"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Почати зараз"</string>
@@ -695,6 +702,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Налаштувати"</string>
<string name="notification_done" msgid="6215117625922713976">"Готово"</string>
<string name="inline_undo" msgid="9026953267645116526">"Відмінити"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"елементи керування сповіщеннями"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"параметри відкладення сповіщень"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index fdc618b228be..a6de5095e7e2 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"‏NFC غیر فعال ہے"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"‏NFC فعال ہے"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ایپس سوئچ کرنے کیلئے اوپر سوائپ کریں"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"تیزی سے ایپس کو سوئچ کرنے کے لیے دائیں طرف گھسیٹیں"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"مجموعی جائزہ ٹوگل کریں"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"سبھی کو صاف کریں"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"نظم کریں"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"اطلاعات خاموش کریں"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"گفتگوئیں"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"سبھی خاموش اطلاعات کو صاف کریں"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ڈسٹرب نہ کریں\' کے ذریعے اطلاعات کو موقوف کیا گیا"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ابھی شروع کریں"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"حسب ضرورت بنائیں"</string>
<string name="notification_done" msgid="6215117625922713976">"ہوگیا"</string>
<string name="inline_undo" msgid="9026953267645116526">"کالعدم کریں"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"اطلاع کے کنٹرولز"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"اطلاع اسنوز کرنے کے اختیارات"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index df40325284c3..1eb02f3eafa7 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC o‘chiq"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC yoniq"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ekranni yozib olish"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Boshlash"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Toʻxtatish"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Ilovalarni almashtirish uchun ekranni tepaga suring"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Ilovalarni tezkor almashtirish uchun o‘ngga torting"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Umumiy nazar rejimini almashtirish"</string>
@@ -465,13 +468,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Quvvat tejash rejimidan chiqish"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ekranda chiqqan yoki yozib olish va translatsiya vaqtida ijro etilgan barcha axborotlarga ruxsat oladi. Bu axborotlar parollar, toʻlov tafsilotlari, rasmlar, xabarlar va ijro etilgan audiolardan iborat boʻlishi mumkin."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Bu funksiyani taʼminlovchi xizmat ekranda chiqqan yoki yozib olish va translatsiya vaqtida ijro etilgan barcha axborotlarga ruxsat oladi. Bu axborotlar parollar, toʻlov tafsilotlari, rasmlar, xabarlar va ijro etilgan audiolardan iborat boʻlishi mumkin."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Yozib olish yoki translatsiya boshlansinmi?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bilan yozib olinsin yoki translatsiya qilinsinmi?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Boshqa ko‘rsatilmasin"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Hammasini tozalash"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Boshqarish"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Tovushsiz bildirishnomalar"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Suhbatlar"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Barcha tovushsiz bildirishnomalarni tozalash"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilingan"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Boshlash"</string>
@@ -690,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Moslash"</string>
<string name="notification_done" msgid="6215117625922713976">"Tayyor"</string>
<string name="inline_undo" msgid="9026953267645116526">"Qaytarish"</string>
+ <string name="demote" msgid="6225813324237153980">"Bu bildirishnomani zanjirsiz deb belgilash"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Sevimli"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Sevimlilardan olib tashlash"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Ovozsiz"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Ovozli"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Bir zanjirda chiqarish"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Zanjirlarsiz chiqarish"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Bosh ekranga chiqarish"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"bildirishnoma sozlamalari"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"bildirishnomalarni kechiktirish parametrlari"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 8a99f436a34f..dc3882e53c3d 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC đã được tắt"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC đã được bật"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Vuốt lên để chuyển đổi ứng dụng"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Kéo sang phải để chuyển đổi nhanh giữa các ứng dụng"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Bật/tắt chế độ xem Tổng quan"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Tắt trình tiết kiệm pin"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ có quyền truy cập vào tất cả các thông tin hiển thị trên màn hình của bạn hoặc phát từ thiết bị trong khi ghi âm/ghi hình hoặc truyền, bao gồm cả thông tin như mật khẩu, chi tiết thanh toán, ảnh, tin nhắn và âm thanh mà bạn phát."</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"Dịch vụ cung cấp chức năng này có quyền truy cập vào tất cả các thông tin hiển thị trên màn hình của bạn hoặc phát từ thiết bị trong khi ghi âm/ghi hình hoặc truyền, bao gồm cả thông tin như mật khẩu, chi tiết thanh toán, ảnh, tin nhắn và âm thanh mà bạn phát."</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Bắt đầu ghi âm/ghi hình hoặc truyền?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Bắt đầu ghi âm/ghi hình hoặc truyền bằng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"Không hiển thị lại"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Xóa tất cả"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Quản lý"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Thông báo im lặng"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Cuộc trò chuyện"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Xóa tất cả thông báo im lặng"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Chế độ Không làm phiền đã tạm dừng thông báo"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Bắt đầu ngay"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Tùy chỉnh"</string>
<string name="notification_done" msgid="6215117625922713976">"Xong"</string>
<string name="inline_undo" msgid="9026953267645116526">"Hoàn tác"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"điều khiển thông báo"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"Tùy chọn báo lại thông báo"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 66bf66bba47b..baacdae2da54 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已启用"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"向上滑动可切换应用"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"向右拖动可快速切换应用"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"切换概览"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"关闭省电模式"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"在录制或投射内容时,<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>将可获取您屏幕上显示或设备中播放的所有信息,其中包括密码、付款明细、照片、消息以及您播放的音频等信息。"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"在录制或投射内容时,提供此功能的服务将可获取您屏幕上显示或设备中播放的所有信息,其中包括密码、付款明细、照片、消息以及您播放的音频等信息。"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"要开始录制或投射内容吗?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"要开始使用<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>录制或投射内容吗?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"不再显示"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"无声通知"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有无声通知"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"勿扰模式暂停的通知"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"立即开始"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"自定义"</string>
<string name="notification_done" msgid="6215117625922713976">"完成"</string>
<string name="inline_undo" msgid="9026953267645116526">"撤消"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g><xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"通知设置"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"通知延后选项"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index dae6eb15e1ac..0f1696e7b34e 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已啟用"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"向上滑動即可切換應用程式"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"向右拖曳即可快速切換應用程式"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"切換概覽"</string>
@@ -471,6 +477,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"靜音通知"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「請勿騷擾」模式已將通知暫停"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string>
@@ -689,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"自訂"</string>
<string name="notification_done" msgid="6215117625922713976">"完成"</string>
<string name="inline_undo" msgid="9026953267645116526">"復原"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"通知控制項"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"通知延後選項"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 1586bb8eb1e6..e8e76ecb6094 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -391,6 +391,12 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已啟用"</string>
+ <!-- no translation found for quick_settings_screen_record_label (1594046461509776676) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_start (1574725369331638985) -->
+ <skip />
+ <!-- no translation found for quick_settings_screen_record_stop (8087348522976412119) -->
+ <skip />
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"向上滑動即可切換應用程式"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"向右拖曳即可快速切換應用程式"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"切換總覽"</string>
@@ -465,13 +471,13 @@
<string name="battery_saver_notification_action_text" msgid="6022091913807026887">"關閉節約耗電量模式"</string>
<string name="media_projection_dialog_text" msgid="1755705274910034772">"在錄製或投放內容時,「<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>」可存取畫面上顯示的任何資訊或裝置播放的任何內容,包括密碼、付款詳情、相片、訊息和你播放的音訊。"</string>
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"在錄製或投放內容時,提供這項功能的服務可存取畫面上顯示的任何資訊或裝置播放的任何內容,包括密碼、付款詳情、相片、訊息和你播放的音訊。"</string>
- <!-- no translation found for media_projection_dialog_service_title (2888507074107884040) -->
- <skip />
+ <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"要開始錄製或投放內容嗎?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"要使用「<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>」開始錄製或投放內容嗎?"</string>
<string name="media_projection_remember_text" msgid="6896767327140422951">"不要再顯示"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"靜音通知"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「零打擾」模式已將通知設為暫停"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string>
@@ -690,6 +696,22 @@
<string name="notification_app_settings" msgid="8963648463858039377">"自訂"</string>
<string name="notification_done" msgid="6215117625922713976">"完成"</string>
<string name="inline_undo" msgid="9026953267645116526">"復原"</string>
+ <!-- no translation found for demote (6225813324237153980) -->
+ <skip />
+ <!-- no translation found for notification_conversation_favorite (8252976467488182853) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unfavorite (633301300443356176) -->
+ <skip />
+ <!-- no translation found for notification_conversation_mute (477431709687199671) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unmute (410885000669775294) -->
+ <skip />
+ <!-- no translation found for notification_conversation_bubble (4598142032706190028) -->
+ <skip />
+ <!-- no translation found for notification_conversation_unbubble (2303087159802926401) -->
+ <skip />
+ <!-- no translation found for notification_conversation_home_screen (8347136037958438935) -->
+ <skip />
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"通知控制項"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"通知延後選項"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 5353018580bf..fa764b575df0 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -391,6 +391,9 @@
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"I-NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"I-NFC ikhutshaziwe"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"I-NFC inikwe amandla"</string>
+ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Irekhodi lesikrini"</string>
+ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Qala"</string>
+ <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Misa"</string>
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Swayiphela phezulu ukuze ushintshe izinhlelo zokusebenza"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Hudula ngqo ukuze ushintshe ngokushesha izinhlelo zokusebenza"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Guqula ukubuka konke"</string>
@@ -471,6 +474,7 @@
<string name="clear_all_notifications_text" msgid="348312370303046130">"Sula konke"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"Phatha"</string>
<string name="notification_section_header_gentle" msgid="3044910806569985386">"Thulisa izaziso"</string>
+ <string name="notification_section_header_conversations" msgid="821834744538345661">"Izingxoxo"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Sula zonke izaziso ezithulile"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Izaziso zimiswe okwesikhashana ukungaphazamisi"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Qala manje"</string>
@@ -689,6 +693,14 @@
<string name="notification_app_settings" msgid="8963648463858039377">"Enza ngendlela oyifisayo"</string>
<string name="notification_done" msgid="6215117625922713976">"Kwenziwe"</string>
<string name="inline_undo" msgid="9026953267645116526">"Susa"</string>
+ <string name="demote" msgid="6225813324237153980">"Maka lesi saziso njengokungesiyo ingxoxo"</string>
+ <string name="notification_conversation_favorite" msgid="8252976467488182853">"Intandokazi"</string>
+ <string name="notification_conversation_unfavorite" msgid="633301300443356176">"Susa ubuntandokazi"</string>
+ <string name="notification_conversation_mute" msgid="477431709687199671">"Thulisa"</string>
+ <string name="notification_conversation_unmute" msgid="410885000669775294">"Susa ukuthula"</string>
+ <string name="notification_conversation_bubble" msgid="4598142032706190028">"Bonisa njengebhamuza"</string>
+ <string name="notification_conversation_unbubble" msgid="2303087159802926401">"Vala amabhamuza"</string>
+ <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Faka kusikrini sasekhaya"</string>
<string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="6429668976593634862">"izilawuli zesaziso"</string>
<string name="notification_menu_snooze_description" msgid="4740133348901973244">"izinketho zokusnuza zesaziso"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index d1495913d95f..aacc2c4f614b 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -89,6 +89,7 @@ import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.phone.NavigationModeController;
import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -238,7 +239,8 @@ public class Dependency {
@Inject Lazy<LeakReporter> mLeakReporter;
@Inject Lazy<GarbageMonitor> mGarbageMonitor;
@Inject Lazy<TunerService> mTunerService;
- @Inject Lazy<StatusBarWindowController> mStatusBarWindowController;
+ @Inject Lazy<NotificationShadeWindowController> mNotificationShadeWindowController;
+ @Inject Lazy<StatusBarWindowController> mTempStatusBarWindowController;
@Inject Lazy<DarkIconDispatcher> mDarkIconDispatcher;
@Inject Lazy<ConfigurationController> mConfigurationController;
@Inject Lazy<StatusBarIconController> mStatusBarIconController;
@@ -400,7 +402,10 @@ public class Dependency {
mProviders.put(TunerService.class, mTunerService::get);
- mProviders.put(StatusBarWindowController.class, mStatusBarWindowController::get);
+ mProviders.put(NotificationShadeWindowController.class,
+ mNotificationShadeWindowController::get);
+
+ mProviders.put(StatusBarWindowController.class, mTempStatusBarWindowController::get);
mProviders.put(DarkIconDispatcher.class, mDarkIconDispatcher::get);
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index c533755c76da..db8b5831faf1 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -455,17 +455,25 @@ public class ScreenDecorations extends SystemUI implements Tunable {
private void setupStatusBarPadding(int padding) {
// Add some padding to all the content near the edge of the screen.
StatusBar statusBar = mStatusBarLazy.get();
- View statusBarWindow = statusBar.getStatusBarWindow();
- if (statusBarWindow != null) {
- TunablePadding.addTunablePadding(statusBarWindow.findViewById(R.id.keyguard_header),
+ final View notificationShadeWindowView = statusBar.getNotificationShadeWindowView();
+ if (notificationShadeWindowView != null) {
+ TunablePadding.addTunablePadding(
+ notificationShadeWindowView.findViewById(R.id.keyguard_header),
PADDING, padding, FLAG_END);
- FragmentHostManager fragmentHostManager = FragmentHostManager.get(statusBarWindow);
- fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG,
- new TunablePaddingTagListener(padding, R.id.status_bar));
+ final FragmentHostManager fragmentHostManager =
+ FragmentHostManager.get(notificationShadeWindowView);
fragmentHostManager.addTagListener(QS.TAG,
new TunablePaddingTagListener(padding, R.id.header));
}
+
+ final View statusBarWindow = statusBar.getStatusBarWindow();
+ if (statusBarWindow != null) {
+ final FragmentHostManager fragmentHostManager =
+ FragmentHostManager.get(statusBarWindow);
+ fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG,
+ new TunablePaddingTagListener(padding, R.id.status_bar));
+ }
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index d835ee1865bf..644d8c48c63c 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -89,9 +89,9 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -166,7 +166,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
private final HashSet<String> mUserBlockedBubbles;
// Bubbles get added to the status bar view
- private final StatusBarWindowController mStatusBarWindowController;
+ private final NotificationShadeWindowController mNotificationShadeWindowController;
private final ZenModeController mZenModeController;
private StatusBarStateListener mStatusBarStateListener;
private final ScreenshotHelper mScreenshotHelper;
@@ -245,7 +245,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
@Inject
public BubbleController(Context context,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
StatusBarStateController statusBarStateController,
ShadeController shadeController,
BubbleData data,
@@ -256,14 +256,14 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
NotificationGroupManager groupManager,
NotificationEntryManager entryManager,
RemoteInputUriController remoteInputUriController) {
- this(context, statusBarWindowController, statusBarStateController, shadeController,
+ this(context, notificationShadeWindowController, statusBarStateController, shadeController,
data, null /* synchronizer */, configurationController, interruptionStateProvider,
zenModeController, notifUserManager, groupManager, entryManager,
remoteInputUriController);
}
public BubbleController(Context context,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
StatusBarStateController statusBarStateController,
ShadeController shadeController,
BubbleData data,
@@ -324,7 +324,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
}
});
- mStatusBarWindowController = statusBarWindowController;
+ mNotificationShadeWindowController = notificationShadeWindowController;
mStatusBarStateListener = new StatusBarStateListener();
statusBarStateController.addCallback(mStatusBarStateListener);
@@ -377,10 +377,10 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
private void ensureStackViewCreated() {
if (mStackView == null) {
mStackView = new BubbleStackView(mContext, mBubbleData, mSurfaceSynchronizer);
- ViewGroup sbv = mStatusBarWindowController.getStatusBarView();
- int bubbleScrimIndex = sbv.indexOfChild(sbv.findViewById(R.id.scrim_for_bubble));
+ ViewGroup nsv = mNotificationShadeWindowController.getNotificationShadeView();
+ int bubbleScrimIndex = nsv.indexOfChild(nsv.findViewById(R.id.scrim_for_bubble));
int stackIndex = bubbleScrimIndex + 1; // Show stack above bubble scrim.
- sbv.addView(mStackView, stackIndex,
+ nsv.addView(mStackView, stackIndex,
new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
if (mExpandListener != null) {
mStackView.setExpandListener(mExpandListener);
@@ -473,7 +473,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
if (listener != null) {
listener.onBubbleExpandChanged(isExpanding, key);
}
- mStatusBarWindowController.setBubbleExpanded(isExpanding);
+ mNotificationShadeWindowController.setBubbleExpanded(isExpanding);
});
if (mStackView != null) {
mStackView.setExpandListener(mExpandListener);
@@ -944,9 +944,9 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
}
// Let listeners know if bubble state changed.
- boolean hadBubbles = mStatusBarWindowController.getBubblesShowing();
+ boolean hadBubbles = mNotificationShadeWindowController.getBubblesShowing();
boolean hasBubblesShowing = hasBubbles() && mStackView.getVisibility() == VISIBLE;
- mStatusBarWindowController.setBubblesShowing(hasBubblesShowing);
+ mNotificationShadeWindowController.setBubblesShowing(hasBubblesShowing);
if (mStateChangeListener != null && hadBubbles != hasBubblesShowing) {
mStateChangeListener.onHasBubblesChanged(hasBubblesShowing);
}
@@ -983,7 +983,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
&& context.getDisplay().getDisplayId() == DEFAULT_DISPLAY;
final Bubble expandedBubble = mStackView.getExpandedBubble();
if (defaultDisplay && expandedBubble != null && isStackExpanded()
- && !mStatusBarWindowController.getPanelExpanded()) {
+ && !mNotificationShadeWindowController.getPanelExpanded()) {
return expandedBubble;
}
return null;
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index c138462d06c4..36a4a10b8a3f 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -97,8 +97,8 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
import com.android.systemui.plugins.GlobalActionsPanelPlugin;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ScrimController;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.EmergencyDialerConstants;
@@ -1528,7 +1528,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private float mScrimAlpha;
private ResetOrientationData mResetOrientationData;
private boolean mHadTopUi;
- private final StatusBarWindowController mStatusBarWindowController;
+ private final NotificationShadeWindowController mNotificationShadeWindowController;
private boolean mControlsEnabled;
ActionsDialog(Context context, MyAdapter adapter,
@@ -1539,7 +1539,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mAdapter = adapter;
mColorExtractor = Dependency.get(SysuiColorExtractor.class);
mStatusBarService = Dependency.get(IStatusBarService.class);
- mStatusBarWindowController = Dependency.get(StatusBarWindowController.class);
+ mNotificationShadeWindowController =
+ Dependency.get(NotificationShadeWindowController.class);
mControlsEnabled = controlsEnabled;
// Window initialization
@@ -1721,8 +1722,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
public void show() {
super.show();
mShowing = true;
- mHadTopUi = mStatusBarWindowController.getForceHasTopUi();
- mStatusBarWindowController.setForceHasTopUi(true);
+ mHadTopUi = mNotificationShadeWindowController.getForceHasTopUi();
+ mNotificationShadeWindowController.setForceHasTopUi(true);
mBackgroundDrawable.setAlpha(0);
mGlobalActionsLayout.setTranslationX(mGlobalActionsLayout.getAnimationOffsetX());
mGlobalActionsLayout.setTranslationY(mGlobalActionsLayout.getAnimationOffsetY());
@@ -1775,7 +1776,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
private void completeDismiss() {
- mStatusBarWindowController.setForceHasTopUi(mHadTopUi);
+ mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi);
super.dismiss();
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index e13c3e087893..2fc7a9cf2434 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -88,9 +88,9 @@ import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.util.InjectionInflationController;
import java.io.FileDescriptor;
@@ -212,7 +212,7 @@ public class KeyguardViewMediator extends SystemUI {
private AlarmManager mAlarmManager;
private AudioManager mAudioManager;
private StatusBarManager mStatusBarManager;
- private final StatusBarWindowController mStatusBarWindowController;
+ private final NotificationShadeWindowController mNotificationShadeWindowController;
private final Executor mUiBgExecutor;
private boolean mSystemReady;
@@ -691,7 +691,7 @@ public class KeyguardViewMediator extends SystemUI {
FalsingManager falsingManager,
LockPatternUtils lockPatternUtils,
BroadcastDispatcher broadcastDispatcher,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
Lazy<StatusBarKeyguardViewManager> statusBarKeyguardViewManagerLazy,
DismissCallbackRegistry dismissCallbackRegistry,
@UiBackground Executor uiBgExecutor) {
@@ -699,7 +699,7 @@ public class KeyguardViewMediator extends SystemUI {
mFalsingManager = falsingManager;
mLockPatternUtils = lockPatternUtils;
mBroadcastDispatcher = broadcastDispatcher;
- mStatusBarWindowController = statusBarWindowController;
+ mNotificationShadeWindowController = notificationShadeWindowController;
mStatusBarKeyguardViewManagerLazy = statusBarKeyguardViewManagerLazy;
mDismissCallbackRegistry = dismissCallbackRegistry;
mUiBgExecutor = uiBgExecutor;
@@ -1819,7 +1819,7 @@ public class KeyguardViewMediator extends SystemUI {
adjustStatusBarLocked();
userActivity();
mUpdateMonitor.setKeyguardGoingAway(false);
- mStatusBarWindowController.setKeyguardGoingAway(false);
+ mNotificationShadeWindowController.setKeyguardGoingAway(false);
mShowKeyguardWakeLock.release();
}
mKeyguardDisplayManager.show();
@@ -1852,7 +1852,7 @@ public class KeyguardViewMediator extends SystemUI {
}
mUpdateMonitor.setKeyguardGoingAway(true);
- mStatusBarWindowController.setKeyguardGoingAway(true);
+ mNotificationShadeWindowController.setKeyguardGoingAway(true);
// Don't actually hide the Keyguard at the moment, wait for window
// manager until it tells us it's safe to do so with
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index ae48db2f4200..569f660d1797 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -68,9 +68,9 @@ import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.phone.NavigationBarFragment;
import com.android.systemui.statusbar.phone.NavigationBarView;
import com.android.systemui.statusbar.phone.NavigationModeController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarWindowCallback;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.policy.CallbackController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
@@ -109,7 +109,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
private SysUiState mSysUiState;
private final Handler mHandler;
private final NavigationBarController mNavBarController;
- private final StatusBarWindowController mStatusBarWinController;
+ private final NotificationShadeWindowController mStatusBarWinController;
private final Runnable mConnectionRunnable = this::internalConnectToCurrentUser;
private final ComponentName mRecentsComponentName;
private final DeviceProvisionedController mDeviceProvisionedController;
@@ -476,8 +476,9 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
@Inject
public OverviewProxyService(Context context, DeviceProvisionedController provisionController,
NavigationBarController navBarController, NavigationModeController navModeController,
- StatusBarWindowController statusBarWinController, SysUiState sysUiState, PipUI pipUI,
- Optional<Divider> dividerOptional, Optional<Lazy<StatusBar>> statusBarOptionalLazy) {
+ NotificationShadeWindowController statusBarWinController, SysUiState sysUiState,
+ PipUI pipUI, Optional<Divider> dividerOptional,
+ Optional<Lazy<StatusBar>> statusBarOptionalLazy) {
mContext = context;
mPipUI = pipUI;
mStatusBarOptionalLazy = statusBarOptionalLazy;
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index 325af2424b2f..9fe6e844e0d2 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -332,6 +332,7 @@ public class DividerView extends FrameLayout implements OnTouchListener,
insets = state.calculateInsets(state.getDisplayFrame(), insets.isRound(),
insets.shouldAlwaysConsumeSystemBars(), insets.getDisplayCutout(),
null /* legacyContentInsets */, null /* legacyStableInsets */,
+ 0 /* legacySystemUiFlags */,
SOFT_INPUT_ADJUST_NOTHING, null /* typeSideMap */);
}
if (mStableInsets.left != insets.getStableInsetLeft()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
index 246b0f0e19ff..a4572665ebf1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
@@ -59,10 +59,10 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ScrimState;
import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import java.io.FileDescriptor;
@@ -105,7 +105,7 @@ public class NotificationMediaManager implements Dumpable {
private final NotificationEntryManager mEntryManager;
@Nullable
- private Lazy<StatusBarWindowController> mStatusBarWindowController;
+ private Lazy<NotificationShadeWindowController> mStatusBarWindowController;
@Nullable
private BiometricUnlockController mBiometricUnlockController;
@@ -180,7 +180,7 @@ public class NotificationMediaManager implements Dumpable {
public NotificationMediaManager(
Context context,
Lazy<StatusBar> statusBarLazy,
- Lazy<StatusBarWindowController> statusBarWindowController,
+ Lazy<NotificationShadeWindowController> statusBarWindowController,
NotificationEntryManager notificationEntryManager,
MediaArtworkProcessor mediaArtworkProcessor,
KeyguardBypassController keyguardBypassController) {
@@ -525,7 +525,7 @@ public class NotificationMediaManager implements Dumpable {
}
}
- StatusBarWindowController windowController = mStatusBarWindowController.get();
+ NotificationShadeWindowController windowController = mStatusBarWindowController.get();
boolean hideBecauseOccluded = mStatusBarLazy.get().isOccluded();
final boolean hasArtwork = artworkDrawable != null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java b/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java
index 9398e6f689f6..0ab5afaab696 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java
@@ -23,6 +23,7 @@ import android.view.ViewGroup;
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.NotificationPanelView;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.StatusBarWindowView;
import com.android.systemui.util.InjectionInflationController;
@@ -30,8 +31,8 @@ import javax.inject.Inject;
import javax.inject.Singleton;
/**
- * Creates a single instance of super_status_bar that can be shared across various system ui
- * objects.
+ * Creates a single instance of super_status_bar and super_notification_shade that can be shared
+ * across various system ui objects.
*/
@Singleton
public class SuperStatusBarViewFactory {
@@ -39,6 +40,7 @@ public class SuperStatusBarViewFactory {
private final Context mContext;
private final InjectionInflationController mInjectionInflationController;
+ private NotificationShadeWindowView mNotificationShadeWindowView;
private StatusBarWindowView mStatusBarWindowView;
private NotificationShelf mNotificationShelf;
@@ -50,15 +52,42 @@ public class SuperStatusBarViewFactory {
}
/**
- * Gets the inflated {@link StatusBarWindowView} from {@link R.layout#super_status_bar}. Returns
- * a cached instance, if it has already been inflated.
+ * Gets the inflated {@link NotificationShadeWindowView} from
+ * {@link R.layout#super_notification_shade}.
+ * Returns a cached instance, if it has already been inflated.
+ */
+ public NotificationShadeWindowView getNotificationShadeWindowView() {
+ if (mNotificationShadeWindowView != null) {
+ return mNotificationShadeWindowView;
+ }
+
+ mNotificationShadeWindowView = (NotificationShadeWindowView)
+ mInjectionInflationController.injectable(
+ LayoutInflater.from(mContext)).inflate(R.layout.super_notification_shade,
+ /* root= */ null);
+ if (mNotificationShadeWindowView == null) {
+ throw new IllegalStateException(
+ "R.layout.super_notification_shade could not be properly inflated");
+ }
+ return mNotificationShadeWindowView;
+ }
+
+ /** Gets the {@link LockIcon} inside of {@link R.layout#super_status_bar}. */
+ public LockIcon getLockIcon() {
+ return getNotificationShadeWindowView().findViewById(R.id.lock_icon);
+ }
+
+ /**
+ * Gets the inflated {@link StatusBarWindowView} from {@link R.layout#super_status_bar}.
+ * Returns a cached instance, if it has already been inflated.
*/
public StatusBarWindowView getStatusBarWindowView() {
if (mStatusBarWindowView != null) {
return mStatusBarWindowView;
}
- mStatusBarWindowView = (StatusBarWindowView) mInjectionInflationController.injectable(
+ mStatusBarWindowView =
+ (StatusBarWindowView) mInjectionInflationController.injectable(
LayoutInflater.from(mContext)).inflate(R.layout.super_status_bar,
/* root= */ null);
if (mStatusBarWindowView == null) {
@@ -68,11 +97,6 @@ public class SuperStatusBarViewFactory {
return mStatusBarWindowView;
}
- /** Gets the {@link LockIcon} inside of {@link R.layout#super_status_bar}. */
- public LockIcon getLockIcon() {
- return getStatusBarWindowView().findViewById(R.id.lock_icon);
- }
-
/**
* Gets the inflated {@link NotificationShelf} from
* {@link R.layout#status_bar_notification_shelf}.
@@ -98,11 +122,11 @@ public class SuperStatusBarViewFactory {
}
public NotificationPanelView getNotificationPanelView() {
- StatusBarWindowView statusBarWindowView = getStatusBarWindowView();
- if (statusBarWindowView == null) {
+ NotificationShadeWindowView notificationShadeWindowView = getNotificationShadeWindowView();
+ if (notificationShadeWindowView == null) {
return null;
}
- return mStatusBarWindowView.findViewById(R.id.notification_panel);
+ return mNotificationShadeWindowView.findViewById(R.id.notification_panel);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
index 66605690b106..5fc043ada22d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
@@ -38,7 +38,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.StatusBarWindowViewController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController;
/**
* A class that allows activities to be launched in a seamless way where the notification
@@ -56,7 +56,7 @@ public class ActivityLaunchAnimator {
private final NotificationPanelViewController mNotificationPanel;
private final NotificationListContainer mNotificationContainer;
private final float mWindowCornerRadius;
- private final StatusBarWindowViewController mStatusBarWindowViewController;
+ private final NotificationShadeWindowViewController mNotificationShadeWindowViewController;
private Callback mCallback;
private final Runnable mTimeoutRunnable = () -> {
setAnimationPending(false);
@@ -67,21 +67,23 @@ public class ActivityLaunchAnimator {
private boolean mIsLaunchForActivity;
public ActivityLaunchAnimator(
- StatusBarWindowViewController statusBarWindowViewController,
+ NotificationShadeWindowViewController notificationShadeWindowViewController,
Callback callback,
NotificationPanelViewController notificationPanel,
NotificationListContainer container) {
mNotificationPanel = notificationPanel;
mNotificationContainer = container;
- mStatusBarWindowViewController = statusBarWindowViewController;
+ mNotificationShadeWindowViewController = notificationShadeWindowViewController;
mCallback = callback;
mWindowCornerRadius = ScreenDecorationsUtils
- .getWindowCornerRadius(mStatusBarWindowViewController.getView().getResources());
+ .getWindowCornerRadius(mNotificationShadeWindowViewController.getView()
+ .getResources());
}
public RemoteAnimationAdapter getLaunchAnimation(
View sourceView, boolean occluded) {
- if (!(sourceView instanceof ExpandableNotificationRow) || !mCallback.areLaunchAnimationsEnabled() || occluded) {
+ if (!(sourceView instanceof ExpandableNotificationRow)
+ || !mCallback.areLaunchAnimationsEnabled() || occluded) {
return null;
}
AnimationRunner animationRunner = new AnimationRunner(
@@ -113,11 +115,12 @@ public class ActivityLaunchAnimator {
private void setAnimationPending(boolean pending) {
mAnimationPending = pending;
- mStatusBarWindowViewController.setExpandAnimationPending(pending);
+ mNotificationShadeWindowViewController.setExpandAnimationPending(pending);
if (pending) {
- mStatusBarWindowViewController.getView().postDelayed(mTimeoutRunnable, LAUNCH_TIMEOUT);
+ mNotificationShadeWindowViewController.getView().postDelayed(mTimeoutRunnable,
+ LAUNCH_TIMEOUT);
} else {
- mStatusBarWindowViewController.getView().removeCallbacks(mTimeoutRunnable);
+ mNotificationShadeWindowViewController.getView().removeCallbacks(mTimeoutRunnable);
}
}
@@ -247,7 +250,7 @@ public class ActivityLaunchAnimator {
private void setExpandAnimationRunning(boolean running) {
mNotificationPanel.setLaunchingNotification(running);
mSourceNotification.setExpandAnimationRunning(running);
- mStatusBarWindowViewController.setExpandAnimationRunning(running);
+ mNotificationShadeWindowViewController.setExpandAnimationRunning(running);
mNotificationContainer.setExpandingNotification(running ? mSourceNotification : null);
mAnimationRunning = running;
if (!running) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
index 76fdfc6fbabc..874d81db0bd2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
@@ -47,7 +47,7 @@ import com.android.systemui.qs.QuickQSPanel;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.util.Utils;
import java.util.Timer;
@@ -181,8 +181,9 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi
final int[] compactActions = mRow.getEntry().getSbn().getNotification().extras
.getIntArray(Notification.EXTRA_COMPACT_ACTIONS);
int tintColor = getNotificationHeader().getOriginalIconColor();
- StatusBarWindowController ctrl = Dependency.get(StatusBarWindowController.class);
- QuickQSPanel panel = ctrl.getStatusBarView().findViewById(
+ NotificationShadeWindowController ctrl = Dependency.get(
+ NotificationShadeWindowController.class);
+ QuickQSPanel panel = ctrl.getNotificationShadeView().findViewById(
com.android.systemui.R.id.quick_qs_panel);
StatusBarNotification sbn = mRow.getEntry().getSbn();
Notification notif = sbn.getNotification();
@@ -193,7 +194,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi
mActions,
compactActions,
notif.contentIntent);
- QSPanel bigPanel = ctrl.getStatusBarView().findViewById(
+ QSPanel bigPanel = ctrl.getNotificationShadeView().findViewById(
com.android.systemui.R.id.quick_settings_panel);
bigPanel.addMediaSession(token,
notif.getSmallIcon(),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index 48805204160f..691e1c422bfe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -141,7 +141,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
private final KeyguardUpdateMonitor mUpdateMonitor;
private final DozeParameters mDozeParameters;
private final KeyguardStateController mKeyguardStateController;
- private final StatusBarWindowController mStatusBarWindowController;
+ private final NotificationShadeWindowController mNotificationShadeWindowController;
private final Context mContext;
private final int mWakeUpDelay;
private int mMode;
@@ -162,7 +162,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
public BiometricUnlockController(Context context, DozeScrimController dozeScrimController,
KeyguardViewMediator keyguardViewMediator, ScrimController scrimController,
StatusBar statusBar, ShadeController shadeController,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
KeyguardStateController keyguardStateController, Handler handler,
KeyguardUpdateMonitor keyguardUpdateMonitor,
@Main Resources resources,
@@ -177,7 +177,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
mMediaManager = Dependency.get(NotificationMediaManager.class);
Dependency.get(WakefulnessLifecycle.class).addObserver(mWakefulnessObserver);
Dependency.get(ScreenLifecycle.class).addObserver(mScreenObserver);
- mStatusBarWindowController = statusBarWindowController;
+
+ mNotificationShadeWindowController = notificationShadeWindowController;
mDozeScrimController = dozeScrimController;
mKeyguardViewMediator = keyguardViewMediator;
mScrimController = scrimController;
@@ -284,7 +285,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
// notifications would light up first, creating an unpleasant animation.
// Defer changing the screen brightness by forcing doze brightness on our window
// until the clock and the notifications are faded out.
- mStatusBarWindowController.setForceDozeBrightness(true);
+ mNotificationShadeWindowController.setForceDozeBrightness(true);
}
// During wake and unlock, we need to draw black before waking up to avoid abrupt
// brightness changes due to display state transitions.
@@ -340,7 +341,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
Trace.beginSection("MODE_WAKE_AND_UNLOCK_FROM_DREAM");
mUpdateMonitor.awakenFromDream();
}
- mStatusBarWindowController.setStatusBarFocusable(false);
+ mNotificationShadeWindowController.setNotificationShadeFocusable(false);
if (delayWakeUp) {
mHandler.postDelayed(wakeUp, mWakeUpDelay);
} else {
@@ -508,7 +509,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
- mStatusBarWindowController.setForceDozeBrightness(false);
+ mNotificationShadeWindowController.setForceDozeBrightness(false);
}
}, StatusBar.FADE_KEYGUARD_DURATION_PULSING);
}
@@ -522,7 +523,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
private void resetMode() {
mMode = MODE_NONE;
- mStatusBarWindowController.setForceDozeBrightness(false);
+ mNotificationShadeWindowController.setForceDozeBrightness(false);
if (mStatusBar.getNavigationBarView() != null) {
mStatusBar.getNavigationBarView().setWakeAndUnlocking(false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
index accd2a4fcc0d..04efc2d7558d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
@@ -85,9 +85,9 @@ public final class DozeServiceHost implements DozeHost {
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final VisualStabilityManager mVisualStabilityManager;
private final PulseExpansionHandler mPulseExpansionHandler;
- private final StatusBarWindowController mStatusBarWindowController;
+ private final NotificationShadeWindowController mNotificationShadeWindowController;
private final NotificationWakeUpCoordinator mNotificationWakeUpCoordinator;
- private StatusBarWindowViewController mStatusBarWindowViewController;
+ private NotificationShadeWindowViewController mNotificationShadeWindowViewController;
private final LockscreenLockIconController mLockscreenLockIconController;
private NotificationIconAreaController mNotificationIconAreaController;
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@@ -108,7 +108,7 @@ public final class DozeServiceHost implements DozeHost {
DozeScrimController dozeScrimController, KeyguardUpdateMonitor keyguardUpdateMonitor,
VisualStabilityManager visualStabilityManager,
PulseExpansionHandler pulseExpansionHandler,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
NotificationWakeUpCoordinator notificationWakeUpCoordinator,
LockscreenLockIconController lockscreenLockIconController) {
super();
@@ -127,7 +127,7 @@ public final class DozeServiceHost implements DozeHost {
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mVisualStabilityManager = visualStabilityManager;
mPulseExpansionHandler = pulseExpansionHandler;
- mStatusBarWindowController = statusBarWindowController;
+ mNotificationShadeWindowController = notificationShadeWindowController;
mNotificationWakeUpCoordinator = notificationWakeUpCoordinator;
mLockscreenLockIconController = lockscreenLockIconController;
}
@@ -140,13 +140,13 @@ public final class DozeServiceHost implements DozeHost {
public void initialize(StatusBar statusBar,
NotificationIconAreaController notificationIconAreaController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
- StatusBarWindowViewController statusBarWindowViewController,
+ NotificationShadeWindowViewController notificationShadeWindowViewController,
NotificationPanelViewController notificationPanel, View ambientIndicationContainer) {
mStatusBar = statusBar;
mNotificationIconAreaController = notificationIconAreaController;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mNotificationPanel = notificationPanel;
- mStatusBarWindowViewController = statusBarWindowViewController;
+ mNotificationShadeWindowViewController = notificationShadeWindowViewController;
mAmbientIndicationContainer = ambientIndicationContainer;
mBiometricUnlockController = mBiometricUnlockControllerLazy.get();
}
@@ -292,7 +292,7 @@ public final class DozeServiceHost implements DozeHost {
}
mIgnoreTouchWhilePulsing = ignore;
if (mStatusBarStateController.isDozing() && ignore) {
- mStatusBarWindowViewController.cancelCurrentTouch();
+ mNotificationShadeWindowViewController.cancelCurrentTouch();
}
}
@@ -391,7 +391,7 @@ public final class DozeServiceHost implements DozeHost {
@Override
public void setDozeScreenBrightness(int value) {
- mStatusBarWindowController.setDozeScreenBrightness(value);
+ mNotificationShadeWindowController.setDozeScreenBrightness(value);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
index 7b20a7b7037c..c39ee3a90230 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
@@ -92,21 +92,22 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
public HeadsUpAppearanceController(
NotificationIconAreaController notificationIconAreaController,
- HeadsUpManagerPhone headsUpManager, View statusbarView,
+ HeadsUpManagerPhone headsUpManager,
+ View notificationShadeView,
SysuiStatusBarStateController statusBarStateController,
KeyguardBypassController keyguardBypassController,
KeyguardStateController keyguardStateController,
NotificationWakeUpCoordinator wakeUpCoordinator, CommandQueue commandQueue,
- NotificationPanelViewController notificationPanelViewController) {
+ NotificationPanelViewController notificationPanelViewController, View statusBarView) {
this(notificationIconAreaController, headsUpManager, statusBarStateController,
keyguardBypassController, wakeUpCoordinator, keyguardStateController,
commandQueue,
- statusbarView.findViewById(R.id.heads_up_status_bar_view),
- statusbarView.findViewById(R.id.notification_stack_scroller),
+ statusBarView.findViewById(R.id.heads_up_status_bar_view),
+ notificationShadeView.findViewById(R.id.notification_stack_scroller),
notificationPanelViewController,
- statusbarView.findViewById(R.id.clock),
- statusbarView.findViewById(R.id.operator_name_frame),
- statusbarView.findViewById(R.id.centered_icon_area));
+ statusBarView.findViewById(R.id.clock),
+ statusBarView.findViewById(R.id.operator_name_frame),
+ statusBarView.findViewById(R.id.centered_icon_area));
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index 6ac6d354cfff..c6e3fdefe701 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -65,7 +65,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
private final StatusBarStateController mStatusBarStateController;
private final KeyguardBypassController mBypassController;
private final int mAutoHeadsUpNotificationDecay;
- private View mStatusBarWindowView;
+ private View mNotificationShadeWindowView;
private NotificationGroupManager mGroupManager;
private VisualStabilityManager mVisualStabilityManager;
private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager;
@@ -124,14 +124,13 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
initResources();
}
-
- public void setUp(@NonNull View statusBarWindowView,
+ public void setUp(@NonNull View notificationShadeWindowView,
@NonNull NotificationGroupManager groupManager,
@NonNull StatusBar bar,
@NonNull VisualStabilityManager visualStabilityManager) {
- mStatusBarWindowView = statusBarWindowView;
- mStatusBarTouchableRegionManager = new StatusBarTouchableRegionManager(mContext, this, bar,
- statusBarWindowView);
+ mNotificationShadeWindowView = notificationShadeWindowView;
+ mStatusBarTouchableRegionManager = new StatusBarTouchableRegionManager(this, bar,
+ notificationShadeWindowView);
mGroupManager = groupManager;
mVisualStabilityManager = visualStabilityManager;
@@ -364,7 +363,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
// updated yet, but callbacks leading out of the headsUp manager, querying it. Let's
// therefore also check if the topEntry is null.
if (!hasPinnedHeadsUp() || topEntry == null) {
- mTouchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight);
+ mTouchableRegion.set(0, 0, mNotificationShadeWindowView.getWidth(), mStatusBarHeight);
updateRegionForNotch(mTouchableRegion);
} else {
@@ -386,7 +385,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
}
private void updateRegionForNotch(Region region) {
- WindowInsets windowInsets = mStatusBarWindowView.getRootWindowInsets();
+ WindowInsets windowInsets = mNotificationShadeWindowView.getRootWindowInsets();
if (windowInsets == null) {
Log.w(TAG, "StatusBarWindowView is not attached.");
return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index 3554b54db99b..707138ee8dc0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -128,7 +128,7 @@ public class NotificationIconAreaController implements DarkReceiver,
mAodIcons.setAnimationsEnabled(false);
mAodIcons.removeAllViews();
}
- mAodIcons = mStatusBar.getStatusBarWindow().findViewById(
+ mAodIcons = mStatusBar.getNotificationShadeWindowView().findViewById(
R.id.clock_notification_icon_container);
mAodIcons.setOnLockScreen(true);
updateAodIconsVisibility(false /* animate */);
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 90ec2a076e87..6112ae88f634 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -1367,14 +1367,7 @@ public class NotificationPanelViewController extends PanelViewController {
if (mExpectingSynthesizedDown) {
mExpectingSynthesizedDown = false;
maybeVibrateOnOpening();
- Runnable runnable = () -> fling(velocity > 1f ? 1000f * velocity : 0,
- true /* expand */);
- if (mStatusBar.getStatusBarWindow().getHeight() != mStatusBar.getStatusBarHeight()) {
- // The panel is already expanded to its full size, let's expand directly
- runnable.run();
- } else {
- mExpandAfterLayoutRunnable = runnable;
- }
+ fling(velocity > 1f ? 1000f * velocity : 0, true /* expand */);
onTrackingStopped(false);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java
new file mode 100644
index 000000000000..fe4879b0b071
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java
@@ -0,0 +1,719 @@
+/*
+ * 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.phone;
+
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
+import static com.android.systemui.DejankUtils.whitelistIpcs;
+import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT;
+
+import android.app.IActivityManager;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.res.Resources;
+import android.graphics.PixelFormat;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.os.Trace;
+import android.util.Log;
+import android.view.Display;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.WindowManager.LayoutParams;
+
+import com.android.systemui.Dumpable;
+import com.android.systemui.R;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
+import com.android.systemui.statusbar.RemoteInputController.Callback;
+import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.SuperStatusBarViewFactory;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
+
+import com.google.android.collect.Lists;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Encapsulates all logic for the notification shade window state management.
+ */
+@Singleton
+public class NotificationShadeWindowController implements Callback, Dumpable,
+ ConfigurationListener {
+
+ private static final String TAG = "NotificationShadeWindowController";
+ private static final boolean DEBUG = false;
+
+ private final Context mContext;
+ private final WindowManager mWindowManager;
+ private final IActivityManager mActivityManager;
+ private final DozeParameters mDozeParameters;
+ private final LayoutParams mLpChanged;
+ private final boolean mKeyguardScreenRotation;
+ private final long mLockScreenDisplayTimeout;
+ private final Display.Mode mKeyguardDisplayMode;
+ private final KeyguardBypassController mKeyguardBypassController;
+ private ViewGroup mNotificationShadeView;
+ private LayoutParams mLp;
+ private boolean mHasTopUi;
+ private boolean mHasTopUiChanged;
+ private float mScreenBrightnessDoze;
+ private final State mCurrentState = new State();
+ private OtherwisedCollapsedListener mListener;
+ private ForcePluginOpenListener mForcePluginOpenListener;
+ private final ArrayList<WeakReference<StatusBarWindowCallback>>
+ mCallbacks = Lists.newArrayList();
+
+ private final SysuiColorExtractor mColorExtractor;
+ private final SuperStatusBarViewFactory mSuperStatusBarViewFactory;
+
+ @Inject
+ public NotificationShadeWindowController(Context context, WindowManager windowManager,
+ IActivityManager activityManager, DozeParameters dozeParameters,
+ StatusBarStateController statusBarStateController,
+ ConfigurationController configurationController,
+ KeyguardBypassController keyguardBypassController, SysuiColorExtractor colorExtractor,
+ SuperStatusBarViewFactory superStatusBarViewFactory) {
+ mContext = context;
+ mWindowManager = windowManager;
+ mActivityManager = activityManager;
+ mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation();
+ mDozeParameters = dozeParameters;
+ mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze();
+ mLpChanged = new LayoutParams();
+ mKeyguardBypassController = keyguardBypassController;
+ mColorExtractor = colorExtractor;
+ mSuperStatusBarViewFactory = superStatusBarViewFactory;
+ mNotificationShadeView = mSuperStatusBarViewFactory.getNotificationShadeWindowView();
+
+ mLockScreenDisplayTimeout = context.getResources()
+ .getInteger(R.integer.config_lockScreenDisplayTimeout);
+ ((SysuiStatusBarStateController) statusBarStateController)
+ .addCallback(mStateListener,
+ SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER);
+ configurationController.addCallback(this);
+
+ Display.Mode[] supportedModes = context.getDisplay().getSupportedModes();
+ Display.Mode currentMode = context.getDisplay().getMode();
+ // Running on the highest frame rate available can be expensive.
+ // Let's specify a preferred refresh rate, and allow higher FPS only when we
+ // know that we're not falsing (because we unlocked.)
+ int keyguardRefreshRate = context.getResources()
+ .getInteger(R.integer.config_keyguardRefreshRate);
+ // Find supported display mode with the same resolution and requested refresh rate.
+ mKeyguardDisplayMode = Arrays.stream(supportedModes).filter(mode ->
+ (int) mode.getRefreshRate() == keyguardRefreshRate
+ && mode.getPhysicalWidth() == currentMode.getPhysicalWidth()
+ && mode.getPhysicalHeight() == currentMode.getPhysicalHeight())
+ .findFirst().orElse(null);
+ }
+
+ /**
+ * Register to receive notifications about status bar window state changes.
+ */
+ public void registerCallback(StatusBarWindowCallback callback) {
+ // Prevent adding duplicate callbacks
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ if (mCallbacks.get(i).get() == callback) {
+ return;
+ }
+ }
+ mCallbacks.add(new WeakReference<StatusBarWindowCallback>(callback));
+ }
+
+ private boolean shouldEnableKeyguardScreenRotation() {
+ Resources res = mContext.getResources();
+ return SystemProperties.getBoolean("lockscreen.rot_override", false)
+ || res.getBoolean(R.bool.config_enableLockScreenRotation);
+ }
+
+ /**
+ * Adds the notification shade view to the window manager.
+ */
+ public void attach() {
+ // Now that the notification shade encompasses the sliding panel and its
+ // translucent backdrop, the entire thing is made TRANSLUCENT and is
+ // hardware-accelerated.
+ mLp = new LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ LayoutParams.TYPE_NOTIFICATION_SHADE,
+ LayoutParams.FLAG_NOT_FOCUSABLE
+ | LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
+ | LayoutParams.FLAG_SPLIT_TOUCH
+ | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+ | LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
+ PixelFormat.TRANSLUCENT);
+ mLp.token = new Binder();
+ mLp.gravity = Gravity.TOP;
+ mLp.setFitWindowInsetsTypes(0 /* types */);
+ mLp.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
+ mLp.setTitle("NotificationShade");
+ mLp.packageName = mContext.getPackageName();
+ mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+ mWindowManager.addView(mNotificationShadeView, mLp);
+ mLpChanged.copyFrom(mLp);
+ onThemeChanged();
+ }
+
+ public ViewGroup getNotificationShadeView() {
+ return mNotificationShadeView;
+ }
+
+ public void setDozeScreenBrightness(int value) {
+ mScreenBrightnessDoze = value / 255f;
+ }
+
+ private void setKeyguardDark(boolean dark) {
+ int vis = mNotificationShadeView.getSystemUiVisibility();
+ if (dark) {
+ vis = vis | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
+ vis = vis | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+ } else {
+ vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
+ vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+ }
+ mNotificationShadeView.setSystemUiVisibility(vis);
+ }
+
+ private void applyKeyguardFlags(State state) {
+ final boolean scrimsOccludingWallpaper =
+ state.mScrimsVisibility == ScrimController.OPAQUE;
+ final boolean keyguardOrAod = state.mKeyguardShowing
+ || (state.mDozing && mDozeParameters.getAlwaysOn());
+ if (keyguardOrAod && !state.mBackdropShowing && !scrimsOccludingWallpaper) {
+ mLpChanged.flags |= LayoutParams.FLAG_SHOW_WALLPAPER;
+ } else {
+ mLpChanged.flags &= ~LayoutParams.FLAG_SHOW_WALLPAPER;
+ }
+
+ if (state.mDozing) {
+ mLpChanged.privateFlags |= LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+ } else {
+ mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+ }
+
+ if (mKeyguardDisplayMode != null) {
+ boolean bypassOnKeyguard = mKeyguardBypassController.getBypassEnabled()
+ && state.mStatusBarState == StatusBarState.KEYGUARD
+ && !state.mKeyguardFadingAway && !state.mKeyguardGoingAway;
+ if (state.mDozing || bypassOnKeyguard) {
+ mLpChanged.preferredDisplayModeId = mKeyguardDisplayMode.getModeId();
+ } else {
+ mLpChanged.preferredDisplayModeId = 0;
+ }
+ Trace.setCounter("display_mode_id", mLpChanged.preferredDisplayModeId);
+ }
+ }
+
+ private void adjustScreenOrientation(State state) {
+ if (state.isKeyguardShowingAndNotOccluded() || state.mDozing) {
+ if (mKeyguardScreenRotation) {
+ mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;
+ } else {
+ mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
+ }
+ } else {
+ mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
+ }
+ }
+
+ private void applyFocusableFlag(State state) {
+ boolean panelFocusable = state.mNotificationShadeFocusable && state.mPanelExpanded;
+ if (state.mBouncerShowing && (state.mKeyguardOccluded || state.mKeyguardNeedsInput)
+ || ENABLE_REMOTE_INPUT && state.mRemoteInputActive
+ || state.mBubbleExpanded) {
+ mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE;
+ mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+ } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) {
+ mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE;
+ // Make sure to remove FLAG_ALT_FOCUSABLE_IM when keyguard needs input.
+ if (state.mKeyguardNeedsInput) {
+ mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+ } else {
+ mLpChanged.flags |= LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+ }
+ } else {
+ mLpChanged.flags |= LayoutParams.FLAG_NOT_FOCUSABLE;
+ mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+ }
+
+ mLpChanged.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
+ }
+
+ private void applyForceShowNavigationFlag(State state) {
+ if (state.mPanelExpanded || state.mBouncerShowing
+ || ENABLE_REMOTE_INPUT && state.mRemoteInputActive) {
+ mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
+ } else {
+ mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
+ }
+ }
+
+ private void applyVisibility(State state) {
+ boolean visible = isExpanded(state);
+ if (state.mForcePluginOpen) {
+ if (mListener != null) {
+ mListener.setWouldOtherwiseCollapse(visible);
+ }
+ visible = true;
+ }
+ if (visible) {
+ mNotificationShadeView.setVisibility(View.VISIBLE);
+ } else {
+ mNotificationShadeView.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ private boolean isExpanded(State state) {
+ return !state.mForceCollapsed && (state.isKeyguardShowingAndNotOccluded()
+ || state.mPanelVisible || state.mKeyguardFadingAway || state.mBouncerShowing
+ || state.mHeadsUpShowing || state.mBubblesShowing
+ || state.mScrimsVisibility != ScrimController.TRANSPARENT);
+ }
+
+ private void applyFitsSystemWindows(State state) {
+ boolean fitsSystemWindows = !state.isKeyguardShowingAndNotOccluded();
+ if (mNotificationShadeView != null
+ && mNotificationShadeView.getFitsSystemWindows() != fitsSystemWindows) {
+ mNotificationShadeView.setFitsSystemWindows(fitsSystemWindows);
+ mNotificationShadeView.requestApplyInsets();
+ }
+ }
+
+ private void applyUserActivityTimeout(State state) {
+ if (state.isKeyguardShowingAndNotOccluded()
+ && state.mStatusBarState == StatusBarState.KEYGUARD
+ && !state.mQsExpanded) {
+ mLpChanged.userActivityTimeout = state.mBouncerShowing
+ ? KeyguardViewMediator.AWAKE_INTERVAL_BOUNCER_MS : mLockScreenDisplayTimeout;
+ } else {
+ mLpChanged.userActivityTimeout = -1;
+ }
+ }
+
+ private void applyInputFeatures(State state) {
+ if (state.isKeyguardShowingAndNotOccluded()
+ && state.mStatusBarState == StatusBarState.KEYGUARD
+ && !state.mQsExpanded && !state.mForceUserActivity) {
+ mLpChanged.inputFeatures |=
+ LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
+ } else {
+ mLpChanged.inputFeatures &=
+ ~LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
+ }
+ }
+
+ private void applyStatusBarColorSpaceAgnosticFlag(State state) {
+ if (!isExpanded(state)) {
+ mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC;
+ } else {
+ mLpChanged.privateFlags &=
+ ~LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC;
+ }
+ }
+
+ private void apply(State state) {
+ applyKeyguardFlags(state);
+ applyFocusableFlag(state);
+ applyForceShowNavigationFlag(state);
+ adjustScreenOrientation(state);
+ applyVisibility(state);
+ applyUserActivityTimeout(state);
+ applyInputFeatures(state);
+ applyFitsSystemWindows(state);
+ applyModalFlag(state);
+ applyBrightness(state);
+ applyHasTopUi(state);
+ applyNotTouchable(state);
+ applyStatusBarColorSpaceAgnosticFlag(state);
+ if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
+ mWindowManager.updateViewLayout(mNotificationShadeView, mLp);
+ }
+ if (mHasTopUi != mHasTopUiChanged) {
+ whitelistIpcs(() -> {
+ try {
+ mActivityManager.setHasTopUi(mHasTopUiChanged);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to call setHasTopUi", e);
+ }
+ mHasTopUi = mHasTopUiChanged;
+ });
+ }
+ notifyStateChangedCallbacks();
+ }
+
+ public void notifyStateChangedCallbacks() {
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ StatusBarWindowCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onStateChanged(mCurrentState.mKeyguardShowing,
+ mCurrentState.mKeyguardOccluded,
+ mCurrentState.mBouncerShowing);
+ }
+ }
+ }
+
+ private void applyModalFlag(State state) {
+ if (state.mHeadsUpShowing) {
+ mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCH_MODAL;
+ } else {
+ mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCH_MODAL;
+ }
+ }
+
+ private void applyBrightness(State state) {
+ if (state.mForceDozeBrightness) {
+ mLpChanged.screenBrightness = mScreenBrightnessDoze;
+ } else {
+ mLpChanged.screenBrightness = LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
+ }
+ }
+
+ private void applyHasTopUi(State state) {
+ mHasTopUiChanged = state.mForceHasTopUi || isExpanded(state);
+ }
+
+ private void applyNotTouchable(State state) {
+ if (state.mNotTouchable) {
+ mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCHABLE;
+ } else {
+ mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCHABLE;
+ }
+ }
+
+ public void setKeyguardShowing(boolean showing) {
+ mCurrentState.mKeyguardShowing = showing;
+ apply(mCurrentState);
+ }
+
+ public void setKeyguardOccluded(boolean occluded) {
+ mCurrentState.mKeyguardOccluded = occluded;
+ apply(mCurrentState);
+ }
+
+ public void setKeyguardNeedsInput(boolean needsInput) {
+ mCurrentState.mKeyguardNeedsInput = needsInput;
+ apply(mCurrentState);
+ }
+
+ public void setPanelVisible(boolean visible) {
+ mCurrentState.mPanelVisible = visible;
+ mCurrentState.mNotificationShadeFocusable = visible;
+ apply(mCurrentState);
+ }
+
+ public void setNotificationShadeFocusable(boolean focusable) {
+ mCurrentState.mNotificationShadeFocusable = focusable;
+ apply(mCurrentState);
+ }
+
+ public void setBouncerShowing(boolean showing) {
+ mCurrentState.mBouncerShowing = showing;
+ apply(mCurrentState);
+ }
+
+ public void setBackdropShowing(boolean showing) {
+ mCurrentState.mBackdropShowing = showing;
+ apply(mCurrentState);
+ }
+
+ public void setKeyguardFadingAway(boolean keyguardFadingAway) {
+ mCurrentState.mKeyguardFadingAway = keyguardFadingAway;
+ apply(mCurrentState);
+ }
+
+ public void setQsExpanded(boolean expanded) {
+ mCurrentState.mQsExpanded = expanded;
+ apply(mCurrentState);
+ }
+
+ public void setForceUserActivity(boolean forceUserActivity) {
+ mCurrentState.mForceUserActivity = forceUserActivity;
+ apply(mCurrentState);
+ }
+
+ public void setScrimsVisibility(int scrimsVisibility) {
+ mCurrentState.mScrimsVisibility = scrimsVisibility;
+ apply(mCurrentState);
+ }
+
+ public void setHeadsUpShowing(boolean showing) {
+ mCurrentState.mHeadsUpShowing = showing;
+ apply(mCurrentState);
+ }
+
+ public void setWallpaperSupportsAmbientMode(boolean supportsAmbientMode) {
+ mCurrentState.mWallpaperSupportsAmbientMode = supportsAmbientMode;
+ apply(mCurrentState);
+ }
+
+ /**
+ * @param state The {@link StatusBarStateController} of the status bar.
+ */
+ private void setStatusBarState(int state) {
+ mCurrentState.mStatusBarState = state;
+ apply(mCurrentState);
+ }
+
+ /**
+ * Force the window to be collapsed, even if it should theoretically be expanded.
+ * Used for when a heads-up comes in but we still need to wait for the touchable regions to
+ * be computed.
+ */
+ public void setForceWindowCollapsed(boolean force) {
+ mCurrentState.mForceCollapsed = force;
+ apply(mCurrentState);
+ }
+
+ public void setPanelExpanded(boolean isExpanded) {
+ mCurrentState.mPanelExpanded = isExpanded;
+ apply(mCurrentState);
+ }
+
+ @Override
+ public void onRemoteInputActive(boolean remoteInputActive) {
+ mCurrentState.mRemoteInputActive = remoteInputActive;
+ apply(mCurrentState);
+ }
+
+ /**
+ * Set whether the screen brightness is forced to the value we use for doze mode by the status
+ * bar window.
+ */
+ public void setForceDozeBrightness(boolean forceDozeBrightness) {
+ mCurrentState.mForceDozeBrightness = forceDozeBrightness;
+ apply(mCurrentState);
+ }
+
+ public void setDozing(boolean dozing) {
+ mCurrentState.mDozing = dozing;
+ apply(mCurrentState);
+ }
+
+ public void setForcePluginOpen(boolean forcePluginOpen) {
+ mCurrentState.mForcePluginOpen = forcePluginOpen;
+ apply(mCurrentState);
+ if (mForcePluginOpenListener != null) {
+ mForcePluginOpenListener.onChange(forcePluginOpen);
+ }
+ }
+
+ /**
+ * The forcePluginOpen state for the status bar.
+ */
+ public boolean getForcePluginOpen() {
+ return mCurrentState.mForcePluginOpen;
+ }
+
+ public void setNotTouchable(boolean notTouchable) {
+ mCurrentState.mNotTouchable = notTouchable;
+ apply(mCurrentState);
+ }
+
+ /**
+ * Sets whether there are bubbles showing on the screen.
+ */
+ public void setBubblesShowing(boolean bubblesShowing) {
+ mCurrentState.mBubblesShowing = bubblesShowing;
+ apply(mCurrentState);
+ }
+
+ /**
+ * The bubbles showing state for the status bar.
+ */
+ public boolean getBubblesShowing() {
+ return mCurrentState.mBubblesShowing;
+ }
+
+ /**
+ * Sets if there is a bubble being expanded on the screen.
+ */
+ public void setBubbleExpanded(boolean bubbleExpanded) {
+ mCurrentState.mBubbleExpanded = bubbleExpanded;
+ apply(mCurrentState);
+ }
+
+ /**
+ * Whether the bubble is shown in expanded state for the status bar.
+ */
+ public boolean getBubbleExpanded() {
+ return mCurrentState.mBubbleExpanded;
+ }
+
+ /**
+ * Whether the status bar panel is expanded or not.
+ */
+ public boolean getPanelExpanded() {
+ return mCurrentState.mPanelExpanded;
+ }
+
+ public void setStateListener(OtherwisedCollapsedListener listener) {
+ mListener = listener;
+ }
+
+ public void setForcePluginOpenListener(ForcePluginOpenListener listener) {
+ mForcePluginOpenListener = listener;
+ }
+
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("StatusBarWindowController:");
+ pw.println(" mKeyguardDisplayMode=" + mKeyguardDisplayMode);
+ pw.println(mCurrentState);
+ }
+
+ public boolean isShowingWallpaper() {
+ return !mCurrentState.mBackdropShowing;
+ }
+
+ @Override
+ public void onThemeChanged() {
+ if (mNotificationShadeView == null) {
+ return;
+ }
+
+ final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText();
+ // Make sure we have the correct navbar/statusbar colors.
+ setKeyguardDark(useDarkText);
+ }
+
+ /**
+ * When keyguard will be dismissed but didn't start animation yet.
+ */
+ public void setKeyguardGoingAway(boolean goingAway) {
+ mCurrentState.mKeyguardGoingAway = goingAway;
+ apply(mCurrentState);
+ }
+
+ public boolean getForceHasTopUi() {
+ return mCurrentState.mForceHasTopUi;
+ }
+
+ public void setForceHasTopUi(boolean forceHasTopUi) {
+ mCurrentState.mForceHasTopUi = forceHasTopUi;
+ apply(mCurrentState);
+ }
+
+ private static class State {
+ boolean mKeyguardShowing;
+ boolean mKeyguardOccluded;
+ boolean mKeyguardNeedsInput;
+ boolean mPanelVisible;
+ boolean mPanelExpanded;
+ boolean mNotificationShadeFocusable;
+ boolean mBouncerShowing;
+ boolean mKeyguardFadingAway;
+ boolean mKeyguardGoingAway;
+ boolean mQsExpanded;
+ boolean mHeadsUpShowing;
+ boolean mForceCollapsed;
+ boolean mForceDozeBrightness;
+ boolean mForceUserActivity;
+ boolean mBackdropShowing;
+ boolean mWallpaperSupportsAmbientMode;
+ boolean mNotTouchable;
+ boolean mBubblesShowing;
+ boolean mBubbleExpanded;
+ boolean mForceHasTopUi;
+
+ /**
+ * The {@link StatusBar} state from the status bar.
+ */
+ int mStatusBarState;
+
+ boolean mRemoteInputActive;
+ boolean mForcePluginOpen;
+ boolean mDozing;
+ int mScrimsVisibility;
+
+ private boolean isKeyguardShowingAndNotOccluded() {
+ return mKeyguardShowing && !mKeyguardOccluded;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder result = new StringBuilder();
+ String newLine = "\n";
+ result.append("Window State {");
+ result.append(newLine);
+
+ Field[] fields = this.getClass().getDeclaredFields();
+
+ // Print field names paired with their values
+ for (Field field : fields) {
+ result.append(" ");
+ try {
+ result.append(field.getName());
+ result.append(": ");
+ //requires access to private field:
+ result.append(field.get(this));
+ } catch (IllegalAccessException ex) {
+ }
+ result.append(newLine);
+ }
+ result.append("}");
+
+ return result.toString();
+ }
+ }
+
+ private final StateListener mStateListener = new StateListener() {
+ @Override
+ public void onStateChanged(int newState) {
+ setStatusBarState(newState);
+ }
+
+ @Override
+ public void onDozingChanged(boolean isDozing) {
+ setDozing(isDozing);
+ }
+ };
+
+ /**
+ * Custom listener to pipe data back to plugins about whether or not the status bar would be
+ * collapsed if not for the plugin.
+ * TODO: Find cleaner way to do this.
+ */
+ public interface OtherwisedCollapsedListener {
+ void setWouldOtherwiseCollapse(boolean otherwiseCollapse);
+ }
+
+ /**
+ * Listener to indicate forcePluginOpen has changed
+ */
+ public interface ForcePluginOpenListener {
+ /**
+ * Called when mState.forcePluginOpen is changed
+ */
+ void onChange(boolean forceOpen);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java
new file mode 100644
index 000000000000..6979554303b3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java
@@ -0,0 +1,614 @@
+/*
+ * 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.phone;
+
+import android.annotation.ColorInt;
+import android.annotation.DrawableRes;
+import android.annotation.LayoutRes;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Insets;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.view.ActionMode;
+import android.view.DisplayCutout;
+import android.view.InputQueue;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.SurfaceHolder;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.view.Window;
+import android.view.WindowInsets;
+import android.view.WindowInsetsController;
+import android.widget.FrameLayout;
+
+import com.android.internal.view.FloatingActionMode;
+import com.android.internal.widget.FloatingToolbar;
+import com.android.systemui.R;
+
+/**
+ * Combined keyguard and notification panel view. Also holding backdrop and scrims.
+ */
+public class NotificationShadeWindowView extends FrameLayout {
+ public static final String TAG = "NotificationShadeWindowView";
+ public static final boolean DEBUG = StatusBar.DEBUG;
+
+ private int mRightInset = 0;
+ private int mLeftInset = 0;
+
+ // Implements the floating action mode for TextView's Cut/Copy/Past menu. Normally provided by
+ // DecorView, but since this is a special window we have to roll our own.
+ private View mFloatingActionModeOriginatingView;
+ private ActionMode mFloatingActionMode;
+ private FloatingToolbar mFloatingToolbar;
+ private ViewTreeObserver.OnPreDrawListener mFloatingToolbarPreDrawListener;
+
+ private InteractionEventHandler mInteractionEventHandler;
+
+ public NotificationShadeWindowView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setMotionEventSplittingEnabled(false);
+ }
+
+ public NotificationPanelView getNotificationPanelView() {
+ return findViewById(R.id.notification_panel);
+ }
+
+ @Override
+ public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) {
+ final Insets insets = windowInsets.getMaxInsets(WindowInsets.Type.systemBars());
+ if (getFitsSystemWindows()) {
+ boolean paddingChanged = insets.top != getPaddingTop()
+ || insets.bottom != getPaddingBottom();
+
+ int rightCutout = 0;
+ int leftCutout = 0;
+ DisplayCutout displayCutout = getRootWindowInsets().getDisplayCutout();
+ if (displayCutout != null) {
+ leftCutout = displayCutout.getSafeInsetLeft();
+ rightCutout = displayCutout.getSafeInsetRight();
+ }
+
+ int targetLeft = Math.max(insets.left, leftCutout);
+ int targetRight = Math.max(insets.right, rightCutout);
+
+ // Super-special right inset handling, because scrims and backdrop need to ignore it.
+ if (targetRight != mRightInset || targetLeft != mLeftInset) {
+ mRightInset = targetRight;
+ mLeftInset = targetLeft;
+ applyMargins();
+ }
+ // Drop top inset, and pass through bottom inset.
+ if (paddingChanged) {
+ setPadding(0, 0, 0, 0);
+ }
+ } else {
+ if (mRightInset != 0 || mLeftInset != 0) {
+ mRightInset = 0;
+ mLeftInset = 0;
+ applyMargins();
+ }
+ boolean changed = getPaddingLeft() != 0
+ || getPaddingRight() != 0
+ || getPaddingTop() != 0
+ || getPaddingBottom() != 0;
+ if (changed) {
+ setPadding(0, 0, 0, 0);
+ }
+ }
+ return windowInsets;
+ }
+
+ private void applyMargins() {
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ View child = getChildAt(i);
+ if (child.getLayoutParams() instanceof LayoutParams) {
+ LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.ignoreRightInset
+ && (lp.rightMargin != mRightInset || lp.leftMargin != mLeftInset)) {
+ lp.rightMargin = mRightInset;
+ lp.leftMargin = mLeftInset;
+ child.requestLayout();
+ }
+ }
+ }
+ }
+
+ @Override
+ public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ @Override
+ protected FrameLayout.LayoutParams generateDefaultLayoutParams() {
+ return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ setWillNotDraw(!DEBUG);
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ if (mInteractionEventHandler.interceptMediaKey(event)) {
+ return true;
+ }
+
+ if (super.dispatchKeyEvent(event)) {
+ return true;
+ }
+
+ return mInteractionEventHandler.dispatchKeyEvent(event);
+ }
+
+ protected void setInteractionEventHandler(InteractionEventHandler listener) {
+ mInteractionEventHandler = listener;
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ Boolean result = mInteractionEventHandler.handleDispatchTouchEvent(ev);
+
+ return result != null ? result : super.dispatchTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ boolean intercept = mInteractionEventHandler.shouldInterceptTouchEvent(ev);
+ if (!intercept) {
+ intercept = super.onInterceptTouchEvent(ev);
+ }
+ if (intercept) {
+ mInteractionEventHandler.didIntercept(ev);
+ }
+
+ return intercept;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ boolean handled = mInteractionEventHandler.handleTouchEvent(ev);
+
+ if (!handled) {
+ handled = super.onTouchEvent(ev);
+ }
+
+ if (!handled) {
+ mInteractionEventHandler.didNotHandleTouchEvent(ev);
+ }
+
+ return handled;
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ if (DEBUG) {
+ Paint pt = new Paint();
+ pt.setColor(0x80FFFF00);
+ pt.setStrokeWidth(12.0f);
+ pt.setStyle(Paint.Style.STROKE);
+ canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);
+ }
+ }
+
+ class LayoutParams extends FrameLayout.LayoutParams {
+
+ public boolean ignoreRightInset;
+
+ LayoutParams(int width, int height) {
+ super(width, height);
+ }
+
+ LayoutParams(Context c, AttributeSet attrs) {
+ super(c, attrs);
+
+ TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StatusBarWindowView_Layout);
+ ignoreRightInset = a.getBoolean(
+ R.styleable.StatusBarWindowView_Layout_ignoreRightInset, false);
+ a.recycle();
+ }
+ }
+
+ @Override
+ public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback,
+ int type) {
+ if (type == ActionMode.TYPE_FLOATING) {
+ return startActionMode(originalView, callback, type);
+ }
+ return super.startActionModeForChild(originalView, callback, type);
+ }
+
+ private ActionMode createFloatingActionMode(
+ View originatingView, ActionMode.Callback2 callback) {
+ if (mFloatingActionMode != null) {
+ mFloatingActionMode.finish();
+ }
+ cleanupFloatingActionModeViews();
+ mFloatingToolbar = new FloatingToolbar(mFakeWindow);
+ final FloatingActionMode mode =
+ new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar);
+ mFloatingActionModeOriginatingView = originatingView;
+ mFloatingToolbarPreDrawListener =
+ new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ mode.updateViewLocationInWindow();
+ return true;
+ }
+ };
+ return mode;
+ }
+
+ private void setHandledFloatingActionMode(ActionMode mode) {
+ mFloatingActionMode = mode;
+ mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary.
+ mFloatingActionModeOriginatingView.getViewTreeObserver()
+ .addOnPreDrawListener(mFloatingToolbarPreDrawListener);
+ }
+
+ private void cleanupFloatingActionModeViews() {
+ if (mFloatingToolbar != null) {
+ mFloatingToolbar.dismiss();
+ mFloatingToolbar = null;
+ }
+ if (mFloatingActionModeOriginatingView != null) {
+ if (mFloatingToolbarPreDrawListener != null) {
+ mFloatingActionModeOriginatingView.getViewTreeObserver()
+ .removeOnPreDrawListener(mFloatingToolbarPreDrawListener);
+ mFloatingToolbarPreDrawListener = null;
+ }
+ mFloatingActionModeOriginatingView = null;
+ }
+ }
+
+ private ActionMode startActionMode(
+ View originatingView, ActionMode.Callback callback, int type) {
+ ActionMode.Callback2 wrappedCallback = new ActionModeCallback2Wrapper(callback);
+ ActionMode mode = createFloatingActionMode(originatingView, wrappedCallback);
+ if (mode != null && wrappedCallback.onCreateActionMode(mode, mode.getMenu())) {
+ setHandledFloatingActionMode(mode);
+ } else {
+ mode = null;
+ }
+ return mode;
+ }
+
+ private class ActionModeCallback2Wrapper extends ActionMode.Callback2 {
+ private final ActionMode.Callback mWrapped;
+
+ ActionModeCallback2Wrapper(ActionMode.Callback wrapped) {
+ mWrapped = wrapped;
+ }
+
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ return mWrapped.onCreateActionMode(mode, menu);
+ }
+
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ requestFitSystemWindows();
+ return mWrapped.onPrepareActionMode(mode, menu);
+ }
+
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ return mWrapped.onActionItemClicked(mode, item);
+ }
+
+ public void onDestroyActionMode(ActionMode mode) {
+ mWrapped.onDestroyActionMode(mode);
+ if (mode == mFloatingActionMode) {
+ cleanupFloatingActionModeViews();
+ mFloatingActionMode = null;
+ }
+ requestFitSystemWindows();
+ }
+
+ @Override
+ public void onGetContentRect(ActionMode mode, View view, Rect outRect) {
+ if (mWrapped instanceof ActionMode.Callback2) {
+ ((ActionMode.Callback2) mWrapped).onGetContentRect(mode, view, outRect);
+ } else {
+ super.onGetContentRect(mode, view, outRect);
+ }
+ }
+ }
+
+ interface InteractionEventHandler {
+ /**
+ * Returns a result for {@link ViewGroup#dispatchTouchEvent(MotionEvent)} or null to defer
+ * to the super method.
+ */
+ Boolean handleDispatchTouchEvent(MotionEvent ev);
+
+ /**
+ * Returns if the view should intercept the touch event.
+ *
+ * The touch event may still be interecepted if
+ * {@link ViewGroup#onInterceptTouchEvent(MotionEvent)} decides to do so.
+ */
+ boolean shouldInterceptTouchEvent(MotionEvent ev);
+
+ /**
+ * Called when the view decides to intercept the touch event.
+ */
+ void didIntercept(MotionEvent ev);
+
+ boolean handleTouchEvent(MotionEvent ev);
+
+ void didNotHandleTouchEvent(MotionEvent ev);
+
+ boolean interceptMediaKey(KeyEvent event);
+
+ boolean dispatchKeyEvent(KeyEvent event);
+ }
+
+ /**
+ * Minimal window to satisfy FloatingToolbar.
+ */
+ private Window mFakeWindow = new Window(mContext) {
+ @Override
+ public void takeSurface(SurfaceHolder.Callback2 callback) {
+ }
+
+ @Override
+ public void takeInputQueue(InputQueue.Callback callback) {
+ }
+
+ @Override
+ public boolean isFloating() {
+ return false;
+ }
+
+ @Override
+ public void alwaysReadCloseOnTouchAttr() {
+ }
+
+ @Override
+ public void setContentView(@LayoutRes int layoutResID) {
+ }
+
+ @Override
+ public void setContentView(View view) {
+ }
+
+ @Override
+ public void setContentView(View view, ViewGroup.LayoutParams params) {
+ }
+
+ @Override
+ public void addContentView(View view, ViewGroup.LayoutParams params) {
+ }
+
+ @Override
+ public void clearContentView() {
+ }
+
+ @Override
+ public View getCurrentFocus() {
+ return null;
+ }
+
+ @Override
+ public LayoutInflater getLayoutInflater() {
+ return null;
+ }
+
+ @Override
+ public void setTitle(CharSequence title) {
+ }
+
+ @Override
+ public void setTitleColor(@ColorInt int textColor) {
+ }
+
+ @Override
+ public void openPanel(int featureId, KeyEvent event) {
+ }
+
+ @Override
+ public void closePanel(int featureId) {
+ }
+
+ @Override
+ public void togglePanel(int featureId, KeyEvent event) {
+ }
+
+ @Override
+ public void invalidatePanelMenu(int featureId) {
+ }
+
+ @Override
+ public boolean performPanelShortcut(int featureId, int keyCode, KeyEvent event, int flags) {
+ return false;
+ }
+
+ @Override
+ public boolean performPanelIdentifierAction(int featureId, int id, int flags) {
+ return false;
+ }
+
+ @Override
+ public void closeAllPanels() {
+ }
+
+ @Override
+ public boolean performContextMenuIdentifierAction(int id, int flags) {
+ return false;
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ }
+
+ @Override
+ public void setBackgroundDrawable(Drawable drawable) {
+ }
+
+ @Override
+ public void setFeatureDrawableResource(int featureId, @DrawableRes int resId) {
+ }
+
+ @Override
+ public void setFeatureDrawableUri(int featureId, Uri uri) {
+ }
+
+ @Override
+ public void setFeatureDrawable(int featureId, Drawable drawable) {
+ }
+
+ @Override
+ public void setFeatureDrawableAlpha(int featureId, int alpha) {
+ }
+
+ @Override
+ public void setFeatureInt(int featureId, int value) {
+ }
+
+ @Override
+ public void takeKeyEvents(boolean get) {
+ }
+
+ @Override
+ public boolean superDispatchKeyEvent(KeyEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean superDispatchKeyShortcutEvent(KeyEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean superDispatchTouchEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean superDispatchTrackballEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean superDispatchGenericMotionEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public View getDecorView() {
+ return NotificationShadeWindowView.this;
+ }
+
+ @Override
+ public View peekDecorView() {
+ return null;
+ }
+
+ @Override
+ public Bundle saveHierarchyState() {
+ return null;
+ }
+
+ @Override
+ public void restoreHierarchyState(Bundle savedInstanceState) {
+ }
+
+ @Override
+ protected void onActive() {
+ }
+
+ @Override
+ public void setChildDrawable(int featureId, Drawable drawable) {
+ }
+
+ @Override
+ public void setChildInt(int featureId, int value) {
+ }
+
+ @Override
+ public boolean isShortcutKey(int keyCode, KeyEvent event) {
+ return false;
+ }
+
+ @Override
+ public void setVolumeControlStream(int streamType) {
+ }
+
+ @Override
+ public int getVolumeControlStream() {
+ return 0;
+ }
+
+ @Override
+ public int getStatusBarColor() {
+ return 0;
+ }
+
+ @Override
+ public void setStatusBarColor(@ColorInt int color) {
+ }
+
+ @Override
+ public int getNavigationBarColor() {
+ return 0;
+ }
+
+ @Override
+ public void setNavigationBarColor(@ColorInt int color) {
+ }
+
+ @Override
+ public void setDecorCaptionShade(int decorCaptionShade) {
+ }
+
+ @Override
+ public void setResizingCaptionDrawable(Drawable drawable) {
+ }
+
+ @Override
+ public void onMultiWindowModeChanged() {
+ }
+
+ @Override
+ public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+ }
+
+ @Override
+ public void reportActivityRelaunched() {
+ }
+
+ @Override
+ public WindowInsetsController getInsetsController() {
+ return null;
+ }
+ };
+
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
index 4935f0e8dd83..c691a35b566a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
@@ -16,7 +16,10 @@
package com.android.systemui.statusbar.phone;
+import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
+
import android.app.StatusBarManager;
+import android.graphics.RectF;
import android.hardware.display.AmbientDisplayConfiguration;
import android.media.AudioManager;
import android.media.session.MediaSessionLegacyHelper;
@@ -56,9 +59,9 @@ import java.io.PrintWriter;
import javax.inject.Inject;
/**
- * Controller for {@link StatusBarWindowView}.
+ * Controller for {@link NotificationShadeWindowView}.
*/
-public class StatusBarWindowViewController {
+public class NotificationShadeWindowViewController {
private final InjectionInflationController mInjectionInflationController;
private final NotificationWakeUpCoordinator mCoordinator;
private final PulseExpansionHandler mPulseExpansionHandler;
@@ -74,7 +77,7 @@ public class StatusBarWindowViewController {
private final DozeLog mDozeLog;
private final DozeParameters mDozeParameters;
private final CommandQueue mCommandQueue;
- private final StatusBarWindowView mView;
+ private final NotificationShadeWindowView mView;
private final ShadeController mShadeController;
private GestureDetector mGestureDetector;
@@ -93,8 +96,13 @@ public class StatusBarWindowViewController {
private final DockManager mDockManager;
private final NotificationPanelViewController mNotificationPanelViewController;
+ // Used for determining view / touch intersection
+ private int[] mTempLocation = new int[2];
+ private RectF mTempRect = new RectF();
+ private boolean mIsTrackingBarGesture = false;
+
@Inject
- public StatusBarWindowViewController(
+ public NotificationShadeWindowViewController(
InjectionInflationController injectionInflationController,
NotificationWakeUpCoordinator coordinator,
PulseExpansionHandler pulseExpansionHandler,
@@ -112,7 +120,7 @@ public class StatusBarWindowViewController {
CommandQueue commandQueue,
ShadeController shadeController,
DockManager dockManager,
- StatusBarWindowView statusBarWindowView,
+ NotificationShadeWindowView statusBarWindowView,
NotificationPanelViewController notificationPanelViewController) {
mInjectionInflationController = injectionInflationController;
mCoordinator = coordinator;
@@ -182,7 +190,7 @@ public class StatusBarWindowViewController {
};
mGestureDetector = new GestureDetector(mView.getContext(), gestureListener);
- mView.setInteractionEventHandler(new StatusBarWindowView.InteractionEventHandler() {
+ mView.setInteractionEventHandler(new NotificationShadeWindowView.InteractionEventHandler() {
@Override
public Boolean handleDispatchTouchEvent(MotionEvent ev) {
boolean isDown = ev.getActionMasked() == MotionEvent.ACTION_DOWN;
@@ -244,6 +252,26 @@ public class StatusBarWindowViewController {
return mStatusBarView.dispatchTouchEvent(ev);
}
+ if (!mIsTrackingBarGesture && isDown
+ && mNotificationPanelViewController.isFullyCollapsed()) {
+ float x = ev.getRawX();
+ float y = ev.getRawY();
+ if (isIntersecting(mStatusBarView, x, y)) {
+ if (mService.isSameStatusBarState(WINDOW_STATE_SHOWING)) {
+ mIsTrackingBarGesture = true;
+ return mStatusBarView.dispatchTouchEvent(ev);
+ } else { // it's hidden or hiding, don't send to notification shade.
+ return true;
+ }
+ }
+ } else if (mIsTrackingBarGesture) {
+ final boolean sendToNotification = mStatusBarView.dispatchTouchEvent(ev);
+ if (isUp || isCancel) {
+ mIsTrackingBarGesture = false;
+ }
+ return sendToNotification;
+ }
+
return null;
}
@@ -357,7 +385,7 @@ public class StatusBarWindowViewController {
dragDownCallback, mFalsingManager));
}
- public StatusBarWindowView getView() {
+ public NotificationShadeWindowView getView() {
return mView;
}
@@ -414,4 +442,11 @@ public class StatusBarWindowViewController {
void setDragDownHelper(DragDownHelper dragDownHelper) {
mDragDownHelper = dragDownHelper;
}
+
+ private boolean isIntersecting(View view, float x, float y) {
+ mTempLocation = view.getLocationOnScreen();
+ mTempRect.set(mTempLocation[0], mTempLocation[1], mTempLocation[0] + view.getWidth(),
+ mTempLocation[1] + view.getHeight());
+ return mTempRect.contains(x, y);
+ }
}
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 3d8e09afea4d..af46f7bfa82d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
@@ -783,8 +783,7 @@ public abstract class PanelViewController {
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
return;
}
- if (mStatusBar.getStatusBarWindow().getHeight()
- != mStatusBar.getStatusBarHeight()) {
+ if (mStatusBar.getNotificationShadeWindowView().isVisibleToUser()) {
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if (mAnimateAfterExpanding) {
notifyExpandingStarted();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 45f3bf986141..ffbbffc0d8d9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -323,8 +323,7 @@ public class PhoneStatusBarView extends PanelBar {
R.dimen.display_cutout_margin_consumption);
ViewGroup.LayoutParams layoutParams = getLayoutParams();
- layoutParams.height = getResources().getDimensionPixelSize(
- R.dimen.status_bar_height);
+ layoutParams.height = getResources().getDimensionPixelSize(R.dimen.status_bar_height);
setLayoutParams(layoutParams);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java
index 866dc2d51241..333061547d7e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java
@@ -44,7 +44,7 @@ public class ShadeControllerImpl implements ShadeController {
private final CommandQueue mCommandQueue;
private final StatusBarStateController mStatusBarStateController;
- protected final StatusBarWindowController mStatusBarWindowController;
+ protected final NotificationShadeWindowController mNotificationShadeWindowController;
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private final int mDisplayId;
protected final Lazy<StatusBar> mStatusBarLazy;
@@ -57,7 +57,7 @@ public class ShadeControllerImpl implements ShadeController {
public ShadeControllerImpl(
CommandQueue commandQueue,
StatusBarStateController statusBarStateController,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
WindowManager windowManager,
Lazy<StatusBar> statusBarLazy,
@@ -66,7 +66,7 @@ public class ShadeControllerImpl implements ShadeController {
) {
mCommandQueue = commandQueue;
mStatusBarStateController = statusBarStateController;
- mStatusBarWindowController = statusBarWindowController;
+ mNotificationShadeWindowController = notificationShadeWindowController;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mDisplayId = windowManager.getDefaultDisplay().getDisplayId();
// TODO: Remove circular reference to StatusBar when possible.
@@ -122,14 +122,15 @@ public class ShadeControllerImpl implements ShadeController {
}
// TODO(b/62444020): remove when this bug is fixed
- Log.v(TAG, "mStatusBarWindow: " + getStatusBarWindowView() + " canPanelBeCollapsed(): "
+ Log.v(TAG, "NotificationShadeWindow: " + getNotificationShadeWindowView()
+ + " canPanelBeCollapsed(): "
+ getNotificationPanelViewController().canPanelBeCollapsed());
- if (getStatusBarWindowView() != null
+ if (getNotificationShadeWindowView() != null
&& getNotificationPanelViewController().canPanelBeCollapsed()) {
// release focus immediately to kick off focus change transition
- mStatusBarWindowController.setStatusBarFocusable(false);
+ mNotificationShadeWindowController.setNotificationShadeFocusable(false);
- getStatusBar().getStatusBarWindowViewController().cancelExpandHelper();
+ getStatusBar().getNotificationShadeWindowViewController().cancelExpandHelper();
getStatusBarView().collapsePanel(true /* animate */, delayed, speedUpFactor);
} else {
mBubbleControllerLazy.get().collapseStack();
@@ -154,8 +155,7 @@ public class ShadeControllerImpl implements ShadeController {
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
- if (getStatusBar().getStatusBarWindow().getHeight()
- != getStatusBar().getStatusBarHeight()) {
+ if (getStatusBar().getNotificationShadeWindowView().isVisibleToUser()) {
getNotificationPanelViewController().removeOnGlobalLayoutListener(this);
getNotificationPanelViewController().getView().post(executable);
}
@@ -222,8 +222,8 @@ public class ShadeControllerImpl implements ShadeController {
return getStatusBar().getPresenter();
}
- protected StatusBarWindowView getStatusBarWindowView() {
- return getStatusBar().getStatusBarWindow();
+ protected NotificationShadeWindowView getNotificationShadeWindowView() {
+ return getStatusBar().getNotificationShadeWindowView();
}
protected PhoneStatusBarView getStatusBarView() {
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 dc9cf7714e7e..4e8442f14dba 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -342,9 +342,11 @@ public class StatusBar extends SystemUI implements DemoMode,
private final Point mCurrentDisplaySize = new Point();
- protected StatusBarWindowView mStatusBarWindow;
+ protected NotificationShadeWindowView mNotificationShadeWindowView;
+ protected StatusBarWindowView mPhoneStatusBarWindow;
protected PhoneStatusBarView mStatusBarView;
private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
+ protected NotificationShadeWindowController mNotificationShadeWindowController;
protected StatusBarWindowController mStatusBarWindowController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final LockscreenLockIconController mLockscreenLockIconController;
@@ -368,7 +370,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private final FalsingManager mFalsingManager;
private final BroadcastDispatcher mBroadcastDispatcher;
private final ConfigurationController mConfigurationController;
- protected StatusBarWindowViewController mStatusBarWindowViewController;
+ protected NotificationShadeWindowViewController mNotificationShadeWindowViewController;
private final DozeParameters mDozeParameters;
private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
private final Provider<StatusBarComponent.Builder> mStatusBarComponentBuilder;
@@ -503,7 +505,7 @@ public class StatusBar extends SystemUI implements DemoMode,
&& ((info == null && imageWallpaperInAmbient)
|| (info != null && info.supportsAmbientMode()));
- mStatusBarWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
+ mNotificationShadeWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
}
};
@@ -659,7 +661,7 @@ public class StatusBar extends SystemUI implements DemoMode,
Lazy<AssistManager> assistManagerLazy,
NotificationListener notificationListener,
ConfigurationController configurationController,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
LockscreenLockIconController lockscreenLockIconController,
DozeParameters dozeParameters,
ScrimController scrimController,
@@ -740,7 +742,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mAssistManagerLazy = assistManagerLazy;
mNotificationListener = notificationListener;
mConfigurationController = configurationController;
- mStatusBarWindowController = statusBarWindowController;
+ mNotificationShadeWindowController = notificationShadeWindowController;
mLockscreenLockIconController = lockscreenLockIconController;
mDozeServiceHost = dozeServiceHost;
mPowerManager = powerManager;
@@ -912,7 +914,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mKeyguardUpdateMonitor.registerCallback(mUpdateCallback);
mDozeServiceHost.initialize(this, mNotificationIconAreaController,
- mStatusBarKeyguardViewManager, mStatusBarWindowViewController,
+ mStatusBarKeyguardViewManager, mNotificationShadeWindowViewController,
mNotificationPanelViewController, mAmbientIndicationContainer);
mConfigurationController.addCallback(this);
@@ -930,7 +932,8 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void onPluginConnected(OverlayPlugin plugin, Context pluginContext) {
mMainThreadHandler.post(
- () -> plugin.setup(getStatusBarWindow(), getNavigationBarView(),
+ () -> plugin.setup(getNotificationShadeWindowView(),
+ getNavigationBarView(),
new Callback(plugin), mDozeParameters));
}
@@ -938,7 +941,8 @@ public class StatusBar extends SystemUI implements DemoMode,
public void onPluginDisconnected(OverlayPlugin plugin) {
mMainThreadHandler.post(() -> {
mOverlays.remove(plugin);
- mStatusBarWindowController.setForcePluginOpen(mOverlays.size() != 0);
+ mNotificationShadeWindowController
+ .setForcePluginOpen(mOverlays.size() != 0);
});
}
@@ -957,10 +961,10 @@ public class StatusBar extends SystemUI implements DemoMode,
mOverlays.remove(mPlugin);
}
mMainThreadHandler.post(() -> {
- mStatusBarWindowController
+ mNotificationShadeWindowController
.setStateListener(b -> mOverlays.forEach(
o -> o.setCollapseDesired(b)));
- mStatusBarWindowController
+ mNotificationShadeWindowController
.setForcePluginOpen(mOverlays.size() != 0);
});
}
@@ -978,12 +982,13 @@ public class StatusBar extends SystemUI implements DemoMode,
updateTheme();
inflateStatusBarWindow();
- mStatusBarWindowViewController.setService(this);
- mStatusBarWindow.setOnTouchListener(getStatusBarWindowTouchListener());
+ mNotificationShadeWindowViewController.setService(this);
+ mNotificationShadeWindowView.setOnTouchListener(getStatusBarWindowTouchListener());
// TODO: Deal with the ugliness that comes from having some of the statusbar broken out
// into fragments, but the rest here, it leaves some awkward lifecycle and whatnot.
- mStackScroller = mStatusBarWindow.findViewById(R.id.notification_stack_scroller);
+ mStackScroller = mNotificationShadeWindowView.findViewById(
+ R.id.notification_stack_scroller);
NotificationListContainer notifListContainer = (NotificationListContainer) mStackScroller;
mNotificationLogger.setUpWithContainer(notifListContainer);
@@ -1004,17 +1009,18 @@ public class StatusBar extends SystemUI implements DemoMode,
// Allow plugins to reference DarkIconDispatcher and StatusBarStateController
mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class);
mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class);
- FragmentHostManager.get(mStatusBarWindow)
+ FragmentHostManager.get(mPhoneStatusBarWindow)
.addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
CollapsedStatusBarFragment statusBarFragment =
(CollapsedStatusBarFragment) fragment;
- statusBarFragment.initNotificationIconArea(mNotificationIconAreaController);
+
PhoneStatusBarView oldStatusBarView = mStatusBarView;
- mStatusBarView = (PhoneStatusBarView) fragment.getView();
+ mStatusBarView = (PhoneStatusBarView) statusBarFragment.getView();
mStatusBarView.setBar(this);
mStatusBarView.setPanel(mNotificationPanelViewController);
mStatusBarView.setScrimController(mScrimController);
+ statusBarFragment.initNotificationIconArea(mNotificationIconAreaController);
// CollapsedStatusBarFragment re-inflated PhoneStatusBarView and both of
// mStatusBarView.mExpanded and mStatusBarView.mBouncerShowing are false.
// PhoneStatusBarView's new instance will set to be gone in
@@ -1038,16 +1044,18 @@ public class StatusBar extends SystemUI implements DemoMode,
mHeadsUpAppearanceController.destroy();
}
// TODO: this should probably be scoped to the StatusBarComponent
+ // TODO (b/136993073) Separate notification shade and status bar
mHeadsUpAppearanceController = new HeadsUpAppearanceController(
- mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow,
+ mNotificationIconAreaController, mHeadsUpManager,
+ mNotificationShadeWindowView,
mStatusBarStateController, mKeyguardBypassController,
mKeyguardStateController, mWakeUpCoordinator, mCommandQueue,
- mNotificationPanelViewController);
+ mNotificationPanelViewController, mStatusBarView);
mHeadsUpAppearanceController.readFrom(oldController);
mLightsOutNotifController.setLightsOutNotifView(
mStatusBarView.findViewById(R.id.notification_lights_out));
- mStatusBarWindowViewController.setStatusBarView(mStatusBarView);
+ mNotificationShadeWindowViewController.setStatusBarView(mStatusBarView);
checkBarModes();
}).getFragmentManager()
.beginTransaction()
@@ -1055,7 +1063,8 @@ public class StatusBar extends SystemUI implements DemoMode,
CollapsedStatusBarFragment.TAG)
.commit();
- mHeadsUpManager.setUp(mStatusBarWindow, mGroupManager, this, mVisualStabilityManager);
+ mHeadsUpManager.setUp(mNotificationShadeWindowView, mGroupManager, this,
+ mVisualStabilityManager);
mConfigurationController.addCallback(mHeadsUpManager);
mHeadsUpManager.addListener(this);
mHeadsUpManager.addListener(mNotificationPanelViewController.getOnHeadsUpChangedListener());
@@ -1075,12 +1084,12 @@ public class StatusBar extends SystemUI implements DemoMode,
mKeyguardIndicationController =
SystemUIFactory.getInstance().createKeyguardIndicationController(mContext,
- mStatusBarWindow.findViewById(R.id.keyguard_indication_area),
- mStatusBarWindow.findViewById(R.id.lock_icon));
+ mNotificationShadeWindowView.findViewById(R.id.keyguard_indication_area),
+ mNotificationShadeWindowView.findViewById(R.id.lock_icon));
mNotificationPanelViewController.setKeyguardIndicationController(
mKeyguardIndicationController);
- mAmbientIndicationContainer = mStatusBarWindow.findViewById(
+ mAmbientIndicationContainer = mNotificationShadeWindowView.findViewById(
R.id.ambient_indication_container);
// TODO: Find better place for this callback.
@@ -1101,13 +1110,13 @@ public class StatusBar extends SystemUI implements DemoMode,
mAutoHideController.setStatusBar(this);
- ScrimView scrimBehind = mStatusBarWindow.findViewById(R.id.scrim_behind);
- ScrimView scrimInFront = mStatusBarWindow.findViewById(R.id.scrim_in_front);
- ScrimView scrimForBubble = mStatusBarWindow.findViewById(R.id.scrim_for_bubble);
+ ScrimView scrimBehind = mNotificationShadeWindowView.findViewById(R.id.scrim_behind);
+ ScrimView scrimInFront = mNotificationShadeWindowView.findViewById(R.id.scrim_in_front);
+ ScrimView scrimForBubble = mNotificationShadeWindowView.findViewById(R.id.scrim_for_bubble);
mScrimController.setScrimVisibleListener(scrimsVisible -> {
- mStatusBarWindowController.setScrimsVisibility(scrimsVisible);
- if (mStatusBarWindow != null) {
+ mNotificationShadeWindowController.setScrimsVisibility(scrimsVisible);
+ if (mNotificationShadeWindowView != null) {
mLockscreenLockIconController.onScrimVisibilityChanged(scrimsVisible);
}
});
@@ -1116,7 +1125,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mNotificationPanelViewController.initDependencies(this, mGroupManager, mNotificationShelf,
mNotificationIconAreaController, mScrimController);
- BackDropView backdrop = mStatusBarWindow.findViewById(R.id.backdrop);
+ BackDropView backdrop = mNotificationShadeWindowView.findViewById(R.id.backdrop);
mMediaManager.setup(backdrop, backdrop.findViewById(R.id.backdrop_front),
backdrop.findViewById(R.id.backdrop_back), mScrimController, mLockscreenWallpaper);
@@ -1129,7 +1138,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mLockscreenLockIconController::onShowingLaunchAffordanceChanged);
// Set up the quick settings tile panel
- View container = mStatusBarWindow.findViewById(R.id.qs_frame);
+ final View container = mNotificationShadeWindowView.findViewById(R.id.qs_frame);
if (container != null) {
FragmentHostManager fragmentHostManager = FragmentHostManager.get(container);
ExtensionFragmentListener.attachExtensonToFragment(container, QS.TAG, R.id.qs_frame,
@@ -1138,7 +1147,8 @@ public class StatusBar extends SystemUI implements DemoMode,
.withPlugin(QS.class)
.withDefault(this::createDefaultQSFragment)
.build());
- mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindow,
+ mBrightnessMirrorController = new BrightnessMirrorController(
+ mNotificationShadeWindowView,
mNotificationPanelViewController,
(visible) -> {
mBrightnessMirrorVisible = visible;
@@ -1153,7 +1163,8 @@ public class StatusBar extends SystemUI implements DemoMode,
});
}
- mReportRejectedTouch = mStatusBarWindow.findViewById(R.id.report_rejected_touch);
+ mReportRejectedTouch = mNotificationShadeWindowView
+ .findViewById(R.id.report_rejected_touch);
if (mReportRejectedTouch != null) {
updateReportRejectedTouchVisibility();
mReportRejectedTouch.setOnClickListener(v -> {
@@ -1227,18 +1238,18 @@ public class StatusBar extends SystemUI implements DemoMode,
}
protected QS createDefaultQSFragment() {
- return FragmentHostManager.get(mStatusBarWindow).create(QSFragment.class);
+ return FragmentHostManager.get(mNotificationShadeWindowView).create(QSFragment.class);
}
private void setUpPresenter() {
// Set up the initial notification state.
mActivityLaunchAnimator = new ActivityLaunchAnimator(
- mStatusBarWindowViewController, this, mNotificationPanelViewController,
+ mNotificationShadeWindowViewController, this, mNotificationPanelViewController,
(NotificationListContainer) mStackScroller);
// TODO: inject this.
mPresenter = new StatusBarNotificationPresenter(mContext, mNotificationPanelViewController,
- mHeadsUpManager, mStatusBarWindow, mStackScroller, mDozeScrimController,
+ mHeadsUpManager, mNotificationShadeWindowView, mStackScroller, mDozeScrimController,
mScrimController, mActivityLaunchAnimator, mDynamicPrivacyController,
mNotificationAlertingManager, mNotificationRowBinder, mKeyguardStateController,
mKeyguardIndicationController,
@@ -1251,7 +1262,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mDeviceProvisionedController);
mNotificationShelf.setOnActivatedListener(mPresenter);
- mRemoteInputManager.getController().addCallback(mStatusBarWindowController);
+ mRemoteInputManager.getController().addCallback(mNotificationShadeWindowController);
mNotificationActivityStarter =
mStatusBarNotificationActivityStarterBuilder
@@ -1328,7 +1339,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mShadeController.animateCollapsePanels();
}
}
- return mStatusBarWindow.onTouchEvent(event);
+ return mNotificationShadeWindowView.onTouchEvent(event);
};
}
@@ -1384,17 +1395,20 @@ public class StatusBar extends SystemUI implements DemoMode,
protected void createUserSwitcher() {
mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext,
- mStatusBarWindow.findViewById(R.id.keyguard_user_switcher),
- mStatusBarWindow.findViewById(R.id.keyguard_header),
+ mNotificationShadeWindowView.findViewById(R.id.keyguard_user_switcher),
+ mNotificationShadeWindowView.findViewById(R.id.keyguard_header),
mNotificationPanelViewController);
}
private void inflateStatusBarWindow() {
- mStatusBarWindow = mSuperStatusBarViewFactory.getStatusBarWindowView();
+ mNotificationShadeWindowView = mSuperStatusBarViewFactory.getNotificationShadeWindowView();
StatusBarComponent statusBarComponent = mStatusBarComponentBuilder.get()
- .statusBarWindowView(mStatusBarWindow).build();
- mStatusBarWindowViewController = statusBarComponent.getStatusBarWindowViewController();
- mStatusBarWindowViewController.setupExpandedStatusBar();
+ .statusBarWindowView(mNotificationShadeWindowView).build();
+ mNotificationShadeWindowViewController = statusBarComponent
+ .getNotificationShadeWindowViewController();
+ mNotificationShadeWindowViewController.setupExpandedStatusBar();
+ mStatusBarWindowController = statusBarComponent.getStatusBarWindowController();
+ mPhoneStatusBarWindow = mSuperStatusBarViewFactory.getStatusBarWindowView();
mNotificationPanelViewController = statusBarComponent.getNotificationPanelViewController();
}
@@ -1404,7 +1418,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mStatusBarKeyguardViewManager.registerStatusBar(
/* statusBar= */ this, getBouncerContainer(),
mNotificationPanelViewController, mBiometricUnlockController,
- mDismissCallbackRegistry, mStatusBarWindow.findViewById(R.id.lock_icon_container),
+ mDismissCallbackRegistry,
+ mNotificationShadeWindowView.findViewById(R.id.lock_icon_container),
mStackScroller, mKeyguardBypassController, mFalsingManager);
mKeyguardIndicationController
.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
@@ -1422,16 +1437,20 @@ public class StatusBar extends SystemUI implements DemoMode,
return mStatusBarView;
}
+ public NotificationShadeWindowView getNotificationShadeWindowView() {
+ return mNotificationShadeWindowView;
+ }
+
public StatusBarWindowView getStatusBarWindow() {
- return mStatusBarWindow;
+ return mPhoneStatusBarWindow;
}
- public StatusBarWindowViewController getStatusBarWindowViewController() {
- return mStatusBarWindowViewController;
+ public NotificationShadeWindowViewController getNotificationShadeWindowViewController() {
+ return mNotificationShadeWindowViewController;
}
protected ViewGroup getBouncerContainer() {
- return mStatusBarWindow;
+ return mNotificationShadeWindowView;
}
public int getStatusBarHeight() {
@@ -1641,7 +1660,7 @@ public class StatusBar extends SystemUI implements DemoMode,
}
public void setQsExpanded(boolean expanded) {
- mStatusBarWindowController.setQsExpanded(expanded);
+ mNotificationShadeWindowController.setQsExpanded(expanded);
mNotificationPanelViewController.setStatusAccessibilityImportance(expanded
? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
: View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
@@ -1674,7 +1693,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) {
if (inPinnedMode) {
- mStatusBarWindowController.setHeadsUpShowing(true);
+ mNotificationShadeWindowController.setHeadsUpShowing(true);
mStatusBarWindowController.setForceStatusBarVisible(true);
if (mNotificationPanelViewController.isFullyCollapsed()) {
// We need to ensure that the touchable region is updated before the window will be
@@ -1682,9 +1701,9 @@ public class StatusBar extends SystemUI implements DemoMode,
// onComputeInternalInsets will be called and after that we can resize the layout. Let's
// make sure that the window stays small for one frame until the touchableRegion is set.
mNotificationPanelViewController.getView().requestLayout();
- mStatusBarWindowController.setForceWindowCollapsed(true);
+ mNotificationShadeWindowController.setForceWindowCollapsed(true);
mNotificationPanelViewController.getView().post(() -> {
- mStatusBarWindowController.setForceWindowCollapsed(false);
+ mNotificationShadeWindowController.setForceWindowCollapsed(false);
});
}
} else {
@@ -1694,7 +1713,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|| mNotificationPanelViewController.isTracking() || bypassKeyguard) {
// We are currently tracking or is open and the shade doesn't need to be kept
// open artificially.
- mStatusBarWindowController.setHeadsUpShowing(false);
+ mNotificationShadeWindowController.setHeadsUpShowing(false);
if (bypassKeyguard) {
mStatusBarWindowController.setForceStatusBarVisible(false);
}
@@ -1704,7 +1723,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mHeadsUpManager.setHeadsUpGoingAway(true);
mNotificationPanelViewController.runAfterAnimationFinished(() -> {
if (!mHeadsUpManager.hasPinnedHeadsUp()) {
- mStatusBarWindowController.setHeadsUpShowing(false);
+ mNotificationShadeWindowController.setHeadsUpShowing(false);
mHeadsUpManager.setHeadsUpGoingAway(false);
}
mRemoteInputManager.onPanelCollapsed();
@@ -1732,7 +1751,7 @@ public class StatusBar extends SystemUI implements DemoMode,
public void setPanelExpanded(boolean isExpanded) {
mPanelExpanded = isExpanded;
updateHideIconsForBouncer(false /* animate */);
- mStatusBarWindowController.setPanelExpanded(isExpanded);
+ mNotificationShadeWindowController.setPanelExpanded(isExpanded);
mVisualStabilityManager.setPanelExpanded(isExpanded);
if (isExpanded && mStatusBarStateController.getState() != StatusBarState.KEYGUARD) {
if (DEBUG) {
@@ -1991,7 +2010,7 @@ public class StatusBar extends SystemUI implements DemoMode,
// Expand the window to encompass the full screen in anticipation of the drag.
// This is only possible to do atomically because the status bar is at the top of the screen!
- mStatusBarWindowController.setPanelVisible(true);
+ mNotificationShadeWindowController.setPanelVisible(true);
visibilityChanged(true);
mCommandQueue.recomputeDisableFlags(mDisplayId, !force /* animate */);
@@ -2100,7 +2119,7 @@ public class StatusBar extends SystemUI implements DemoMode,
if (SPEW) Log.d(TAG, "makeExpandedInvisible: mExpandedVisible=" + mExpandedVisible
+ " mExpandedVisible=" + mExpandedVisible);
- if (!mExpandedVisible || mStatusBarWindow == null) {
+ if (!mExpandedVisible || mNotificationShadeWindowView == null) {
return;
}
@@ -2113,8 +2132,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mExpandedVisible = false;
visibilityChanged(false);
- // Shrink the window to the size of the status bar only
- mStatusBarWindowController.setPanelVisible(false);
+ // Update the visibility of notification shade and status bar window.
+ mNotificationShadeWindowController.setPanelVisible(false);
mStatusBarWindowController.setForceStatusBarVisible(false);
// Close any guts that might be visible
@@ -2178,6 +2197,10 @@ public class StatusBar extends SystemUI implements DemoMode,
return false;
}
+ boolean isSameStatusBarState(int state) {
+ return mStatusBarWindowState == state;
+ }
+
public GestureRecorder getGestureRecorder() {
return mGestureRec;
}
@@ -2193,7 +2216,7 @@ public class StatusBar extends SystemUI implements DemoMode,
return;
}
boolean showing = state == WINDOW_STATE_SHOWING;
- if (mStatusBarWindow != null
+ if (mNotificationShadeWindowView != null
&& window == StatusBarManager.WINDOW_STATUS_BAR
&& mStatusBarWindowState != state) {
mStatusBarWindowState = state;
@@ -2427,8 +2450,8 @@ public class StatusBar extends SystemUI implements DemoMode,
dumpBarTransitions(pw, "mStatusBarView", mStatusBarView.getBarTransitions());
}
pw.println(" StatusBarWindowView: ");
- if (mStatusBarWindowViewController != null) {
- mStatusBarWindowViewController.dump(fd, pw, args);
+ if (mNotificationShadeWindowViewController != null) {
+ mNotificationShadeWindowViewController.dump(fd, pw, args);
}
pw.println(" mMediaManager: ");
@@ -2527,6 +2550,7 @@ public class StatusBar extends SystemUI implements DemoMode,
public void createAndAddWindows(@Nullable RegisterStatusBarResult result) {
makeStatusBarView(result);
+ mNotificationShadeWindowController.attach();
mStatusBarWindowController.attach();
}
@@ -2690,8 +2714,8 @@ public class StatusBar extends SystemUI implements DemoMode,
}
}
else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
- if (mStatusBarWindowController != null) {
- mStatusBarWindowController.setNotTouchable(false);
+ if (mNotificationShadeWindowController != null) {
+ mNotificationShadeWindowController.setNotTouchable(false);
}
if (mBubbleController.isStackExpanded()) {
mBubbleController.collapseStack();
@@ -2808,7 +2832,9 @@ public class StatusBar extends SystemUI implements DemoMode,
mQSPanel.updateResources();
}
- mStatusBarWindowController.refreshStatusBarHeight();
+ if (mStatusBarWindowController != null) {
+ mStatusBarWindowController.refreshStatusBarHeight();
+ }
if (mStatusBarView != null) {
mStatusBarView.updateResources();
@@ -3518,7 +3544,7 @@ public class StatusBar extends SystemUI implements DemoMode,
if (!mPresenter.isPresenterFullyCollapsed()) {
// if we set it not to be focusable when collapsing, we have to undo it when we aborted
// the closing
- mStatusBarWindowController.setStatusBarFocusable(true);
+ mNotificationShadeWindowController.setNotificationShadeFocusable(true);
}
}
@@ -3631,7 +3657,7 @@ public class StatusBar extends SystemUI implements DemoMode,
*/
public void collapseShade() {
if (mNotificationPanelViewController.isTracking()) {
- mStatusBarWindowViewController.cancelCurrentTouch();
+ mNotificationShadeWindowViewController.cancelCurrentTouch();
}
if (mPanelExpanded && mState == StatusBarState.SHADE) {
mShadeController.animateCollapsePanels();
@@ -3652,7 +3678,7 @@ public class StatusBar extends SystemUI implements DemoMode,
updateVisibleToUser();
updateNotificationPanelTouchState();
- mStatusBarWindowViewController.cancelCurrentTouch();
+ mNotificationShadeWindowViewController.cancelCurrentTouch();
if (mLaunchCameraOnFinishedGoingToSleep) {
mLaunchCameraOnFinishedGoingToSleep = false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 407d25691798..de37cd955f9a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -92,7 +92,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
private static String TAG = "StatusBarKeyguardViewManager";
protected final Context mContext;
- private final StatusBarWindowController mStatusBarWindowController;
+ private final NotificationShadeWindowController mNotificationShadeWindowController;
private final BouncerExpansionCallback mExpansionCallback = new BouncerExpansionCallback() {
@Override
public void onFullyShown() {
@@ -199,13 +199,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
KeyguardUpdateMonitor keyguardUpdateMonitor,
NavigationModeController navigationModeController,
DockManager dockManager,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
KeyguardStateController keyguardStateController,
NotificationMediaManager notificationMediaManager) {
mContext = context;
mViewMediatorCallback = callback;
mLockPatternUtils = lockPatternUtils;
- mStatusBarWindowController = statusBarWindowController;
+ mNotificationShadeWindowController = notificationShadeWindowController;
mKeyguardStateController = keyguardStateController;
mMediaManager = notificationMediaManager;
mKeyguardUpdateManager = keyguardUpdateMonitor;
@@ -315,7 +315,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
*/
public void show(Bundle options) {
mShowing = true;
- mStatusBarWindowController.setKeyguardShowing(true);
+ mNotificationShadeWindowController.setKeyguardShowing(true);
mKeyguardStateController.notifyKeyguardState(mShowing,
mKeyguardStateController.isOccluded());
reset(true /* hideBouncerWhenShowing */);
@@ -491,11 +491,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
public void setNeedsInput(boolean needsInput) {
- mStatusBarWindowController.setKeyguardNeedsInput(needsInput);
+ mNotificationShadeWindowController.setKeyguardNeedsInput(needsInput);
}
public boolean isUnlockWithWallpaper() {
- return mStatusBarWindowController.isShowingWallpaper();
+ return mNotificationShadeWindowController.isShowingWallpaper();
}
public void setOccluded(boolean occluded, boolean animate) {
@@ -509,7 +509,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
new Runnable() {
@Override
public void run() {
- mStatusBarWindowController.setKeyguardOccluded(mOccluded);
+ mNotificationShadeWindowController.setKeyguardOccluded(mOccluded);
reset(true /* hideBouncerWhenShowing */);
}
});
@@ -524,7 +524,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
if (mShowing) {
mMediaManager.updateMediaMetaData(false, animate && !occluded);
}
- mStatusBarWindowController.setKeyguardOccluded(occluded);
+ mNotificationShadeWindowController.setKeyguardOccluded(occluded);
// setDozing(false) will call reset once we stop dozing.
if (!mDozing) {
@@ -578,8 +578,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
@Override
public void run() {
- mStatusBarWindowController.setKeyguardShowing(false);
- mStatusBarWindowController.setKeyguardFadingAway(true);
+ mNotificationShadeWindowController.setKeyguardShowing(false);
+ mNotificationShadeWindowController.setKeyguardFadingAway(true);
hideBouncer(true /* destroyView */);
updateStates();
}
@@ -587,7 +587,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
@Override
public void run() {
mStatusBar.hideKeyguard();
- mStatusBarWindowController.setKeyguardFadingAway(false);
+ mNotificationShadeWindowController.setKeyguardFadingAway(false);
mViewMediatorCallback.keyguardGone();
executeAfterKeyguardGoneAction();
}
@@ -624,7 +624,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
} else {
boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide();
if (!staying) {
- mStatusBarWindowController.setKeyguardFadingAway(true);
+ mNotificationShadeWindowController.setKeyguardFadingAway(true);
if (needsFading) {
ViewGroupFadeHelper.fadeOutAllChildrenExcept(
mNotificationPanelViewController.getView(),
@@ -650,7 +650,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
updateLockIcon();
updateStates();
- mStatusBarWindowController.setKeyguardShowing(false);
+ mNotificationShadeWindowController.setKeyguardShowing(false);
mViewMediatorCallback.keyguardGone();
}
StatsLog.write(StatsLog.KEYGUARD_STATE_CHANGED,
@@ -684,8 +684,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
public void onKeyguardFadedAway() {
- mContainer.postDelayed(() -> mStatusBarWindowController.setKeyguardFadingAway(false),
- 100);
+ mContainer.postDelayed(() -> mNotificationShadeWindowController
+ .setKeyguardFadingAway(false), 100);
ViewGroupFadeHelper.reset(mNotificationPanelViewController.getView());
mStatusBar.finishKeyguardFadingAway();
mBiometricUnlockController.finishKeyguardFadingAway();
@@ -818,7 +818,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
- mStatusBarWindowController.setBouncerShowing(bouncerShowing);
+ mNotificationShadeWindowController.setBouncerShowing(bouncerShowing);
mStatusBar.setBouncerShowing(bouncerShowing);
updateLockIcon();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java
index b4d5dadda5b8..7615bf826287 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java
@@ -151,7 +151,7 @@ public class StatusBarModule {
Lazy<AssistManager> assistManagerLazy,
NotificationListener notificationListener,
ConfigurationController configurationController,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
LockscreenLockIconController lockscreenLockIconController,
DozeParameters dozeParameters,
ScrimController scrimController,
@@ -233,7 +233,7 @@ public class StatusBarModule {
assistManagerLazy,
notificationListener,
configurationController,
- statusBarWindowController,
+ notificationShadeWindowController,
lockscreenLockIconController,
dozeParameters,
scrimController,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index 720f22964915..1336b2de82d3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -134,7 +134,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
public StatusBarNotificationPresenter(Context context,
NotificationPanelViewController panel,
HeadsUpManagerPhone headsUp,
- StatusBarWindowView statusBarWindow,
+ NotificationShadeWindowView statusBarWindow,
ViewGroup stackScroller,
DozeScrimController dozeScrimController,
ScrimController scrimController,
@@ -191,7 +191,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
Dependency.get(NotificationRemoteInputManager.Callback.class),
mNotificationPanel.createRemoteInputDelegate());
remoteInputManager.getController().addCallback(
- Dependency.get(StatusBarWindowController.class));
+ Dependency.get(NotificationShadeWindowController.class));
NotificationListContainer notifListContainer = (NotificationListContainer) stackScroller;
initController.addPostInitTask(() -> {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
index 3d25749265f1..b8fb6d3ebacf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
@@ -17,15 +17,13 @@
package com.android.systemui.statusbar.phone;
import android.annotation.NonNull;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
import com.android.systemui.Dependency;
+import com.android.systemui.R;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
@@ -38,60 +36,62 @@ public final class StatusBarTouchableRegionManager implements
OnComputeInternalInsetsListener, ConfigurationListener {
private final BubbleController mBubbleController = Dependency.get(BubbleController.class);
- private final Context mContext;
private final HeadsUpManagerPhone mHeadsUpManager;
private boolean mIsStatusBarExpanded = false;
private boolean mShouldAdjustInsets = false;
private final StatusBar mStatusBar;
- private int mStatusBarHeight;
- private final View mStatusBarWindowView;
+ private final View mNotificationShadeWindowView;
+ private View mNotificationPanelView;
private boolean mForceCollapsedUntilLayout = false;
- private final StatusBarWindowController mStatusBarWindowController;
+ private final NotificationShadeWindowController mNotificationShadeWindowController;
- public StatusBarTouchableRegionManager(@NonNull Context context,
- HeadsUpManagerPhone headsUpManager,
+ public StatusBarTouchableRegionManager(HeadsUpManagerPhone headsUpManager,
@NonNull StatusBar statusBar,
- @NonNull View statusBarWindowView) {
- mContext = context;
+ @NonNull View notificationShadeWindowView) {
mHeadsUpManager = headsUpManager;
mStatusBar = statusBar;
- mStatusBarWindowView = statusBarWindowView;
- mStatusBarWindowController = Dependency.get(StatusBarWindowController.class);
-
- initResources();
+ mNotificationShadeWindowView = notificationShadeWindowView;
+ mNotificationShadeWindowController =
+ Dependency.get(NotificationShadeWindowController.class);
mBubbleController.setBubbleStateChangeListener((hasBubbles) -> {
updateTouchableRegion();
});
- mStatusBarWindowController.setForcePluginOpenListener((forceOpen) -> {
+ mNotificationShadeWindowController.setForcePluginOpenListener((forceOpen) -> {
updateTouchableRegion();
});
Dependency.get(ConfigurationController.class).addCallback(this);
+ if (mNotificationShadeWindowView != null) {
+ mNotificationPanelView = mNotificationShadeWindowView.findViewById(
+ R.id.notification_panel);
+ }
}
/**
* Set the touchable portion of the status bar based on what elements are visible.
*/
public void updateTouchableRegion() {
- boolean hasCutoutInset = (mStatusBarWindowView != null)
- && (mStatusBarWindowView.getRootWindowInsets() != null)
- && (mStatusBarWindowView.getRootWindowInsets().getDisplayCutout() != null);
+ boolean hasCutoutInset = (mNotificationShadeWindowView != null)
+ && (mNotificationShadeWindowView.getRootWindowInsets() != null)
+ && (mNotificationShadeWindowView.getRootWindowInsets().getDisplayCutout() != null);
boolean shouldObserve =
mHeadsUpManager.hasPinnedHeadsUp() || mHeadsUpManager.isHeadsUpGoingAway()
|| mBubbleController.hasBubbles()
|| mForceCollapsedUntilLayout
|| hasCutoutInset
- || mStatusBarWindowController.getForcePluginOpen();
+ || mNotificationShadeWindowController.getForcePluginOpen();
if (shouldObserve == mShouldAdjustInsets) {
return;
}
if (shouldObserve) {
- mStatusBarWindowView.getViewTreeObserver().addOnComputeInternalInsetsListener(this);
- mStatusBarWindowView.requestLayout();
+ mNotificationShadeWindowView.getViewTreeObserver()
+ .addOnComputeInternalInsetsListener(this);
+ mNotificationShadeWindowView.requestLayout();
} else {
- mStatusBarWindowView.getViewTreeObserver().removeOnComputeInternalInsetsListener(this);
+ mNotificationShadeWindowView.getViewTreeObserver()
+ .removeOnComputeInternalInsetsListener(this);
}
mShouldAdjustInsets = shouldObserve;
}
@@ -100,19 +100,20 @@ public final class StatusBarTouchableRegionManager implements
* Calls {@code updateTouchableRegion()} after a layout pass completes.
*/
public void updateTouchableRegionAfterLayout() {
- mForceCollapsedUntilLayout = true;
- mStatusBarWindowView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
- @Override
- public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft,
- int oldTop, int oldRight, int oldBottom) {
- if (mStatusBarWindowView.getHeight() <= mStatusBarHeight) {
- mStatusBarWindowView.removeOnLayoutChangeListener(this);
- mForceCollapsedUntilLayout = false;
- updateTouchableRegion();
+ if (mNotificationPanelView != null) {
+ mForceCollapsedUntilLayout = true;
+ mNotificationPanelView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ if (!mNotificationPanelView.isVisibleToUser()) {
+ mNotificationPanelView.removeOnLayoutChangeListener(this);
+ mForceCollapsedUntilLayout = false;
+ updateTouchableRegion();
+ }
}
- }
- });
+ });
+ }
}
/**
@@ -145,25 +146,4 @@ public final class StatusBarTouchableRegionManager implements
info.touchableRegion.union(bubbleRect);
}
}
-
- @Override
- public void onConfigChanged(Configuration newConfig) {
- initResources();
- }
-
- @Override
- public void onDensityOrFontScaleChanged() {
- initResources();
- }
-
- @Override
- public void onOverlayChanged() {
- initResources();
- }
-
- private void initResources() {
- Resources resources = mContext.getResources();
- mStatusBarHeight = resources.getDimensionPixelSize(
- com.android.internal.R.dimen.status_bar_height);
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java
index ce498a39d941..7cf5147a9f26 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * 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.
@@ -11,55 +11,25 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
*/
package com.android.systemui.statusbar.phone;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
-import static com.android.systemui.DejankUtils.whitelistIpcs;
-import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT;
-
-import android.app.IActivityManager;
import android.content.Context;
-import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.os.Binder;
-import android.os.RemoteException;
-import android.os.SystemProperties;
-import android.os.Trace;
import android.util.Log;
-import android.view.Display;
import android.view.Gravity;
-import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import com.android.systemui.Dumpable;
-import com.android.systemui.R;
-import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
-import com.android.systemui.statusbar.RemoteInputController.Callback;
-import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SuperStatusBarViewFactory;
-import com.android.systemui.statusbar.SysuiStatusBarStateController;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
-
-import com.google.android.collect.Lists;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -68,101 +38,36 @@ import javax.inject.Singleton;
* Encapsulates all logic for the status bar window state management.
*/
@Singleton
-public class StatusBarWindowController implements Callback, Dumpable, ConfigurationListener {
-
+public class StatusBarWindowController {
private static final String TAG = "StatusBarWindowController";
private static final boolean DEBUG = false;
private final Context mContext;
private final WindowManager mWindowManager;
- private final IActivityManager mActivityManager;
- private final DozeParameters mDozeParameters;
- private final LayoutParams mLpChanged;
- private final boolean mKeyguardScreenRotation;
- private final long mLockScreenDisplayTimeout;
- private final Display.Mode mKeyguardDisplayMode;
- private final KeyguardBypassController mKeyguardBypassController;
- private ViewGroup mStatusBarView;
- private LayoutParams mLp;
- private boolean mHasTopUi;
- private boolean mHasTopUiChanged;
+ private final SuperStatusBarViewFactory mSuperStatusBarViewFactory;
+ private final Resources mResources;
private int mBarHeight = -1;
- private float mScreenBrightnessDoze;
private final State mCurrentState = new State();
- private OtherwisedCollapsedListener mListener;
- private ForcePluginOpenListener mForcePluginOpenListener;
- private final ArrayList<WeakReference<StatusBarWindowCallback>>
- mCallbacks = Lists.newArrayList();
- private final SysuiColorExtractor mColorExtractor;
- private final SuperStatusBarViewFactory mSuperStatusBarViewFactory;
- private final Resources mResources;
+ private ViewGroup mStatusBarView;
+ private WindowManager.LayoutParams mLp;
+ private final WindowManager.LayoutParams mLpChanged;
@Inject
public StatusBarWindowController(Context context, WindowManager windowManager,
- IActivityManager activityManager, DozeParameters dozeParameters,
- StatusBarStateController statusBarStateController,
- ConfigurationController configurationController,
- KeyguardBypassController keyguardBypassController, SysuiColorExtractor colorExtractor,
SuperStatusBarViewFactory superStatusBarViewFactory,
@Main Resources resources) {
mContext = context;
mWindowManager = windowManager;
- mActivityManager = activityManager;
- mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation();
- mDozeParameters = dozeParameters;
- mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze();
- mLpChanged = new LayoutParams();
- mKeyguardBypassController = keyguardBypassController;
- mColorExtractor = colorExtractor;
mSuperStatusBarViewFactory = superStatusBarViewFactory;
mStatusBarView = mSuperStatusBarViewFactory.getStatusBarWindowView();
+ mLpChanged = new WindowManager.LayoutParams();
mResources = resources;
if (mBarHeight < 0) {
mBarHeight = mResources.getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height);
}
-
- mLockScreenDisplayTimeout = context.getResources()
- .getInteger(R.integer.config_lockScreenDisplayTimeout);
- ((SysuiStatusBarStateController) statusBarStateController)
- .addCallback(mStateListener,
- SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER);
- configurationController.addCallback(this);
-
- Display.Mode[] supportedModes = context.getDisplay().getSupportedModes();
- Display.Mode currentMode = context.getDisplay().getMode();
- // Running on the highest frame rate available can be expensive.
- // Let's specify a preferred refresh rate, and allow higher FPS only when we
- // know that we're not falsing (because we unlocked.)
- int keyguardRefreshRate = context.getResources()
- .getInteger(R.integer.config_keyguardRefreshRate);
- // Find supported display mode with the same resolution and requested refresh rate.
- mKeyguardDisplayMode = Arrays.stream(supportedModes).filter(mode ->
- (int) mode.getRefreshRate() == keyguardRefreshRate
- && mode.getPhysicalWidth() == currentMode.getPhysicalWidth()
- && mode.getPhysicalHeight() == currentMode.getPhysicalHeight())
- .findFirst().orElse(null);
- }
-
- /**
- * Register to receive notifications about status bar window state changes.
- */
- public void registerCallback(StatusBarWindowCallback callback) {
- // Prevent adding duplicate callbacks
- for (int i = 0; i < mCallbacks.size(); i++) {
- if (mCallbacks.get(i).get() == callback) {
- return;
- }
- }
- mCallbacks.add(new WeakReference<StatusBarWindowCallback>(callback));
- }
-
- private boolean shouldEnableKeyguardScreenRotation() {
- Resources res = mContext.getResources();
- return SystemProperties.getBoolean("lockscreen.rot_override", false)
- || res.getBoolean(R.bool.config_enableLockScreenRotation);
}
public int getStatusBarHeight() {
@@ -192,574 +97,46 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat
// Now that the status bar window encompasses the sliding panel and its
// translucent backdrop, the entire thing is made TRANSLUCENT and is
// hardware-accelerated.
- mLp = new LayoutParams(
+ mLp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
mBarHeight,
- LayoutParams.TYPE_STATUS_BAR,
- LayoutParams.FLAG_NOT_FOCUSABLE
- | LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
- | LayoutParams.FLAG_SPLIT_TOUCH
- | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- | LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
+ | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
PixelFormat.TRANSLUCENT);
mLp.token = new Binder();
mLp.gravity = Gravity.TOP;
- mLp.setFitWindowInsetsTypes(0 /* types */);
- mLp.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
mLp.setTitle("StatusBar");
mLp.packageName = mContext.getPackageName();
mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
mWindowManager.addView(mStatusBarView, mLp);
mLpChanged.copyFrom(mLp);
- onThemeChanged();
- }
-
- public ViewGroup getStatusBarView() {
- return mStatusBarView;
- }
-
- public void setDozeScreenBrightness(int value) {
- mScreenBrightnessDoze = value / 255f;
- }
-
- private void setKeyguardDark(boolean dark) {
- int vis = mStatusBarView.getSystemUiVisibility();
- if (dark) {
- vis = vis | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
- vis = vis | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
- } else {
- vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
- vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
- }
- mStatusBarView.setSystemUiVisibility(vis);
- }
-
- private void applyKeyguardFlags(State state) {
- if (state.keyguardShowing) {
- mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_KEYGUARD;
- } else {
- mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_KEYGUARD;
- }
-
- final boolean scrimsOccludingWallpaper =
- state.scrimsVisibility == ScrimController.OPAQUE;
- final boolean keyguardOrAod = state.keyguardShowing
- || (state.dozing && mDozeParameters.getAlwaysOn());
- if (keyguardOrAod && !state.backdropShowing && !scrimsOccludingWallpaper) {
- mLpChanged.flags |= LayoutParams.FLAG_SHOW_WALLPAPER;
- } else {
- mLpChanged.flags &= ~LayoutParams.FLAG_SHOW_WALLPAPER;
- }
-
- if (state.dozing) {
- mLpChanged.privateFlags |= LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
- } else {
- mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
- }
-
- if (mKeyguardDisplayMode != null) {
- boolean bypassOnKeyguard = mKeyguardBypassController.getBypassEnabled()
- && state.statusBarState == StatusBarState.KEYGUARD && !state.keyguardFadingAway
- && !state.keyguardGoingAway;
- if (state.dozing || bypassOnKeyguard) {
- mLpChanged.preferredDisplayModeId = mKeyguardDisplayMode.getModeId();
- } else {
- mLpChanged.preferredDisplayModeId = 0;
- }
- Trace.setCounter("display_mode_id", mLpChanged.preferredDisplayModeId);
- }
- }
-
- private void adjustScreenOrientation(State state) {
- if (state.isKeyguardShowingAndNotOccluded() || state.dozing) {
- if (mKeyguardScreenRotation) {
- mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;
- } else {
- mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
- }
- } else {
- mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
- }
- }
-
- private void applyFocusableFlag(State state) {
- boolean panelFocusable = state.statusBarFocusable && state.panelExpanded;
- if (state.bouncerShowing && (state.keyguardOccluded || state.keyguardNeedsInput)
- || ENABLE_REMOTE_INPUT && state.remoteInputActive
- || state.bubbleExpanded) {
- mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE;
- mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM;
- } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) {
- mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE;
- mLpChanged.flags |= LayoutParams.FLAG_ALT_FOCUSABLE_IM;
- } else {
- mLpChanged.flags |= LayoutParams.FLAG_NOT_FOCUSABLE;
- mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM;
- }
-
- mLpChanged.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
- }
-
- private void applyForceShowNavigationFlag(State state) {
- if (state.panelExpanded || state.bouncerShowing
- || ENABLE_REMOTE_INPUT && state.remoteInputActive) {
- mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
- } else {
- mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
- }
- }
-
- private void applyHeight(State state) {
- boolean expanded = isExpanded(state);
- if (state.forcePluginOpen) {
- if (mListener != null) {
- mListener.setWouldOtherwiseCollapse(expanded);
- }
- expanded = true;
- }
- if (expanded) {
- mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT;
- } else {
- mLpChanged.height = mBarHeight;
- }
- }
-
- private boolean isExpanded(State state) {
- return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded()
- || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing
- || state.headsUpShowing || state.bubblesShowing
- || state.scrimsVisibility != ScrimController.TRANSPARENT);
}
- private void applyFitsSystemWindows(State state) {
- boolean fitsSystemWindows = !state.isKeyguardShowingAndNotOccluded();
- if (mStatusBarView != null && mStatusBarView.getFitsSystemWindows() != fitsSystemWindows) {
- mStatusBarView.setFitsSystemWindows(fitsSystemWindows);
- mStatusBarView.requestApplyInsets();
- }
- }
-
- private void applyUserActivityTimeout(State state) {
- if (state.isKeyguardShowingAndNotOccluded()
- && state.statusBarState == StatusBarState.KEYGUARD
- && !state.qsExpanded) {
- mLpChanged.userActivityTimeout = state.bouncerShowing
- ? KeyguardViewMediator.AWAKE_INTERVAL_BOUNCER_MS : mLockScreenDisplayTimeout;
- } else {
- mLpChanged.userActivityTimeout = -1;
- }
- }
-
- private void applyInputFeatures(State state) {
- if (state.isKeyguardShowingAndNotOccluded()
- && state.statusBarState == StatusBarState.KEYGUARD
- && !state.qsExpanded && !state.forceUserActivity) {
- mLpChanged.inputFeatures |=
- LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
- } else {
- mLpChanged.inputFeatures &=
- ~LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
- }
- }
-
- private void applyStatusBarColorSpaceAgnosticFlag(State state) {
- if (!isExpanded(state)) {
- mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC;
- } else {
- mLpChanged.privateFlags &=
- ~LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC;
- }
+ /** Set force status bar visible. */
+ public void setForceStatusBarVisible(boolean forceStatusBarVisible) {
+ mCurrentState.mForceStatusBarVisible = forceStatusBarVisible;
+ apply(mCurrentState);
}
private void apply(State state) {
- applyKeyguardFlags(state);
applyForceStatusBarVisibleFlag(state);
- applyFocusableFlag(state);
- applyForceShowNavigationFlag(state);
- adjustScreenOrientation(state);
- applyHeight(state);
- applyUserActivityTimeout(state);
- applyInputFeatures(state);
- applyFitsSystemWindows(state);
- applyModalFlag(state);
- applyBrightness(state);
- applyHasTopUi(state);
- applyNotTouchable(state);
- applyStatusBarColorSpaceAgnosticFlag(state);
if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
mWindowManager.updateViewLayout(mStatusBarView, mLp);
}
- if (mHasTopUi != mHasTopUiChanged) {
- whitelistIpcs(() -> {
- try {
- mActivityManager.setHasTopUi(mHasTopUiChanged);
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to call setHasTopUi", e);
- }
- mHasTopUi = mHasTopUiChanged;
- });
- }
- notifyStateChangedCallbacks();
}
- public void notifyStateChangedCallbacks() {
- for (int i = 0; i < mCallbacks.size(); i++) {
- StatusBarWindowCallback cb = mCallbacks.get(i).get();
- if (cb != null) {
- cb.onStateChanged(mCurrentState.keyguardShowing,
- mCurrentState.keyguardOccluded,
- mCurrentState.bouncerShowing);
- }
- }
+ private static class State {
+ boolean mForceStatusBarVisible;
}
private void applyForceStatusBarVisibleFlag(State state) {
- if (state.forceStatusBarVisible || state.forcePluginOpen) {
- mLpChanged.privateFlags |= WindowManager
- .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
- } else {
- mLpChanged.privateFlags
- &= ~LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
- }
- }
-
- private void applyModalFlag(State state) {
- if (state.headsUpShowing) {
- mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCH_MODAL;
+ if (state.mForceStatusBarVisible) {
+ mLpChanged.privateFlags |= PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
} else {
- mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCH_MODAL;
- }
- }
-
- private void applyBrightness(State state) {
- if (state.forceDozeBrightness) {
- mLpChanged.screenBrightness = mScreenBrightnessDoze;
- } else {
- mLpChanged.screenBrightness = LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
- }
- }
-
- private void applyHasTopUi(State state) {
- mHasTopUiChanged = state.forceHasTopUi || isExpanded(state);
- }
-
- private void applyNotTouchable(State state) {
- if (state.notTouchable) {
- mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCHABLE;
- } else {
- mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCHABLE;
- }
- }
-
- public void setKeyguardShowing(boolean showing) {
- mCurrentState.keyguardShowing = showing;
- apply(mCurrentState);
- }
-
- public void setKeyguardOccluded(boolean occluded) {
- mCurrentState.keyguardOccluded = occluded;
- apply(mCurrentState);
- }
-
- public void setKeyguardNeedsInput(boolean needsInput) {
- mCurrentState.keyguardNeedsInput = needsInput;
- apply(mCurrentState);
- }
-
- public void setPanelVisible(boolean visible) {
- mCurrentState.panelVisible = visible;
- mCurrentState.statusBarFocusable = visible;
- apply(mCurrentState);
- }
-
- public void setStatusBarFocusable(boolean focusable) {
- mCurrentState.statusBarFocusable = focusable;
- apply(mCurrentState);
- }
-
- public void setBouncerShowing(boolean showing) {
- mCurrentState.bouncerShowing = showing;
- apply(mCurrentState);
- }
-
- public void setBackdropShowing(boolean showing) {
- mCurrentState.backdropShowing = showing;
- apply(mCurrentState);
- }
-
- public void setKeyguardFadingAway(boolean keyguardFadingAway) {
- mCurrentState.keyguardFadingAway = keyguardFadingAway;
- apply(mCurrentState);
- }
-
- public void setQsExpanded(boolean expanded) {
- mCurrentState.qsExpanded = expanded;
- apply(mCurrentState);
- }
-
- public void setForceUserActivity(boolean forceUserActivity) {
- mCurrentState.forceUserActivity = forceUserActivity;
- apply(mCurrentState);
- }
-
- public void setScrimsVisibility(int scrimsVisibility) {
- mCurrentState.scrimsVisibility = scrimsVisibility;
- apply(mCurrentState);
- }
-
- public void setHeadsUpShowing(boolean showing) {
- mCurrentState.headsUpShowing = showing;
- apply(mCurrentState);
- }
-
- public void setWallpaperSupportsAmbientMode(boolean supportsAmbientMode) {
- mCurrentState.wallpaperSupportsAmbientMode = supportsAmbientMode;
- apply(mCurrentState);
- }
-
- /**
- * @param state The {@link StatusBarStateController} of the status bar.
- */
- private void setStatusBarState(int state) {
- mCurrentState.statusBarState = state;
- apply(mCurrentState);
- }
-
- public void setForceStatusBarVisible(boolean forceStatusBarVisible) {
- mCurrentState.forceStatusBarVisible = forceStatusBarVisible;
- apply(mCurrentState);
- }
-
- /**
- * Force the window to be collapsed, even if it should theoretically be expanded.
- * Used for when a heads-up comes in but we still need to wait for the touchable regions to
- * be computed.
- */
- public void setForceWindowCollapsed(boolean force) {
- mCurrentState.forceCollapsed = force;
- apply(mCurrentState);
- }
-
- public void setPanelExpanded(boolean isExpanded) {
- mCurrentState.panelExpanded = isExpanded;
- apply(mCurrentState);
- }
-
- @Override
- public void onRemoteInputActive(boolean remoteInputActive) {
- mCurrentState.remoteInputActive = remoteInputActive;
- apply(mCurrentState);
- }
-
- /**
- * Set whether the screen brightness is forced to the value we use for doze mode by the status
- * bar window.
- */
- public void setForceDozeBrightness(boolean forceDozeBrightness) {
- mCurrentState.forceDozeBrightness = forceDozeBrightness;
- apply(mCurrentState);
- }
-
- public void setDozing(boolean dozing) {
- mCurrentState.dozing = dozing;
- apply(mCurrentState);
- }
-
- public void setForcePluginOpen(boolean forcePluginOpen) {
- mCurrentState.forcePluginOpen = forcePluginOpen;
- apply(mCurrentState);
- if (mForcePluginOpenListener != null) {
- mForcePluginOpenListener.onChange(forcePluginOpen);
+ mLpChanged.privateFlags &= ~PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
}
}
-
- /**
- * The forcePluginOpen state for the status bar.
- */
- public boolean getForcePluginOpen() {
- return mCurrentState.forcePluginOpen;
- }
-
- public void setNotTouchable(boolean notTouchable) {
- mCurrentState.notTouchable = notTouchable;
- apply(mCurrentState);
- }
-
- /**
- * Sets whether there are bubbles showing on the screen.
- */
- public void setBubblesShowing(boolean bubblesShowing) {
- mCurrentState.bubblesShowing = bubblesShowing;
- apply(mCurrentState);
- }
-
- /**
- * The bubbles showing state for the status bar.
- */
- public boolean getBubblesShowing() {
- return mCurrentState.bubblesShowing;
- }
-
- /**
- * Sets if there is a bubble being expanded on the screen.
- */
- public void setBubbleExpanded(boolean bubbleExpanded) {
- mCurrentState.bubbleExpanded = bubbleExpanded;
- apply(mCurrentState);
- }
-
- /**
- * Whether the bubble is shown in expanded state for the status bar.
- */
- public boolean getBubbleExpanded() {
- return mCurrentState.bubbleExpanded;
- }
-
- /**
- * Whether the status bar panel is expanded or not.
- */
- public boolean getPanelExpanded() {
- return mCurrentState.panelExpanded;
- }
-
- public void setStateListener(OtherwisedCollapsedListener listener) {
- mListener = listener;
- }
-
- public void setForcePluginOpenListener(ForcePluginOpenListener listener) {
- mForcePluginOpenListener = listener;
- }
-
- public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- pw.println("StatusBarWindowController:");
- pw.println(" mKeyguardDisplayMode=" + mKeyguardDisplayMode);
- pw.println(mCurrentState);
- }
-
- public boolean isShowingWallpaper() {
- return !mCurrentState.backdropShowing;
- }
-
- @Override
- public void onThemeChanged() {
- if (mStatusBarView == null) {
- return;
- }
-
- final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText();
- // Make sure we have the correct navbar/statusbar colors.
- setKeyguardDark(useDarkText);
- }
-
- /**
- * When keyguard will be dismissed but didn't start animation yet.
- */
- public void setKeyguardGoingAway(boolean goingAway) {
- mCurrentState.keyguardGoingAway = goingAway;
- apply(mCurrentState);
- }
-
- public boolean getForceHasTopUi() {
- return mCurrentState.forceHasTopUi;
- }
-
- public void setForceHasTopUi(boolean forceHasTopUi) {
- mCurrentState.forceHasTopUi = forceHasTopUi;
- apply(mCurrentState);
- }
-
- private static class State {
- boolean keyguardShowing;
- boolean keyguardOccluded;
- boolean keyguardNeedsInput;
- boolean panelVisible;
- boolean panelExpanded;
- boolean statusBarFocusable;
- boolean bouncerShowing;
- boolean keyguardFadingAway;
- boolean keyguardGoingAway;
- boolean qsExpanded;
- boolean headsUpShowing;
- boolean forceStatusBarVisible;
- boolean forceCollapsed;
- boolean forceDozeBrightness;
- boolean forceUserActivity;
- boolean backdropShowing;
- boolean wallpaperSupportsAmbientMode;
- boolean notTouchable;
- boolean bubblesShowing;
- boolean bubbleExpanded;
- boolean forceHasTopUi;
-
- /**
- * The {@link StatusBar} state from the status bar.
- */
- int statusBarState;
-
- boolean remoteInputActive;
- boolean forcePluginOpen;
- boolean dozing;
- int scrimsVisibility;
-
- private boolean isKeyguardShowingAndNotOccluded() {
- return keyguardShowing && !keyguardOccluded;
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- String newLine = "\n";
- result.append("Window State {");
- result.append(newLine);
-
- Field[] fields = this.getClass().getDeclaredFields();
-
- // Print field names paired with their values
- for (Field field : fields) {
- result.append(" ");
- try {
- result.append(field.getName());
- result.append(": ");
- //requires access to private field:
- result.append(field.get(this));
- } catch (IllegalAccessException ex) {
- }
- result.append(newLine);
- }
- result.append("}");
-
- return result.toString();
- }
- }
-
- private final StateListener mStateListener = new StateListener() {
- @Override
- public void onStateChanged(int newState) {
- setStatusBarState(newState);
- }
-
- @Override
- public void onDozingChanged(boolean isDozing) {
- setDozing(isDozing);
- }
- };
-
- /**
- * Custom listener to pipe data back to plugins about whether or not the status bar would be
- * collapsed if not for the plugin.
- * TODO: Find cleaner way to do this.
- */
- public interface OtherwisedCollapsedListener {
- void setWouldOtherwiseCollapse(boolean otherwiseCollapse);
- }
-
- /**
- * Listener to indicate forcePluginOpen has changed
- */
- public interface ForcePluginOpenListener {
- /**
- * Called when mState.forcePluginOpen is changed
- */
- void onChange(boolean forceOpen);
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 1e3c5d608bf8..da5df6a72961 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * 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.
@@ -16,599 +16,19 @@
package com.android.systemui.statusbar.phone;
-import android.annotation.ColorInt;
-import android.annotation.DrawableRes;
-import android.annotation.LayoutRes;
import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Insets;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
import android.util.AttributeSet;
-import android.view.ActionMode;
-import android.view.DisplayCutout;
-import android.view.InputQueue;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.SurfaceHolder;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.view.Window;
-import android.view.WindowInsets;
-import android.view.WindowInsetsController;
import android.widget.FrameLayout;
-import com.android.internal.view.FloatingActionMode;
-import com.android.internal.widget.FloatingToolbar;
-import com.android.systemui.R;
-
/**
- * Combined status bar and notification panel view. Also holding backdrop and scrims.
+ * Status bar view.
*/
public class StatusBarWindowView extends FrameLayout {
- public static final String TAG = "StatusBarWindowView";
- public static final boolean DEBUG = StatusBar.DEBUG;
-
- private int mRightInset = 0;
- private int mLeftInset = 0;
-
- // Implements the floating action mode for TextView's Cut/Copy/Past menu. Normally provided by
- // DecorView, but since this is a special window we have to roll our own.
- private View mFloatingActionModeOriginatingView;
- private ActionMode mFloatingActionMode;
- private FloatingToolbar mFloatingToolbar;
- private ViewTreeObserver.OnPreDrawListener mFloatingToolbarPreDrawListener;
- private InteractionEventHandler mInteractionEventHandler;
+ public static final String TAG = "PhoneStatusBarWindowView";
+ public static final boolean DEBUG = StatusBar.DEBUG;
public StatusBarWindowView(Context context, AttributeSet attrs) {
super(context, attrs);
- setMotionEventSplittingEnabled(false);
- }
-
- public NotificationPanelView getNotificationPanelView() {
- return findViewById(R.id.notification_panel);
- }
-
- @Override
- public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) {
- final Insets insets = windowInsets.getMaxInsets(WindowInsets.Type.systemBars());
- if (getFitsSystemWindows()) {
- boolean paddingChanged = insets.top != getPaddingTop()
- || insets.bottom != getPaddingBottom();
-
- int rightCutout = 0;
- int leftCutout = 0;
- DisplayCutout displayCutout = getRootWindowInsets().getDisplayCutout();
- if (displayCutout != null) {
- leftCutout = displayCutout.getSafeInsetLeft();
- rightCutout = displayCutout.getSafeInsetRight();
- }
-
- int targetLeft = Math.max(insets.left, leftCutout);
- int targetRight = Math.max(insets.right, rightCutout);
-
- // Super-special right inset handling, because scrims and backdrop need to ignore it.
- if (targetRight != mRightInset || targetLeft != mLeftInset) {
- mRightInset = targetRight;
- mLeftInset = targetLeft;
- applyMargins();
- }
- // Drop top inset, and pass through bottom inset.
- if (paddingChanged) {
- setPadding(0, 0, 0, 0);
- }
- } else {
- if (mRightInset != 0 || mLeftInset != 0) {
- mRightInset = 0;
- mLeftInset = 0;
- applyMargins();
- }
- boolean changed = getPaddingLeft() != 0
- || getPaddingRight() != 0
- || getPaddingTop() != 0
- || getPaddingBottom() != 0;
- if (changed) {
- setPadding(0, 0, 0, 0);
- }
- }
- return windowInsets;
- }
-
- private void applyMargins() {
- final int N = getChildCount();
- for (int i = 0; i < N; i++) {
- View child = getChildAt(i);
- if (child.getLayoutParams() instanceof LayoutParams) {
- LayoutParams lp = (LayoutParams) child.getLayoutParams();
- if (!lp.ignoreRightInset
- && (lp.rightMargin != mRightInset || lp.leftMargin != mLeftInset)) {
- lp.rightMargin = mRightInset;
- lp.leftMargin = mLeftInset;
- child.requestLayout();
- }
- }
- }
- }
-
- @Override
- public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
- return new LayoutParams(getContext(), attrs);
- }
-
- @Override
- protected FrameLayout.LayoutParams generateDefaultLayoutParams() {
- return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- }
-
- @Override
- protected void onAttachedToWindow () {
- super.onAttachedToWindow();
- setWillNotDraw(!DEBUG);
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (mInteractionEventHandler.interceptMediaKey(event)) {
- return true;
- }
-
- if (super.dispatchKeyEvent(event)) {
- return true;
- }
-
- return mInteractionEventHandler.dispatchKeyEvent(event);
- }
-
- protected void setInteractionEventHandler(InteractionEventHandler listener) {
- mInteractionEventHandler = listener;
- }
-
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- Boolean result = mInteractionEventHandler.handleDispatchTouchEvent(ev);
-
- return result != null ? result : super.dispatchTouchEvent(ev);
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- boolean intercept = mInteractionEventHandler.shouldInterceptTouchEvent(ev);
- if (!intercept) {
- intercept = super.onInterceptTouchEvent(ev);
- }
- if (intercept) {
- mInteractionEventHandler.didIntercept(ev);
- }
-
- return intercept;
}
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- boolean handled = mInteractionEventHandler.handleTouchEvent(ev);
-
- if (!handled) {
- handled = super.onTouchEvent(ev);
- }
-
- if (!handled) {
- mInteractionEventHandler.didNotHandleTouchEvent(ev);
- }
-
- return handled;
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- if (DEBUG) {
- Paint pt = new Paint();
- pt.setColor(0x80FFFF00);
- pt.setStrokeWidth(12.0f);
- pt.setStyle(Paint.Style.STROKE);
- canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);
- }
- }
-
- public class LayoutParams extends FrameLayout.LayoutParams {
-
- public boolean ignoreRightInset;
-
- public LayoutParams(int width, int height) {
- super(width, height);
- }
-
- public LayoutParams(Context c, AttributeSet attrs) {
- super(c, attrs);
-
- TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StatusBarWindowView_Layout);
- ignoreRightInset = a.getBoolean(
- R.styleable.StatusBarWindowView_Layout_ignoreRightInset, false);
- a.recycle();
- }
- }
-
- @Override
- public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback,
- int type) {
- if (type == ActionMode.TYPE_FLOATING) {
- return startActionMode(originalView, callback, type);
- }
- return super.startActionModeForChild(originalView, callback, type);
- }
-
- private ActionMode createFloatingActionMode(
- View originatingView, ActionMode.Callback2 callback) {
- if (mFloatingActionMode != null) {
- mFloatingActionMode.finish();
- }
- cleanupFloatingActionModeViews();
- mFloatingToolbar = new FloatingToolbar(mFakeWindow);
- final FloatingActionMode mode =
- new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar);
- mFloatingActionModeOriginatingView = originatingView;
- mFloatingToolbarPreDrawListener =
- new ViewTreeObserver.OnPreDrawListener() {
- @Override
- public boolean onPreDraw() {
- mode.updateViewLocationInWindow();
- return true;
- }
- };
- return mode;
- }
-
- private void setHandledFloatingActionMode(ActionMode mode) {
- mFloatingActionMode = mode;
- mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary.
- mFloatingActionModeOriginatingView.getViewTreeObserver()
- .addOnPreDrawListener(mFloatingToolbarPreDrawListener);
- }
-
- private void cleanupFloatingActionModeViews() {
- if (mFloatingToolbar != null) {
- mFloatingToolbar.dismiss();
- mFloatingToolbar = null;
- }
- if (mFloatingActionModeOriginatingView != null) {
- if (mFloatingToolbarPreDrawListener != null) {
- mFloatingActionModeOriginatingView.getViewTreeObserver()
- .removeOnPreDrawListener(mFloatingToolbarPreDrawListener);
- mFloatingToolbarPreDrawListener = null;
- }
- mFloatingActionModeOriginatingView = null;
- }
- }
-
- private ActionMode startActionMode(
- View originatingView, ActionMode.Callback callback, int type) {
- ActionMode.Callback2 wrappedCallback = new ActionModeCallback2Wrapper(callback);
- ActionMode mode = createFloatingActionMode(originatingView, wrappedCallback);
- if (mode != null && wrappedCallback.onCreateActionMode(mode, mode.getMenu())) {
- setHandledFloatingActionMode(mode);
- } else {
- mode = null;
- }
- return mode;
- }
-
- private class ActionModeCallback2Wrapper extends ActionMode.Callback2 {
- private final ActionMode.Callback mWrapped;
-
- public ActionModeCallback2Wrapper(ActionMode.Callback wrapped) {
- mWrapped = wrapped;
- }
-
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- return mWrapped.onCreateActionMode(mode, menu);
- }
-
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- requestFitSystemWindows();
- return mWrapped.onPrepareActionMode(mode, menu);
- }
-
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- return mWrapped.onActionItemClicked(mode, item);
- }
-
- public void onDestroyActionMode(ActionMode mode) {
- mWrapped.onDestroyActionMode(mode);
- if (mode == mFloatingActionMode) {
- cleanupFloatingActionModeViews();
- mFloatingActionMode = null;
- }
- requestFitSystemWindows();
- }
-
- @Override
- public void onGetContentRect(ActionMode mode, View view, Rect outRect) {
- if (mWrapped instanceof ActionMode.Callback2) {
- ((ActionMode.Callback2) mWrapped).onGetContentRect(mode, view, outRect);
- } else {
- super.onGetContentRect(mode, view, outRect);
- }
- }
- }
-
- interface InteractionEventHandler {
- /**
- * Returns a result for {@link ViewGroup#dispatchTouchEvent(MotionEvent)} or null to defer
- * to the super method.
- */
- Boolean handleDispatchTouchEvent(MotionEvent ev);
-
- /**
- * Returns if the view should intercept the touch event.
- *
- * The touch event may still be interecepted if
- * {@link ViewGroup#onInterceptTouchEvent(MotionEvent)} decides to do so.
- */
- boolean shouldInterceptTouchEvent(MotionEvent ev);
-
- /**
- * Called when the view decides to intercept the touch event.
- */
- void didIntercept(MotionEvent ev);
-
- boolean handleTouchEvent(MotionEvent ev);
-
- void didNotHandleTouchEvent(MotionEvent ev);
-
- boolean interceptMediaKey(KeyEvent event);
-
- boolean dispatchKeyEvent(KeyEvent event);
- }
-
- /**
- * Minimal window to satisfy FloatingToolbar.
- */
- private Window mFakeWindow = new Window(mContext) {
- @Override
- public void takeSurface(SurfaceHolder.Callback2 callback) {
- }
-
- @Override
- public void takeInputQueue(InputQueue.Callback callback) {
- }
-
- @Override
- public boolean isFloating() {
- return false;
- }
-
- @Override
- public void alwaysReadCloseOnTouchAttr() {
- }
-
- @Override
- public void setContentView(@LayoutRes int layoutResID) {
- }
-
- @Override
- public void setContentView(View view) {
- }
-
- @Override
- public void setContentView(View view, ViewGroup.LayoutParams params) {
- }
-
- @Override
- public void addContentView(View view, ViewGroup.LayoutParams params) {
- }
-
- @Override
- public void clearContentView() {
- }
-
- @Override
- public View getCurrentFocus() {
- return null;
- }
-
- @Override
- public LayoutInflater getLayoutInflater() {
- return null;
- }
-
- @Override
- public void setTitle(CharSequence title) {
- }
-
- @Override
- public void setTitleColor(@ColorInt int textColor) {
- }
-
- @Override
- public void openPanel(int featureId, KeyEvent event) {
- }
-
- @Override
- public void closePanel(int featureId) {
- }
-
- @Override
- public void togglePanel(int featureId, KeyEvent event) {
- }
-
- @Override
- public void invalidatePanelMenu(int featureId) {
- }
-
- @Override
- public boolean performPanelShortcut(int featureId, int keyCode, KeyEvent event, int flags) {
- return false;
- }
-
- @Override
- public boolean performPanelIdentifierAction(int featureId, int id, int flags) {
- return false;
- }
-
- @Override
- public void closeAllPanels() {
- }
-
- @Override
- public boolean performContextMenuIdentifierAction(int id, int flags) {
- return false;
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- }
-
- @Override
- public void setBackgroundDrawable(Drawable drawable) {
- }
-
- @Override
- public void setFeatureDrawableResource(int featureId, @DrawableRes int resId) {
- }
-
- @Override
- public void setFeatureDrawableUri(int featureId, Uri uri) {
- }
-
- @Override
- public void setFeatureDrawable(int featureId, Drawable drawable) {
- }
-
- @Override
- public void setFeatureDrawableAlpha(int featureId, int alpha) {
- }
-
- @Override
- public void setFeatureInt(int featureId, int value) {
- }
-
- @Override
- public void takeKeyEvents(boolean get) {
- }
-
- @Override
- public boolean superDispatchKeyEvent(KeyEvent event) {
- return false;
- }
-
- @Override
- public boolean superDispatchKeyShortcutEvent(KeyEvent event) {
- return false;
- }
-
- @Override
- public boolean superDispatchTouchEvent(MotionEvent event) {
- return false;
- }
-
- @Override
- public boolean superDispatchTrackballEvent(MotionEvent event) {
- return false;
- }
-
- @Override
- public boolean superDispatchGenericMotionEvent(MotionEvent event) {
- return false;
- }
-
- @Override
- public View getDecorView() {
- return StatusBarWindowView.this;
- }
-
- @Override
- public View peekDecorView() {
- return null;
- }
-
- @Override
- public Bundle saveHierarchyState() {
- return null;
- }
-
- @Override
- public void restoreHierarchyState(Bundle savedInstanceState) {
- }
-
- @Override
- protected void onActive() {
- }
-
- @Override
- public void setChildDrawable(int featureId, Drawable drawable) {
- }
-
- @Override
- public void setChildInt(int featureId, int value) {
- }
-
- @Override
- public boolean isShortcutKey(int keyCode, KeyEvent event) {
- return false;
- }
-
- @Override
- public void setVolumeControlStream(int streamType) {
- }
-
- @Override
- public int getVolumeControlStream() {
- return 0;
- }
-
- @Override
- public int getStatusBarColor() {
- return 0;
- }
-
- @Override
- public void setStatusBarColor(@ColorInt int color) {
- }
-
- @Override
- public int getNavigationBarColor() {
- return 0;
- }
-
- @Override
- public void setNavigationBarColor(@ColorInt int color) {
- }
-
- @Override
- public void setDecorCaptionShade(int decorCaptionShade) {
- }
-
- @Override
- public void setResizingCaptionDrawable(Drawable drawable) {
- }
-
- @Override
- public void onMultiWindowModeChanged() {
- }
-
- @Override
- public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
- }
-
- @Override
- public void reportActivityRelaunched() {
- }
-
- @Override
- public WindowInsetsController getInsetsController() {
- return null;
- }
- };
-
}
-
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java
index 21d0bb8c2daf..802da3e8c21c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java
@@ -19,8 +19,9 @@ package com.android.systemui.statusbar.phone.dagger;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.StatusBarWindowView;
-import com.android.systemui.statusbar.phone.StatusBarWindowViewController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController;
+import com.android.systemui.statusbar.phone.StatusBarWindowController;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
@@ -41,7 +42,8 @@ public interface StatusBarComponent {
*/
@Subcomponent.Builder
interface Builder {
- @BindsInstance Builder statusBarWindowView(StatusBarWindowView statusBarWindowView);
+ @BindsInstance Builder statusBarWindowView(
+ NotificationShadeWindowView notificationShadeWindowView);
StatusBarComponent build();
}
@@ -54,10 +56,16 @@ public interface StatusBarComponent {
@interface StatusBarScope {}
/**
+ * Creates a NotificationShadeWindowViewController.
+ */
+ @StatusBarScope
+ NotificationShadeWindowViewController getNotificationShadeWindowViewController();
+
+ /**
* Creates a StatusBarWindowViewController.
*/
@StatusBarScope
- StatusBarWindowViewController getStatusBarWindowViewController();
+ StatusBarWindowController getStatusBarWindowController();
/**
* Creates a NotificationPanelViewController.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java
index 20bd51d27050..37d8c9ae2958 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java
@@ -17,7 +17,7 @@
package com.android.systemui.statusbar.phone.dagger;
import com.android.systemui.statusbar.phone.NotificationPanelView;
-import com.android.systemui.statusbar.phone.StatusBarWindowView;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import dagger.Module;
import dagger.Provides;
@@ -28,8 +28,8 @@ public abstract class StatusBarViewModule {
@Provides
@StatusBarComponent.StatusBarScope
public static NotificationPanelView getNotificationPanelView(
- StatusBarWindowView statusBarWindowView) {
- return statusBarWindowView.getNotificationPanelView();
+ NotificationShadeWindowView notificationShadeWindowView) {
+ return notificationShadeWindowView.getNotificationPanelView();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
index 625d88481c5a..d62da10de3d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
@@ -25,7 +25,7 @@ import android.widget.FrameLayout;
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.StatusBarWindowView;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import java.util.Objects;
import java.util.function.Consumer;
@@ -36,14 +36,14 @@ import java.util.function.Consumer;
public class BrightnessMirrorController
implements CallbackController<BrightnessMirrorController.BrightnessMirrorListener> {
- private final StatusBarWindowView mStatusBarWindow;
+ private final NotificationShadeWindowView mStatusBarWindow;
private final Consumer<Boolean> mVisibilityCallback;
private final NotificationPanelViewController mNotificationPanel;
private final ArraySet<BrightnessMirrorListener> mBrightnessMirrorListeners = new ArraySet<>();
private final int[] mInt2Cache = new int[2];
private View mBrightnessMirror;
- public BrightnessMirrorController(StatusBarWindowView statusBarWindow,
+ public BrightnessMirrorController(NotificationShadeWindowView statusBarWindow,
NotificationPanelViewController notificationPanelViewController,
@NonNull Consumer<Boolean> visibilityCallback) {
mStatusBarWindow = statusBarWindow;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index ba264c0ae6db..5706bee3f60d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -53,6 +53,7 @@ import com.android.systemui.ScreenDecorations.TunablePaddingTagListener;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentService;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarWindowView;
import com.android.systemui.tuner.TunablePadding;
@@ -80,7 +81,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
private WindowManager mWindowManager;
private FragmentService mFragmentService;
private FragmentHostManager mFragmentHostManager;
- private StatusBarWindowView mView;
+ private NotificationShadeWindowView mView;
+ private StatusBarWindowView mStatusBarWindowView;
private TunablePaddingService mTunablePaddingService;
private Handler mMainHandler;
@Mock
@@ -99,9 +101,11 @@ public class ScreenDecorationsTest extends SysuiTestCase {
mFragmentService = mDependency.injectMockDependency(FragmentService.class);
mWindowManager = mock(WindowManager.class);
- mView = spy(new StatusBarWindowView(mContext, null));
+ mView = spy(new NotificationShadeWindowView(mContext, null));
+ mStatusBarWindowView = spy(new StatusBarWindowView(mContext, null));
when(mStatusBarLazy.get()).thenReturn(mStatusBar);
- when(mStatusBar.getStatusBarWindow()).thenReturn(mView);
+ when(mStatusBar.getNotificationShadeWindowView()).thenReturn(mView);
+ when(mStatusBar.getStatusBarWindow()).thenReturn(mStatusBarWindowView);
Display display = mContext.getSystemService(WindowManager.class).getDefaultDisplay();
when(mWindowManager.getDefaultDisplay()).thenReturn(display);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
index c3df3f633f3b..04116ec68600 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
@@ -74,8 +74,8 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -126,7 +126,7 @@ public class BubbleControllerTest extends SysuiTestCase {
private ArgumentCaptor<NotificationRemoveInterceptor> mRemoveInterceptorCaptor;
private TestableBubbleController mBubbleController;
- private StatusBarWindowController mStatusBarWindowController;
+ private NotificationShadeWindowController mNotificationShadeWindowController;
private NotificationEntryListener mEntryListener;
private NotificationRemoveInterceptor mRemoveInterceptor;
@@ -170,11 +170,11 @@ public class BubbleControllerTest extends SysuiTestCase {
new InjectionInflationController(SystemUIFactory.getInstance().getRootComponent()));
// Bubbles get added to status bar window view
- mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
- mActivityManager, mDozeParameters, mStatusBarStateController,
+ mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
+ mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
mConfigurationController, mKeyguardBypassController, mColorExtractor,
- mSuperStatusBarViewFactory, mResources);
- mStatusBarWindowController.attach();
+ mSuperStatusBarViewFactory);
+ mNotificationShadeWindowController.attach();
// Need notifications for bubbles
mNotificationTestHelper = new NotificationTestHelper(mContext, mDependency);
@@ -201,7 +201,7 @@ public class BubbleControllerTest extends SysuiTestCase {
mock(NotificationInterruptionStateProvider.HeadsUpSuppressor.class));
mBubbleData = new BubbleData(mContext);
mBubbleController = new TestableBubbleController(mContext,
- mStatusBarWindowController,
+ mNotificationShadeWindowController,
mStatusBarStateController,
mShadeController,
mBubbleData,
@@ -250,7 +250,7 @@ public class BubbleControllerTest extends SysuiTestCase {
mBubbleController.removeBubble(
mRow.getEntry().getKey(), BubbleController.DISMISS_USER_GESTURE);
- assertFalse(mStatusBarWindowController.getBubblesShowing());
+ assertFalse(mNotificationShadeWindowController.getBubblesShowing());
assertNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
verify(mNotificationEntryManager, times(2)).updateNotifications(anyString());
verify(mBubbleStateChangeListener).onHasBubblesChanged(false);
@@ -290,7 +290,7 @@ public class BubbleControllerTest extends SysuiTestCase {
assertTrue(mBubbleController.hasBubbles());
mBubbleController.dismissStack(BubbleController.DISMISS_USER_GESTURE);
- assertFalse(mStatusBarWindowController.getBubblesShowing());
+ assertFalse(mNotificationShadeWindowController.getBubblesShowing());
verify(mNotificationEntryManager, times(3)).updateNotifications(any());
assertNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
assertNull(mBubbleData.getBubbleWithKey(mRow2.getEntry().getKey()));
@@ -308,14 +308,14 @@ public class BubbleControllerTest extends SysuiTestCase {
assertTrue(mBubbleController.hasBubbles());
assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
mRow.getEntry().getKey()));
- assertFalse(mStatusBarWindowController.getBubbleExpanded());
+ assertFalse(mNotificationShadeWindowController.getBubbleExpanded());
// Expand the stack
BubbleStackView stackView = mBubbleController.getStackView();
mBubbleController.expandStack();
assertTrue(mBubbleController.isStackExpanded());
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
- assertTrue(mStatusBarWindowController.getBubbleExpanded());
+ assertTrue(mNotificationShadeWindowController.getBubbleExpanded());
// Make sure the notif is suppressed
assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
@@ -325,7 +325,7 @@ public class BubbleControllerTest extends SysuiTestCase {
mBubbleController.collapseStack();
verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
assertFalse(mBubbleController.isStackExpanded());
- assertFalse(mStatusBarWindowController.getBubbleExpanded());
+ assertFalse(mNotificationShadeWindowController.getBubbleExpanded());
}
@Test
@@ -711,7 +711,7 @@ public class BubbleControllerTest extends SysuiTestCase {
static class TestableBubbleController extends BubbleController {
// Let's assume surfaces can be synchronized immediately.
TestableBubbleController(Context context,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
StatusBarStateController statusBarStateController,
ShadeController shadeController,
BubbleData data,
@@ -723,7 +723,7 @@ public class BubbleControllerTest extends SysuiTestCase {
NotificationEntryManager entryManager,
RemoteInputUriController remoteInputUriController) {
super(context,
- statusBarWindowController, statusBarStateController, shadeController,
+ notificationShadeWindowController, statusBarStateController, shadeController,
data, Runnable::run, configurationController, interruptionStateProvider,
zenModeController, lockscreenUserManager, groupManager, entryManager,
remoteInputUriController);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index 64fbc1bac658..acc30d9f8374 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -36,8 +36,8 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -57,7 +57,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
private @Mock LockPatternUtils mLockPatternUtils;
private @Mock KeyguardUpdateMonitor mUpdateMonitor;
private @Mock StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
- private @Mock StatusBarWindowController mStatusBarWindowController;
+ private @Mock NotificationShadeWindowController mNotificationShadeWindowController;
private @Mock BroadcastDispatcher mBroadcastDispatcher;
private @Mock DismissCallbackRegistry mDismissCallbackRegistry;
private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
@@ -77,7 +77,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
TestableLooper.get(this).runWithLooper(() -> {
mViewMediator = new KeyguardViewMediator(
mContext, mFalsingManager, mLockPatternUtils, mBroadcastDispatcher,
- mStatusBarWindowController, () -> mStatusBarKeyguardViewManager,
+ mNotificationShadeWindowController, () -> mStatusBarKeyguardViewManager,
mDismissCallbackRegistry, mUiBgExecutor);
});
}
@@ -87,6 +87,6 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
mViewMediator.start();
mViewMediator.onStartedGoingToSleep(OFF_BECAUSE_OF_USER);
verify(mUpdateMonitor).setKeyguardGoingAway(false);
- verify(mStatusBarWindowController, never()).setKeyguardGoingAway(anyBoolean());
+ verify(mNotificationShadeWindowController, never()).setKeyguardGoingAway(anyBoolean());
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
index bb9c14bbb2a3..6d83ac32cef5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
@@ -34,8 +34,8 @@ import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
import com.android.systemui.statusbar.notification.row.NotificationInfo.CheckSaveListener;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import org.junit.Before;
@@ -97,6 +97,6 @@ public class NonPhoneDependencyTest extends SysuiTestCase {
viewHierarchyManager.setUpWithPresenter(mPresenter, mListContainer);
TestableLooper.get(this).processAllMessages();
- assertFalse(mDependency.hasInstantiatedDependency(StatusBarWindowController.class));
+ assertFalse(mDependency.hasInstantiatedDependency(NotificationShadeWindowController.class));
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
index 3fdbd3edfcaa..61e43b010dda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
@@ -55,7 +55,7 @@ import com.android.systemui.statusbar.notification.row.NotificationRowContentBin
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.tests.R;
import java.util.concurrent.CountDownLatch;
@@ -87,7 +87,7 @@ public class NotificationTestHelper {
mContext = context;
dependency.injectMockDependency(NotificationMediaManager.class);
dependency.injectMockDependency(BubbleController.class);
- dependency.injectMockDependency(StatusBarWindowController.class);
+ dependency.injectMockDependency(NotificationShadeWindowController.class);
dependency.injectMockDependency(SmartReplyController.class);
StatusBarStateController stateController = mock(StatusBarStateController.class);
mGroupManager = new NotificationGroupManager(stateController);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java
index a54f7335ba67..a07cfc3c3226 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java
@@ -34,8 +34,8 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.StatusBarWindowView;
-import com.android.systemui.statusbar.phone.StatusBarWindowViewController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController;
import org.junit.Assert;
import org.junit.Before;
@@ -49,20 +49,22 @@ public class ActivityLaunchAnimatorTest extends SysuiTestCase {
private ActivityLaunchAnimator mLaunchAnimator;
private ActivityLaunchAnimator.Callback mCallback = mock(ActivityLaunchAnimator.Callback.class);
- private StatusBarWindowViewController mStatusBarWindowViewController = mock(
- StatusBarWindowViewController.class);
- private StatusBarWindowView mStatusBarWindowView = mock(StatusBarWindowView.class);
+ private NotificationShadeWindowViewController mNotificationShadeWindowViewController = mock(
+ NotificationShadeWindowViewController.class);
+ private NotificationShadeWindowView mNotificationShadeWindowView = mock(
+ NotificationShadeWindowView.class);
private NotificationListContainer mNotificationContainer
= mock(NotificationListContainer.class);
private ExpandableNotificationRow mRow = mock(ExpandableNotificationRow.class);
@Before
public void setUp() throws Exception {
- when(mStatusBarWindowViewController.getView()).thenReturn(mStatusBarWindowView);
- when(mStatusBarWindowView.getResources()).thenReturn(mContext.getResources());
+ when(mNotificationShadeWindowViewController.getView())
+ .thenReturn(mNotificationShadeWindowView);
+ when(mNotificationShadeWindowView.getResources()).thenReturn(mContext.getResources());
when(mCallback.areLaunchAnimationsEnabled()).thenReturn(true);
mLaunchAnimator = new ActivityLaunchAnimator(
- mStatusBarWindowViewController,
+ mNotificationShadeWindowViewController,
mCallback,
mock(NotificationPanelViewController.class),
mNotificationContainer);
@@ -92,7 +94,7 @@ public class ActivityLaunchAnimatorTest extends SysuiTestCase {
RemoteAnimationAdapter launchAnimation = mLaunchAnimator.getLaunchAnimation(mRow,
false /* occluded */);
Assert.assertTrue("No animation generated", launchAnimation != null);
- executePostsImmediately(mStatusBarWindowView);
+ executePostsImmediately(mNotificationShadeWindowView);
mLaunchAnimator.setLaunchResult(ActivityManager.START_SUCCESS,
true /* wasIntentActivity */);
verify(mCallback).onExpandAnimationTimedOut();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index 5907a0a683a8..769b774aeec2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -67,7 +67,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
@Mock
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock
- private StatusBarWindowController mStatusBarWindowController;
+ private NotificationShadeWindowController mNotificationShadeWindowController;
@Mock
private DozeScrimController mDozeScrimController;
@Mock
@@ -104,9 +104,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
res.addOverride(com.android.internal.R.integer.config_wakeUpDelayDoze, 0);
mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController,
mKeyguardViewMediator, mScrimController, mStatusBar, mShadeController,
- mStatusBarWindowController, mKeyguardStateController, mHandler, mUpdateMonitor,
- res.getResources(), mKeyguardBypassController, mDozeParameters, mMetricsLogger,
- mDumpController);
+ mNotificationShadeWindowController, mKeyguardStateController, mHandler,
+ mUpdateMonitor, res.getResources(), mKeyguardBypassController, mDozeParameters,
+ mMetricsLogger, mDumpController);
mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
index d31f17531889..3c6a69882d44 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
@@ -79,12 +79,12 @@ public class DozeServiceHostTest extends SysuiTestCase {
@Mock private DozeLog mDozeLog;
@Mock private PulseExpansionHandler mPulseExpansionHandler;
@Mock private NotificationWakeUpCoordinator mNotificationWakeUpCoordinator;
- @Mock private StatusBarWindowController mStatusBarWindowController;
+ @Mock private NotificationShadeWindowController mNotificationShadeWindowController;
@Mock private PowerManager mPowerManager;
@Mock private WakefulnessLifecycle mWakefullnessLifecycle;
@Mock private StatusBar mStatusBar;
@Mock private NotificationIconAreaController mNotificationIconAreaController;
- @Mock private StatusBarWindowViewController mStatusBarWindowViewController;
+ @Mock private NotificationShadeWindowViewController mNotificationShadeWindowViewController;
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock private NotificationPanelViewController mNotificationPanel;
@Mock private View mAmbientIndicationContainer;
@@ -99,12 +99,12 @@ public class DozeServiceHostTest extends SysuiTestCase {
mBatteryController, mScrimController, () -> mBiometricUnlockController,
mKeyguardViewMediator, () -> mAssistManager, mDozeScrimController,
mKeyguardUpdateMonitor, mVisualStabilityManager, mPulseExpansionHandler,
- mStatusBarWindowController, mNotificationWakeUpCoordinator,
+ mNotificationShadeWindowController, mNotificationWakeUpCoordinator,
mLockscreenLockIconController);
mDozeServiceHost.initialize(mStatusBar, mNotificationIconAreaController,
- mStatusBarKeyguardViewManager, mStatusBarWindowViewController, mNotificationPanel,
- mAmbientIndicationContainer);
+ mStatusBarKeyguardViewManager, mNotificationShadeWindowViewController,
+ mNotificationPanel, mAmbientIndicationContainer);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
index 7fa69018b496..50d8bf0b02c2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
@@ -57,7 +57,7 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
private HeadsUpManagerPhone mHeadsUpManager;
@Mock private NotificationGroupManager mGroupManager;
- @Mock private View mStatusBarWindowView;
+ @Mock private View mNotificationShadeWindowView;
@Mock private VisualStabilityManager mVSManager;
@Mock private StatusBar mBar;
@Mock private StatusBarStateController mStatusBarStateController;
@@ -65,13 +65,13 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
private boolean mLivesPastNormalTime;
private final class TestableHeadsUpManagerPhone extends HeadsUpManagerPhone {
- TestableHeadsUpManagerPhone(Context context, View statusBarWindowView,
+ TestableHeadsUpManagerPhone(Context context, View notificationShadeWindowView,
NotificationGroupManager groupManager, StatusBar bar,
VisualStabilityManager vsManager,
StatusBarStateController statusBarStateController,
KeyguardBypassController keyguardBypassController) {
super(context, statusBarStateController, keyguardBypassController);
- setUp(statusBarWindowView, groupManager, bar, vsManager);
+ setUp(notificationShadeWindowView, groupManager, bar, vsManager);
mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME;
mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME;
}
@@ -89,9 +89,9 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
.thenReturn(TEST_AUTO_DISMISS_TIME);
when(mVSManager.isReorderingAllowed()).thenReturn(true);
mDependency.injectMockDependency(BubbleController.class);
- mDependency.injectMockDependency(StatusBarWindowController.class);
+ mDependency.injectMockDependency(NotificationShadeWindowController.class);
mDependency.injectMockDependency(ConfigurationController.class);
- mHeadsUpManager = new TestableHeadsUpManagerPhone(mContext, mStatusBarWindowView,
+ mHeadsUpManager = new TestableHeadsUpManagerPhone(mContext, mNotificationShadeWindowView,
mGroupManager, mBar, mVSManager, mStatusBarStateController, mBypassController);
super.setUp();
mHeadsUpManager.mHandler = mTestHandler;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerTest.java
index 147edf6589e9..40d3395f2ca1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerTest.java
@@ -11,7 +11,7 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
*/
package com.android.systemui.statusbar.phone;
@@ -25,7 +25,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.IActivityManager;
-import android.content.res.Resources;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.WindowManager;
@@ -49,11 +48,11 @@ import org.mockito.MockitoAnnotations;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@SmallTest
-public class StatusBarWindowControllerTest extends SysuiTestCase {
+public class NotificationShadeWindowControllerTest extends SysuiTestCase {
@Mock private WindowManager mWindowManager;
@Mock private DozeParameters mDozeParameters;
- @Mock private StatusBarWindowView mStatusBarView;
+ @Mock private NotificationShadeWindowView mStatusBarView;
@Mock private IActivityManager mActivityManager;
@Mock private SysuiStatusBarStateController mStatusBarStateController;
@Mock private ConfigurationController mConfigurationController;
@@ -61,28 +60,28 @@ public class StatusBarWindowControllerTest extends SysuiTestCase {
@Mock private SysuiColorExtractor mColorExtractor;
@Mock ColorExtractor.GradientColors mGradientColors;
@Mock private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
- @Mock private Resources mResources;
- private StatusBarWindowController mStatusBarWindowController;
+ private NotificationShadeWindowController mNotificationShadeWindowController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mDozeParameters.getAlwaysOn()).thenReturn(true);
when(mColorExtractor.getNeutralColors()).thenReturn(mGradientColors);
- when(mSuperStatusBarViewFactory.getStatusBarWindowView()).thenReturn(mStatusBarView);
+ when(mSuperStatusBarViewFactory.getNotificationShadeWindowView())
+ .thenReturn(mStatusBarView);
- mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
- mActivityManager, mDozeParameters, mStatusBarStateController,
+ mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
+ mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
mConfigurationController, mKeyguardBypassController, mColorExtractor,
- mSuperStatusBarViewFactory, mResources);
+ mSuperStatusBarViewFactory);
- mStatusBarWindowController.attach();
+ mNotificationShadeWindowController.attach();
}
@Test
public void testSetDozing_hidesSystemOverlays() {
- mStatusBarWindowController.setDozing(true);
+ mNotificationShadeWindowController.setDozing(true);
ArgumentCaptor<WindowManager.LayoutParams> captor =
ArgumentCaptor.forClass(WindowManager.LayoutParams.class);
verify(mWindowManager).updateViewLayout(any(), captor.capture());
@@ -91,7 +90,7 @@ public class StatusBarWindowControllerTest extends SysuiTestCase {
assertThat(flag).isNotEqualTo(0);
reset(mWindowManager);
- mStatusBarWindowController.setDozing(false);
+ mNotificationShadeWindowController.setDozing(false);
verify(mWindowManager).updateViewLayout(any(), captor.capture());
flag = captor.getValue().privateFlags
& WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
@@ -100,7 +99,7 @@ public class StatusBarWindowControllerTest extends SysuiTestCase {
@Test
public void testOnThemeChanged_doesntCrash() {
- mStatusBarWindowController.onThemeChanged();
+ mNotificationShadeWindowController.onThemeChanged();
}
@Test
@@ -110,6 +109,6 @@ public class StatusBarWindowControllerTest extends SysuiTestCase {
@Test
public void testSetForcePluginOpen_beforeStatusBarInitialization() {
- mStatusBarWindowController.setForcePluginOpen(true);
+ mNotificationShadeWindowController.setForcePluginOpen(true);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
index f9848f3c0719..985354007e25 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
@@ -56,10 +56,10 @@ import org.mockito.MockitoAnnotations;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@SmallTest
-public class StatusBarWindowViewTest extends SysuiTestCase {
+public class NotificationShadeWindowViewTest extends SysuiTestCase {
- private StatusBarWindowView mView;
- private StatusBarWindowViewController mController;
+ private NotificationShadeWindowView mView;
+ private NotificationShadeWindowViewController mController;
@Mock private NotificationWakeUpCoordinator mCoordinator;
@Mock private PulseExpansionHandler mPulseExpansionHandler;
@@ -84,15 +84,16 @@ public class StatusBarWindowViewTest extends SysuiTestCase {
public void setUp() {
MockitoAnnotations.initMocks(this);
- mView = spy(new StatusBarWindowView(getContext(), null));
+ mView = spy(new NotificationShadeWindowView(getContext(), null));
when(mView.findViewById(R.id.notification_stack_scroller))
.thenReturn(mNotificationStackScrollLayout);
+
when(mStatusBarStateController.isDozing()).thenReturn(false);
mDependency.injectTestDependency(ShadeController.class, mShadeController);
when(mDockManager.isDocked()).thenReturn(false);
- mController = new StatusBarWindowViewController(
+ mController = new NotificationShadeWindowViewController(
new InjectionInflationController(
SystemUIFactory.getInstance().getRootComponent()),
mCoordinator,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 5b5eaadee552..675a2df768d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -104,7 +104,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
mock(KeyguardUpdateMonitor.class),
mock(NavigationModeController.class),
mock(DockManager.class),
- mock(StatusBarWindowController.class),
+ mock(NotificationShadeWindowController.class),
mKeyguardStateController,
mock(NotificationMediaManager.class));
mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer,
@@ -270,12 +270,12 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
KeyguardUpdateMonitor keyguardUpdateMonitor,
NavigationModeController navigationModeController,
DockManager dockManager,
- StatusBarWindowController statusBarWindowController,
+ NotificationShadeWindowController notificationShadeWindowController,
KeyguardStateController keyguardStateController,
NotificationMediaManager notificationMediaManager) {
super(context, callback, lockPatternUtils, sysuiStatusBarStateController,
configurationController, keyguardUpdateMonitor, navigationModeController,
- dockManager, statusBarWindowController, keyguardStateController,
+ dockManager, notificationShadeWindowController, keyguardStateController,
notificationMediaManager);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
index 782e14c83951..dd896be0e120 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
@@ -100,16 +100,17 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase {
mDependency.injectMockDependency(NotificationMediaManager.class);
mDependency.injectMockDependency(VisualStabilityManager.class);
mDependency.injectMockDependency(NotificationGutsManager.class);
- mDependency.injectMockDependency(StatusBarWindowController.class);
+ mDependency.injectMockDependency(NotificationShadeWindowController.class);
NotificationEntryManager entryManager =
mDependency.injectMockDependency(NotificationEntryManager.class);
when(entryManager.getActiveNotificationsForCurrentUser()).thenReturn(new ArrayList<>());
- StatusBarWindowView statusBarWindowView = mock(StatusBarWindowView.class);
- when(statusBarWindowView.getResources()).thenReturn(mContext.getResources());
+ NotificationShadeWindowView notificationShadeWindowView =
+ mock(NotificationShadeWindowView.class);
+ when(notificationShadeWindowView.getResources()).thenReturn(mContext.getResources());
mStatusBarNotificationPresenter = new StatusBarNotificationPresenter(mContext,
mock(NotificationPanelViewController.class), mock(HeadsUpManagerPhone.class),
- statusBarWindowView, mock(NotificationListContainerViewGroup.class),
+ notificationShadeWindowView, mock(NotificationListContainerViewGroup.class),
mock(DozeScrimController.class), mock(ScrimController.class),
mock(ActivityLaunchAnimator.class), mock(DynamicPrivacyController.class),
mock(NotificationAlertingManager.class),
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 fee48522683d..e90e398ba061 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
@@ -201,7 +201,7 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private NotificationLogger.ExpansionStateLogger mExpansionStateLogger;
@Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
- @Mock private StatusBarWindowView mStatusBarWindowView;
+ @Mock private NotificationShadeWindowView mNotificationShadeWindowView;
@Mock private BroadcastDispatcher mBroadcastDispatcher;
@Mock private AssistManager mAssistManager;
@Mock private NotificationGutsManager mNotificationGutsManager;
@@ -224,9 +224,9 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private BubbleController mBubbleController;
@Mock private NotificationGroupManager mGroupManager;
@Mock private NotificationGroupAlertTransferHelper mGroupAlertTransferHelper;
- @Mock private StatusBarWindowController mStatusBarWindowController;
+ @Mock private NotificationShadeWindowController mNotificationShadeWindowController;
@Mock private NotificationIconAreaController mNotificationIconAreaController;
- @Mock private StatusBarWindowViewController mStatusBarWindowViewController;
+ @Mock private NotificationShadeWindowViewController mNotificationShadeWindowViewController;
@Mock private DozeParameters mDozeParameters;
@Mock private Lazy<LockscreenWallpaper> mLockscreenWallpaperLazy;
@Mock private LockscreenWallpaper mLockscreenWallpaper;
@@ -324,11 +324,11 @@ public class StatusBarTest extends SysuiTestCase {
when(mStatusBarComponentBuilderProvider.get()).thenReturn(mStatusBarComponentBuilder);
when(mStatusBarComponentBuilder.build()).thenReturn(mStatusBarComponent);
- when(mStatusBarComponent.getStatusBarWindowViewController()).thenReturn(
- mStatusBarWindowViewController);
+ when(mStatusBarComponent.getNotificationShadeWindowViewController()).thenReturn(
+ mNotificationShadeWindowViewController);
mShadeController = new ShadeControllerImpl(mCommandQueue,
- mStatusBarStateController, mStatusBarWindowController,
+ mStatusBarStateController, mNotificationShadeWindowController,
mStatusBarKeyguardViewManager, mContext.getSystemService(WindowManager.class),
() -> mStatusBar, () -> mAssistManager, () -> mBubbleController);
@@ -384,7 +384,7 @@ public class StatusBarTest extends SysuiTestCase {
() -> mAssistManager,
mNotificationListener,
configurationController,
- mStatusBarWindowController,
+ mNotificationShadeWindowController,
mLockscreenLockIconController,
mDozeParameters,
mScrimController,
@@ -417,7 +417,7 @@ public class StatusBarTest extends SysuiTestCase {
mNotificationRowBinder,
mDismissCallbackRegistry);
- when(mStatusBarWindowView.findViewById(R.id.lock_icon_container)).thenReturn(
+ when(mNotificationShadeWindowView.findViewById(R.id.lock_icon_container)).thenReturn(
mLockIconContainer);
when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), any(ViewGroup.class),
@@ -430,7 +430,7 @@ public class StatusBarTest extends SysuiTestCase {
// TODO: we should be able to call mStatusBar.start() and have all the below values
// initialized automatically.
- mStatusBar.mStatusBarWindow = mStatusBarWindowView;
+ mStatusBar.mNotificationShadeWindowView = mNotificationShadeWindowView;
mStatusBar.mNotificationPanelViewController = mNotificationPanelViewController;
mStatusBar.mDozeScrimController = mDozeScrimController;
mStatusBar.mNotificationIconAreaController = mNotificationIconAreaController;
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
index c733d3bee6b6..49582a97b890 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -31,6 +31,7 @@ import android.view.accessibility.AccessibilityEvent;
import com.android.server.LocalServices;
import com.android.server.accessibility.gestures.TouchExplorer;
+import com.android.server.accessibility.magnification.MagnificationGestureHandler;
import com.android.server.policy.WindowManagerPolicy;
import java.util.ArrayList;
@@ -402,7 +403,7 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
final boolean triggerable = (mEnabledFeatures
& FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER) != 0;
MagnificationGestureHandler magnificationGestureHandler =
- new MagnificationGestureHandler(displayContext,
+ new FullScreenMagnificationGestureHandler(displayContext,
mAms.getMagnificationController(),
detectControlGestures, triggerable, displayId);
addFirstEventHandler(displayId, magnificationGestureHandler);
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
index 8ce92a3154f3..a6041e0ee91c 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
@@ -701,6 +701,7 @@ public class AccessibilityWindowManager {
case WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL:
case WindowManager.LayoutParams.TYPE_SEARCH_BAR:
case WindowManager.LayoutParams.TYPE_STATUS_BAR:
+ case WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE:
case WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL:
case WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL:
case WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY:
diff --git a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/FullScreenMagnificationGestureHandler.java
index 06ca054db14a..9e4fd80c9e6b 100644
--- a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/FullScreenMagnificationGestureHandler.java
@@ -53,14 +53,16 @@ import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
import android.view.ViewConfiguration;
+import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.accessibility.gestures.GestureUtils;
+import com.android.server.accessibility.magnification.MagnificationGestureHandler;
import java.util.ArrayDeque;
import java.util.Queue;
/**
- * This class handles magnification in response to touch events.
+ * This class handles full screen magnification in response to touch events.
*
* The behavior is as follows:
*
@@ -108,14 +110,14 @@ import java.util.Queue;
* 7. The magnification scale will be persisted in settings and in the cloud.
*/
@SuppressWarnings("WeakerAccess")
-class MagnificationGestureHandler extends BaseEventStreamTransformation {
- private static final String LOG_TAG = "MagnificationGestureHandler";
+class FullScreenMagnificationGestureHandler extends MagnificationGestureHandler {
+ private static final String LOG_TAG = "FullScreenMagnificationGestureHandler";
private static final boolean DEBUG_ALL = false;
- private static final boolean DEBUG_STATE_TRANSITIONS = false || DEBUG_ALL;
- private static final boolean DEBUG_DETECTING = false || DEBUG_ALL;
- private static final boolean DEBUG_PANNING_SCALING = false || DEBUG_ALL;
- private static final boolean DEBUG_EVENT_STREAM = false || DEBUG_ALL;
+ private static final boolean DEBUG_STATE_TRANSITIONS = false | DEBUG_ALL;
+ private static final boolean DEBUG_DETECTING = false | DEBUG_ALL;
+ private static final boolean DEBUG_PANNING_SCALING = false | DEBUG_ALL;
+ private static final boolean DEBUG_EVENT_STREAM = false | DEBUG_ALL;
// The MIN_SCALE is different from MagnificationController.MIN_SCALE due
// to AccessibilityService.MagnificationController#setScale() has
@@ -167,14 +169,14 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
* {@code false} if it should ignore such triggers.
* @param displayId The logical display id.
*/
- public MagnificationGestureHandler(Context context,
+ FullScreenMagnificationGestureHandler(Context context,
MagnificationController magnificationController,
boolean detectTripleTap,
boolean detectShortcutTrigger,
int displayId) {
if (DEBUG_ALL) {
Log.i(LOG_TAG,
- "MagnificationGestureHandler(detectTripleTap = " + detectTripleTap
+ "FullScreenMagnificationGestureHandler(detectTripleTap = " + detectTripleTap
+ ", detectShortcutTrigger = " + detectShortcutTrigger + ")");
}
@@ -263,7 +265,8 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
clearAndTransitionToStateDetecting();
}
- void notifyShortcutTriggered() {
+ @Override
+ public void notifyShortcutTriggered() {
if (mDetectShortcutTrigger) {
boolean wasMagnifying = mMagnificationController.resetIfNeeded(mDisplayId,
/* animate */ true);
@@ -383,10 +386,10 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
float mInitialScaleFactor = -1;
boolean mScaling;
- public PanningScalingState(Context context) {
+ PanningScalingState(Context context) {
final TypedValue scaleValue = new TypedValue();
context.getResources().getValue(
- com.android.internal.R.dimen.config_screen_magnification_scaling_threshold,
+ R.dimen.config_screen_magnification_scaling_threshold,
scaleValue, false);
mScalingThreshold = scaleValue.getFloat();
mScaleGestureDetector = new ScaleGestureDetector(context, this, Handler.getMain());
@@ -407,7 +410,6 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
} else if (action == ACTION_UP || action == ACTION_CANCEL) {
persistScaleAndTransitionTo(mDetectingState);
-
}
}
@@ -489,10 +491,9 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
@Override
public String toString() {
- return "PanningScalingState{" +
- "mInitialScaleFactor=" + mInitialScaleFactor +
- ", mScaling=" + mScaling +
- '}';
+ return "PanningScalingState{" + "mInitialScaleFactor=" + mInitialScaleFactor
+ + ", mScaling=" + mScaling
+ + '}';
}
}
@@ -544,7 +545,7 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
clear();
transitionTo(mDetectingState);
}
- break;
+ break;
case ACTION_DOWN:
case ACTION_POINTER_UP: {
@@ -561,10 +562,10 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
@Override
public String toString() {
- return "ViewportDraggingState{" +
- "mZoomedInBeforeDrag=" + mZoomedInBeforeDrag +
- ", mLastMoveOutsideMagnifiedRegion=" + mLastMoveOutsideMagnifiedRegion +
- '}';
+ return "ViewportDraggingState{"
+ + "mZoomedInBeforeDrag=" + mZoomedInBeforeDrag
+ + ", mLastMoveOutsideMagnifiedRegion=" + mLastMoveOutsideMagnifiedRegion
+ + '}';
}
}
@@ -577,16 +578,17 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
@Override
public void onMotionEvent(MotionEvent event, MotionEvent rawEvent, int policyFlags) {
- // Ensure that the state at the end of delegation is consistent with the last delegated
+ // Ensures that the state at the end of delegation is consistent with the last delegated
// UP/DOWN event in queue: still delegating if pointer is down, detecting otherwise
switch (event.getActionMasked()) {
case ACTION_UP:
case ACTION_CANCEL: {
transitionTo(mDetectingState);
- } break;
+ }
+ break;
case ACTION_DOWN: {
- transitionTo(mDelegatingState);
+ transitionTo(mDelegatingState);
mLastDelegatedDownEventTime = event.getDownTime();
} break;
}
@@ -630,11 +632,11 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
@VisibleForTesting Handler mHandler = new Handler(Looper.getMainLooper(), this);
- public DetectingState(Context context) {
+ DetectingState(Context context) {
mLongTapMinDelay = ViewConfiguration.getLongPressTimeout();
mMultiTapMaxDelay = ViewConfiguration.getDoubleTapTimeout()
+ context.getResources().getInteger(
- com.android.internal.R.integer.config_screen_magnification_multi_tap_adjustment);
+ R.integer.config_screen_magnification_multi_tap_adjustment);
mSwipeMinDistance = ViewConfiguration.get(context).getScaledTouchSlop();
mMultiTapMaxDistance = ViewConfiguration.get(context).getScaledDoubleTapSlop();
}
@@ -913,11 +915,11 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
@Override
public String toString() {
- return "DetectingState{" +
- "tapCount()=" + tapCount() +
- ", mShortcutTriggered=" + mShortcutTriggered +
- ", mDelayedEventQueue=" + MotionEventInfo.toString(mDelayedEventQueue) +
- '}';
+ return "DetectingState{"
+ + "tapCount()=" + tapCount()
+ + ", mShortcutTriggered=" + mShortcutTriggered
+ + ", mDelayedEventQueue=" + MotionEventInfo.toString(mDelayedEventQueue)
+ + '}';
}
void toggleShortcutTriggered() {
@@ -986,18 +988,18 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
@Override
public String toString() {
- return "MagnificationGesture{" +
- "mDetectingState=" + mDetectingState +
- ", mDelegatingState=" + mDelegatingState +
- ", mMagnifiedInteractionState=" + mPanningScalingState +
- ", mViewportDraggingState=" + mViewportDraggingState +
- ", mDetectTripleTap=" + mDetectTripleTap +
- ", mDetectShortcutTrigger=" + mDetectShortcutTrigger +
- ", mCurrentState=" + State.nameOf(mCurrentState) +
- ", mPreviousState=" + State.nameOf(mPreviousState) +
- ", mMagnificationController=" + mMagnificationController +
- ", mDisplayId=" + mDisplayId +
- '}';
+ return "MagnificationGesture{"
+ + "mDetectingState=" + mDetectingState
+ + ", mDelegatingState=" + mDelegatingState
+ + ", mMagnifiedInteractionState=" + mPanningScalingState
+ + ", mViewportDraggingState=" + mViewportDraggingState
+ + ", mDetectTripleTap=" + mDetectTripleTap
+ + ", mDetectShortcutTrigger=" + mDetectShortcutTrigger
+ + ", mCurrentState=" + State.nameOf(mCurrentState)
+ + ", mPreviousState=" + State.nameOf(mPreviousState)
+ + ", mMagnificationController=" + mMagnificationController
+ + ", mDisplayId=" + mDisplayId
+ + '}';
}
private static final class MotionEventInfo {
@@ -1085,9 +1087,10 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
*/
private static class ScreenStateReceiver extends BroadcastReceiver {
private final Context mContext;
- private final MagnificationGestureHandler mGestureHandler;
+ private final FullScreenMagnificationGestureHandler mGestureHandler;
- public ScreenStateReceiver(Context context, MagnificationGestureHandler gestureHandler) {
+ ScreenStateReceiver(Context context,
+ FullScreenMagnificationGestureHandler gestureHandler) {
mContext = context;
mGestureHandler = gestureHandler;
}
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGestureHandler.java
new file mode 100644
index 000000000000..aa500b5b627f
--- /dev/null
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGestureHandler.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.accessibility.magnification;
+
+import com.android.server.accessibility.BaseEventStreamTransformation;
+
+/**
+ * A base class that detects gestures and defines common methods for magnification.
+ */
+public abstract class MagnificationGestureHandler extends BaseEventStreamTransformation {
+
+ /**
+ * Called when the shortcut target is magnification.
+ */
+ public abstract void notifyShortcutTriggered();
+}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 845738dc2c9c..f5e342323831 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -2990,6 +2990,24 @@ class StorageManagerService extends IStorageManager.Stub
}
/*
+ * Clear disk encryption key bound to the associated token / secret pair. Removing the user
+ * binding of the Disk encryption key is done in two phases: first, this call will retrieve
+ * the disk encryption key using the provided token / secret pair and store it by
+ * encrypting it with a keymaster key not bound to the user, then fixateNewestUserKeyAuth
+ * is called to delete all other bindings of the disk encryption key.
+ */
+ @Override
+ public void clearUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret) {
+ enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
+
+ try {
+ mVold.clearUserKeyAuth(userId, serialNumber, encodeBytes(token), encodeBytes(secret));
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ }
+ }
+
+ /*
* Delete all disk encryption token/secret pairs except the most recently added one
*/
@Override
diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java
index ed3bab97ca19..35a980286d8f 100644
--- a/services/core/java/com/android/server/TestNetworkService.java
+++ b/services/core/java/com/android/server/TestNetworkService.java
@@ -218,7 +218,7 @@ class TestNetworkService extends ITestNetworkManager.Stub {
// Has to be in TestNetworkAgent to ensure all teardown codepaths properly clean up
// resources, even for binder death or unwanted calls.
synchronized (mTestNetworkTracker) {
- mTestNetworkTracker.remove(network.netId);
+ mTestNetworkTracker.remove(getNetwork().netId);
}
}
}
@@ -337,7 +337,7 @@ class TestNetworkService extends ITestNetworkManager.Stub {
callingUid,
binder);
- mTestNetworkTracker.put(agent.network.netId, agent);
+ mTestNetworkTracker.put(agent.getNetwork().netId, agent);
}
} catch (SocketException e) {
throw new UncheckedIOException(e);
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 9085d18167f6..fc4bad722904 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -30,10 +30,14 @@ import android.provider.DeviceConfig.OnPropertiesChangedListener;
import android.provider.DeviceConfig.Properties;
import android.provider.Settings;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.KeyValueListParser;
import android.util.Slog;
import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
/**
* Settings constants that can modify the activity manager's behavior.
@@ -65,6 +69,10 @@ final class ActivityManagerConstants extends ContentObserver {
= "service_usage_interaction_time";
private static final String KEY_USAGE_STATS_INTERACTION_INTERVAL
= "usage_stats_interaction_interval";
+ private static final String KEY_IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES =
+ "imperceptible_kill_exempt_packages";
+ private static final String KEY_IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES =
+ "imperceptible_kill_exempt_proc_states";
static final String KEY_SERVICE_RESTART_DURATION = "service_restart_duration";
static final String KEY_SERVICE_RESET_RUN_DURATION = "service_reset_run_duration";
static final String KEY_SERVICE_RESTART_DURATION_FACTOR = "service_restart_duration_factor";
@@ -282,6 +290,19 @@ final class ActivityManagerConstants extends ContentObserver {
// memory trimming.
public int CUR_TRIM_CACHED_PROCESSES;
+ /**
+ * Packages that can't be killed even if it's requested to be killed on imperceptible.
+ */
+ public ArraySet<String> IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES = new ArraySet<String>();
+
+ /**
+ * Proc State that can't be killed even if it's requested to be killed on imperceptible.
+ */
+ public ArraySet<Integer> IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES = new ArraySet<Integer>();
+
+ private List<String> mDefaultImperceptibleKillExemptPackages;
+ private List<Integer> mDefaultImperceptibleKillExemptProcStates;
+
@SuppressWarnings("unused")
private static final int OOMADJ_UPDATE_POLICY_SLOW = 0;
private static final int OOMADJ_UPDATE_POLICY_QUICK = 1;
@@ -332,6 +353,10 @@ final class ActivityManagerConstants extends ContentObserver {
case KEY_OOMADJ_UPDATE_POLICY:
updateOomAdjUpdatePolicy();
break;
+ case KEY_IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES:
+ case KEY_IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES:
+ updateImperceptibleKillExemptions();
+ break;
default:
break;
}
@@ -350,6 +375,13 @@ final class ActivityManagerConstants extends ContentObserver {
MIN_AUTOMATIC_HEAP_DUMP_PSS_THRESHOLD_BYTES,
context.getResources().getInteger(
com.android.internal.R.integer.config_debugSystemServerPssThresholdBytes));
+ mDefaultImperceptibleKillExemptPackages = Arrays.asList(
+ context.getResources().getStringArray(
+ com.android.internal.R.array.config_defaultImperceptibleKillingExemptionPkgs));
+ mDefaultImperceptibleKillExemptProcStates = Arrays.stream(
+ context.getResources().getIntArray(
+ com.android.internal.R.array.config_defaultImperceptibleKillingExemptionProcStates))
+ .boxed().collect(Collectors.toList());
}
public void start(ContentResolver resolver) {
@@ -371,6 +403,7 @@ final class ActivityManagerConstants extends ContentObserver {
updateActivityStartsLoggingEnabled();
updateBackgroundActivityStarts();
updateOomAdjUpdatePolicy();
+ updateImperceptibleKillExemptions();
}
public void setOverrideMaxCachedProcesses(int value) {
@@ -497,6 +530,29 @@ final class ActivityManagerConstants extends ContentObserver {
== OOMADJ_UPDATE_POLICY_QUICK;
}
+ private void updateImperceptibleKillExemptions() {
+ IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.clear();
+ IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.addAll(mDefaultImperceptibleKillExemptPackages);
+ String val = DeviceConfig.getString(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES, null);
+ if (!TextUtils.isEmpty(val)) {
+ IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.addAll(Arrays.asList(val.split(",")));
+ }
+
+ IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES.clear();
+ IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES.addAll(mDefaultImperceptibleKillExemptProcStates);
+ val = DeviceConfig.getString(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES, null);
+ if (!TextUtils.isEmpty(val)) {
+ Arrays.asList(val.split(",")).stream().forEach((v) -> {
+ try {
+ IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES.add(Integer.parseInt(v));
+ } catch (NumberFormatException e) {
+ }
+ });
+ }
+ }
+
private void updateEnableAutomaticSystemServerHeapDumps() {
if (!mSystemServerAutomaticHeapDumpEnabled) {
Slog.wtf(TAG,
@@ -603,6 +659,10 @@ final class ActivityManagerConstants extends ContentObserver {
pw.println(MEMORY_INFO_THROTTLE_TIME);
pw.print(" "); pw.print(KEY_TOP_TO_FGS_GRACE_DURATION); pw.print("=");
pw.println(TOP_TO_FGS_GRACE_DURATION);
+ pw.print(" "); pw.print(KEY_IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES); pw.print("=");
+ pw.println(Arrays.toString(IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES.toArray()));
+ pw.print(" "); pw.print(KEY_IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES); pw.print("=");
+ pw.println(Arrays.toString(IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.toArray()));
pw.println();
if (mOverrideMaxCachedProcesses >= 0) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index b8090dbcf809..b0369752bdaf 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -8919,6 +8919,26 @@ public class ActivityManagerService extends IActivityManager.Stub
return killed;
}
+ /**
+ * Similar to {@link #killPids} but killing will be delayed until the device is idle
+ * and the given process is imperceptible.
+ */
+ @Override
+ public void killProcessesWhenImperceptible(int[] pids, String reason) {
+ if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires permission "
+ + android.Manifest.permission.FORCE_STOP_PACKAGES);
+ }
+ int callerUid = Binder.getCallingUid();
+ long iden = Binder.clearCallingIdentity();
+ try {
+ mProcessList.killProcessesWhenImperceptible(pids, reason, callerUid);
+ } finally {
+ Binder.restoreCallingIdentity(iden);
+ }
+ }
+
@Override
public void hang(final IBinder who, boolean allowRestart) {
if (checkCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER)
@@ -9685,7 +9705,7 @@ public class ActivityManagerService extends IActivityManager.Stub
* Utility function for addErrorToDropBox and handleStrictModeViolation's logging
* to append various headers to the dropbox log text.
*/
- private void appendDropBoxProcessHeaders(ProcessRecord process, String processName,
+ void appendDropBoxProcessHeaders(ProcessRecord process, String processName,
StringBuilder sb) {
// Watchdog thread ends up invoking this function (with
// a null ProcessRecord) to add the stack file to dropbox.
diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java
index aa8bc04f0f7c..fa55701cd882 100644
--- a/services/core/java/com/android/server/am/CoreSettingsObserver.java
+++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java
@@ -16,15 +16,21 @@
package com.android.server.am;
+import android.app.ActivityThread;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
+import android.provider.DeviceConfig;
import android.provider.Settings;
+import android.widget.WidgetFlags;
import com.android.internal.annotations.VisibleForTesting;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
import java.util.Map;
/**
@@ -36,6 +42,19 @@ import java.util.Map;
final class CoreSettingsObserver extends ContentObserver {
private static final String LOG_TAG = CoreSettingsObserver.class.getSimpleName();
+ private static class DeviceConfigEntry {
+ String namespace;
+ String flag;
+ String coreSettingKey;
+ Class<?> type;
+ DeviceConfigEntry(String namespace, String flag, String coreSettingKey, Class<?> type) {
+ this.namespace = namespace;
+ this.flag = flag;
+ this.coreSettingKey = coreSettingKey;
+ this.type = type;
+ }
+ }
+
// mapping form property name to its type
@VisibleForTesting
static final Map<String, Class<?>> sSecureSettingToTypeMap = new HashMap<
@@ -46,6 +65,7 @@ final class CoreSettingsObserver extends ContentObserver {
@VisibleForTesting
static final Map<String, Class<?>> sGlobalSettingToTypeMap = new HashMap<
String, Class<?>>();
+ static final List<DeviceConfigEntry> sDeviceConfigEntries = new ArrayList<DeviceConfigEntry>();
static {
sSecureSettingToTypeMap.put(Settings.Secure.LONG_PRESS_TIMEOUT, int.class);
sSecureSettingToTypeMap.put(Settings.Secure.MULTI_PRESS_TIMEOUT, int.class);
@@ -84,6 +104,11 @@ final class CoreSettingsObserver extends ContentObserver {
sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_BLACKLISTS, String.class);
sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, String.class);
// add other global settings here...
+
+ sDeviceConfigEntries.add(new DeviceConfigEntry(
+ DeviceConfig.NAMESPACE_WIDGET, WidgetFlags.ENABLE_CURSOR_CONTROL,
+ WidgetFlags.KEY_ENABLE_CURSOR_CONTROL, boolean.class));
+ // add other device configs here...
}
private final Bundle mCoreSettings = new Bundle();
@@ -112,6 +137,7 @@ final class CoreSettingsObserver extends ContentObserver {
populateSettings(mCoreSettings, sSecureSettingToTypeMap);
populateSettings(mCoreSettings, sSystemSettingToTypeMap);
populateSettings(mCoreSettings, sGlobalSettingToTypeMap);
+ populateSettingsFromDeviceConfig();
mActivityManagerService.onCoreSettingsChange(mCoreSettings);
}
@@ -133,6 +159,16 @@ final class CoreSettingsObserver extends ContentObserver {
mActivityManagerService.mContext.getContentResolver().registerContentObserver(
uri, false, this);
}
+
+ HashSet<String> deviceConfigNamespaces = new HashSet<>();
+ for (DeviceConfigEntry entry : sDeviceConfigEntries) {
+ if (!deviceConfigNamespaces.contains(entry.namespace)) {
+ DeviceConfig.addOnPropertiesChangedListener(
+ entry.namespace, ActivityThread.currentApplication().getMainExecutor(),
+ (DeviceConfig.Properties prop) -> onChange(false));
+ deviceConfigNamespaces.add(entry.namespace);
+ }
+ }
}
@VisibleForTesting
@@ -164,4 +200,25 @@ final class CoreSettingsObserver extends ContentObserver {
}
}
}
+
+ private void populateSettingsFromDeviceConfig() {
+ for (DeviceConfigEntry entry : sDeviceConfigEntries) {
+ if (entry.type == String.class) {
+ mCoreSettings.putString(entry.coreSettingKey,
+ DeviceConfig.getString(entry.namespace, entry.flag, ""));
+ } else if (entry.type == int.class) {
+ mCoreSettings.putInt(entry.coreSettingKey,
+ DeviceConfig.getInt(entry.namespace, entry.flag, 0));
+ } else if (entry.type == float.class) {
+ mCoreSettings.putFloat(entry.coreSettingKey,
+ DeviceConfig.getFloat(entry.namespace, entry.flag, 0));
+ } else if (entry.type == long.class) {
+ mCoreSettings.putLong(entry.coreSettingKey,
+ DeviceConfig.getLong(entry.namespace, entry.flag, 0));
+ } else if (entry.type == boolean.class) {
+ mCoreSettings.putInt(entry.coreSettingKey,
+ DeviceConfig.getBoolean(entry.namespace, entry.flag, false) ? 1 : 0);
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index c8a8cd79c9b0..7f9477ed5c9b 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -58,9 +58,12 @@ import android.app.ApplicationExitInfo;
import android.app.ApplicationExitInfo.Reason;
import android.app.ApplicationExitInfo.SubReason;
import android.app.IApplicationThread;
+import android.app.IUidObserver;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManagerInternal;
@@ -72,10 +75,12 @@ import android.os.AppZygote;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
+import android.os.DropBoxManager;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.StrictMode;
@@ -658,6 +663,11 @@ public final class ProcessList {
}
}
+ /**
+ * A runner to handle the imperceptible killings.
+ */
+ ImperceptibleKillRunner mImperceptibleKillRunner;
+
//////////////////// END FIELDS ////////////////////
ProcessList() {
@@ -737,6 +747,7 @@ public final class ProcessList {
EVENT_INPUT, this::handleZygoteMessages);
}
mAppExitInfoTracker.init(mService, sKillThread.getLooper());
+ mImperceptibleKillRunner = new ImperceptibleKillRunner(sKillThread.getLooper());
}
}
@@ -3684,5 +3695,294 @@ public final class ProcessList {
mAppExitInfoTracker.scheduleNoteAppKill(pid, uid, reason, subReason, msg);
}
+
+ /**
+ * Schedule to kill the given pids when the device is idle
+ */
+ void killProcessesWhenImperceptible(int[] pids, String reason, int requester) {
+ if (ArrayUtils.isEmpty(pids)) {
+ return;
+ }
+
+ synchronized (mService) {
+ ProcessRecord app;
+ for (int i = 0; i < pids.length; i++) {
+ synchronized (mService.mPidsSelfLocked) {
+ app = mService.mPidsSelfLocked.get(pids[i]);
+ }
+ if (app != null) {
+ mImperceptibleKillRunner.enqueueLocked(app, reason, requester);
+ }
+ }
+ }
+ }
+
+ private final class ImperceptibleKillRunner extends IUidObserver.Stub {
+ private static final String EXTRA_PID = "pid";
+ private static final String EXTRA_UID = "uid";
+ private static final String EXTRA_TIMESTAMP = "timestamp";
+ private static final String EXTRA_REASON = "reason";
+ private static final String EXTRA_REQUESTER = "requester";
+
+ private static final String DROPBOX_TAG_IMPERCEPTIBLE_KILL = "imperceptible_app_kill";
+
+ // uid -> killing information mapping
+ private SparseArray<List<Bundle>> mWorkItems = new SparseArray<List<Bundle>>();
+
+ // The last time the various processes have been killed by us.
+ private ProcessMap<Long> mLastProcessKillTimes = new ProcessMap<>();
+
+ // Device idle or not.
+ private volatile boolean mIdle;
+ private boolean mUidObserverEnabled;
+ private Handler mHandler;
+ private IdlenessReceiver mReceiver;
+
+ private final class H extends Handler {
+ static final int MSG_DEVICE_IDLE = 0;
+ static final int MSG_UID_GONE = 1;
+ static final int MSG_UID_STATE_CHANGED = 2;
+
+ H(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_DEVICE_IDLE:
+ handleDeviceIdle();
+ break;
+ case MSG_UID_GONE:
+ handleUidGone(msg.arg1 /* uid */);
+ break;
+ case MSG_UID_STATE_CHANGED:
+ handleUidStateChanged(msg.arg1 /* uid */, msg.arg2 /* procState */);
+ break;
+ }
+ }
+ }
+
+ private final class IdlenessReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final PowerManager pm = mService.mContext.getSystemService(PowerManager.class);
+ switch (intent.getAction()) {
+ case PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED:
+ notifyDeviceIdleness(pm.isLightDeviceIdleMode());
+ break;
+ case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED:
+ notifyDeviceIdleness(pm.isDeviceIdleMode());
+ break;
+ }
+ }
+ }
+
+ ImperceptibleKillRunner(Looper looper) {
+ mHandler = new H(looper);
+ }
+
+ @GuardedBy("mService")
+ boolean enqueueLocked(ProcessRecord app, String reason, int requester) {
+ // Throttle the killing request for potential bad app to avoid cpu thrashing
+ Long last = app.isolated ? null : mLastProcessKillTimes.get(app.processName, app.uid);
+ if (last != null && SystemClock.uptimeMillis() < last + MIN_CRASH_INTERVAL) {
+ return false;
+ }
+
+ final Bundle bundle = new Bundle();
+ bundle.putInt(EXTRA_PID, app.pid);
+ bundle.putInt(EXTRA_UID, app.uid);
+ // Since the pid could be reused, let's get the actual start time of each process
+ bundle.putLong(EXTRA_TIMESTAMP, app.startTime);
+ bundle.putString(EXTRA_REASON, reason);
+ bundle.putInt(EXTRA_REQUESTER, requester);
+ List<Bundle> list = mWorkItems.get(app.uid);
+ if (list == null) {
+ list = new ArrayList<Bundle>();
+ mWorkItems.put(app.uid, list);
+ }
+ list.add(bundle);
+ if (mReceiver == null) {
+ mReceiver = new IdlenessReceiver();
+ IntentFilter filter = new IntentFilter(
+ PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED);
+ filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
+ mService.mContext.registerReceiver(mReceiver, filter);
+ }
+ return true;
+ }
+
+ void notifyDeviceIdleness(boolean idle) {
+ // No lock is held regarding mIdle, this function is the only updater and caller
+ // won't re-entry.
+ boolean diff = mIdle != idle;
+ mIdle = idle;
+ if (diff && idle) {
+ synchronized (this) {
+ if (mWorkItems.size() > 0) {
+ mHandler.sendEmptyMessage(H.MSG_DEVICE_IDLE);
+ }
+ }
+ }
+ }
+
+ private void handleDeviceIdle() {
+ final DropBoxManager dbox = mService.mContext.getSystemService(DropBoxManager.class);
+ final boolean logToDropbox = dbox != null
+ && dbox.isTagEnabled(DROPBOX_TAG_IMPERCEPTIBLE_KILL);
+
+ synchronized (mService) {
+ final int size = mWorkItems.size();
+ for (int i = size - 1; mIdle && i >= 0; i--) {
+ List<Bundle> list = mWorkItems.valueAt(i);
+ final int len = list.size();
+ for (int j = len - 1; mIdle && j >= 0; j--) {
+ Bundle bundle = list.get(j);
+ if (killProcessLocked(
+ bundle.getInt(EXTRA_PID),
+ bundle.getInt(EXTRA_UID),
+ bundle.getLong(EXTRA_TIMESTAMP),
+ bundle.getString(EXTRA_REASON),
+ bundle.getInt(EXTRA_REQUESTER),
+ dbox, logToDropbox)) {
+ list.remove(j);
+ }
+ }
+ if (list.size() == 0) {
+ mWorkItems.removeAt(i);
+ }
+ }
+ registerUidObserverIfNecessaryLocked();
+ }
+ }
+
+ @GuardedBy("mService")
+ private void registerUidObserverIfNecessaryLocked() {
+ // If there are still works remaining, register UID observer
+ if (!mUidObserverEnabled && mWorkItems.size() > 0) {
+ mUidObserverEnabled = true;
+ mService.registerUidObserver(this,
+ ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE,
+ ActivityManager.PROCESS_STATE_UNKNOWN, "android");
+ } else if (mUidObserverEnabled && mWorkItems.size() == 0) {
+ mUidObserverEnabled = false;
+ mService.unregisterUidObserver(this);
+ }
+ }
+
+ /**
+ * Kill the given processes, if they are not exempted.
+ *
+ * @return True if the process is killed, or it's gone already, or we are not allowed to
+ * kill it (one of the packages in this process is being exempted).
+ */
+ @GuardedBy("mService")
+ private boolean killProcessLocked(final int pid, final int uid, final long timestamp,
+ final String reason, final int requester, final DropBoxManager dbox,
+ final boolean logToDropbox) {
+ ProcessRecord app = null;
+ synchronized (mService.mPidsSelfLocked) {
+ app = mService.mPidsSelfLocked.get(pid);
+ }
+
+ if (app == null || app.pid != pid || app.uid != uid || app.startTime != timestamp) {
+ // This process record has been reused for another process, meaning the old process
+ // has been gone.
+ return true;
+ }
+
+ final int pkgSize = app.pkgList.size();
+ for (int ip = 0; ip < pkgSize; ip++) {
+ if (mService.mConstants.IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.contains(
+ app.pkgList.keyAt(ip))) {
+ // One of the packages in this process is exempted
+ return true;
+ }
+ }
+
+ if (mService.mConstants.IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES.contains(
+ app.getReportedProcState())) {
+ // We need to reschedule it.
+ return false;
+ }
+
+ app.kill(reason, ApplicationExitInfo.REASON_OTHER, true);
+
+ if (!app.isolated) {
+ mLastProcessKillTimes.put(app.processName, app.uid, SystemClock.uptimeMillis());
+ }
+
+ if (logToDropbox) {
+ final long now = SystemClock.elapsedRealtime();
+ final StringBuilder sb = new StringBuilder();
+ mService.appendDropBoxProcessHeaders(app, app.processName, sb);
+ sb.append("Reason: " + reason).append("\n");
+ sb.append("Requester UID: " + requester).append("\n");
+ dbox.addText(DROPBOX_TAG_IMPERCEPTIBLE_KILL, sb.toString());
+ }
+ return true;
+ }
+
+ private void handleUidStateChanged(int uid, int procState) {
+ final DropBoxManager dbox = mService.mContext.getSystemService(DropBoxManager.class);
+ final boolean logToDropbox = dbox != null
+ && dbox.isTagEnabled(DROPBOX_TAG_IMPERCEPTIBLE_KILL);
+ synchronized (mService) {
+ if (mIdle && !mService.mConstants
+ .IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES.contains(procState)) {
+ List<Bundle> list = mWorkItems.get(uid);
+ if (list != null) {
+ final int len = list.size();
+ for (int j = len - 1; mIdle && j >= 0; j--) {
+ Bundle bundle = list.get(j);
+ if (killProcessLocked(
+ bundle.getInt(EXTRA_PID),
+ bundle.getInt(EXTRA_UID),
+ bundle.getLong(EXTRA_TIMESTAMP),
+ bundle.getString(EXTRA_REASON),
+ bundle.getInt(EXTRA_REQUESTER),
+ dbox, logToDropbox)) {
+ list.remove(j);
+ }
+ }
+ if (list.size() == 0) {
+ mWorkItems.remove(uid);
+ }
+ registerUidObserverIfNecessaryLocked();
+ }
+ }
+ }
+ }
+
+ private void handleUidGone(int uid) {
+ synchronized (mService) {
+ mWorkItems.remove(uid);
+ registerUidObserverIfNecessaryLocked();
+ }
+ }
+
+ @Override
+ public void onUidGone(int uid, boolean disabled) {
+ mHandler.obtainMessage(H.MSG_UID_GONE, uid, 0).sendToTarget();
+ }
+
+ @Override
+ public void onUidActive(int uid) {
+ }
+
+ @Override
+ public void onUidIdle(int uid, boolean disabled) {
+ }
+
+ @Override
+ public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
+ mHandler.obtainMessage(H.MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
+ }
+
+ @Override
+ public void onUidCachedChanged(int uid, boolean cached) {
+ }
+ };
}
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 1d2a9059c453..0c9abae2e0fc 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -848,7 +848,11 @@ public class Vpn {
}
public int getNetId() {
- return mNetworkAgent != null ? mNetworkAgent.network.netId : NETID_UNSET;
+ final NetworkAgent agent = mNetworkAgent;
+ if (null == agent) return NETID_UNSET;
+ final Network network = agent.getNetwork();
+ if (null == network) return NETID_UNSET;
+ return network.netId;
}
private LinkProperties makeLinkProperties() {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index e39d6d5389e3..d27b245d77ba 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -39,6 +39,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.database.ContentObserver;
import android.graphics.ColorSpace;
import android.graphics.Point;
import android.graphics.Rect;
@@ -60,6 +61,7 @@ import android.hardware.display.WifiDisplayStatus;
import android.hardware.input.InputManagerInternal;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionManager;
+import android.net.Uri;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -77,6 +79,7 @@ import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.Settings;
import android.text.TextUtils;
import android.util.IntArray;
import android.util.Pair;
@@ -304,6 +307,13 @@ public final class DisplayManagerService extends SystemService {
private SensorManager mSensorManager;
+ // Whether minimal post processing is allowed by the user.
+ @GuardedBy("mSyncRoot")
+ private boolean mMinimalPostProcessingAllowed;
+
+ // Receives notifications about changes to Settings.
+ private SettingsObserver mSettingsObserver;
+
public DisplayManagerService(Context context) {
this(context, new Injector());
}
@@ -403,6 +413,7 @@ public final class DisplayManagerService extends SystemService {
BrightnessConfiguration config =
mPersistentDataStore.getBrightnessConfiguration(userSerial);
mDisplayPowerController.setBrightnessConfiguration(config);
+ handleSettingsChange();
}
mDisplayPowerController.onSwitchUser(newUserId);
}
@@ -428,6 +439,8 @@ public final class DisplayManagerService extends SystemService {
// Just in case the top inset changed before the system was ready. At this point, any
// relevant configuration should be in place.
recordTopInsetLocked(mLogicalDisplays.get(Display.DEFAULT_DISPLAY));
+
+ updateSettingsLocked();
}
mDisplayModeDirector.setDesiredDisplayModeSpecsListener(
@@ -435,6 +448,8 @@ public final class DisplayManagerService extends SystemService {
mDisplayModeDirector.start(mSensorManager);
mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS);
+
+ mSettingsObserver = new SettingsObserver();
}
@VisibleForTesting
@@ -569,6 +584,33 @@ public final class DisplayManagerService extends SystemService {
}
}
+ private class SettingsObserver extends ContentObserver {
+ SettingsObserver() {
+ super(mHandler);
+
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(
+ Settings.Secure.MINIMAL_POST_PROCESSING_ALLOWED), false, this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ handleSettingsChange();
+ }
+ }
+
+ private void handleSettingsChange() {
+ synchronized (mSyncRoot) {
+ updateSettingsLocked();
+ scheduleTraversalLocked(false);
+ }
+ }
+
+ private void updateSettingsLocked() {
+ mMinimalPostProcessingAllowed = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.MINIMAL_POST_PROCESSING_ALLOWED, 1, UserHandle.USER_CURRENT) != 0;
+ }
+
private DisplayInfo getDisplayInfoInternal(int displayId, int callingUid) {
synchronized (mSyncRoot) {
LogicalDisplay display = mLogicalDisplays.get(displayId);
@@ -1192,7 +1234,7 @@ public final class DisplayManagerService extends SystemService {
}
private void setDisplayPropertiesInternal(int displayId, boolean hasContent,
- float requestedRefreshRate, int requestedModeId, boolean requestedMinimalPostProcessing,
+ float requestedRefreshRate, int requestedModeId, boolean preferMinimalPostProcessing,
boolean inTraversal) {
synchronized (mSyncRoot) {
LogicalDisplay display = mLogicalDisplays.get(displayId);
@@ -1220,14 +1262,13 @@ public final class DisplayManagerService extends SystemService {
mDisplayModeDirector.getAppRequestObserver().setAppRequestedMode(
displayId, requestedModeId);
+ if (display.getDisplayInfoLocked().minimalPostProcessingSupported) {
+ boolean mppRequest = mMinimalPostProcessingAllowed && preferMinimalPostProcessing;
- if (display.getDisplayInfoLocked().minimalPostProcessingSupported
- && (display.getRequestedMinimalPostProcessingLocked()
- != requestedMinimalPostProcessing)) {
-
- display.setRequestedMinimalPostProcessingLocked(requestedMinimalPostProcessing);
-
- shouldScheduleTraversal = true;
+ if (display.getRequestedMinimalPostProcessingLocked() != mppRequest) {
+ display.setRequestedMinimalPostProcessingLocked(mppRequest);
+ shouldScheduleTraversal = true;
+ }
}
if (shouldScheduleTraversal) {
@@ -2244,6 +2285,13 @@ public final class DisplayManagerService extends SystemService {
}
@Override // Binder call
+ public boolean isMinimalPostProcessingRequested(int displayId) {
+ synchronized (mSyncRoot) {
+ return mLogicalDisplays.get(displayId).getRequestedMinimalPostProcessingLocked();
+ }
+ }
+
+ @Override // Binder call
public void setTemporaryBrightness(int brightness) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS,
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 7233f3465d5b..baae4ea502d5 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -1622,7 +1622,7 @@ public class LockSettingsService extends ILockSettings.Stub {
}
if (credential.isNone()) {
- clearUserKeyProtection(userId);
+ clearUserKeyProtection(userId, null);
gateKeeperClearSecureUserId(userId);
mStorage.writeCredentialHash(CredentialHash.createEmptyHash(), userId);
// Still update PASSWORD_TYPE_KEY if we are running in pre-synthetic password code path,
@@ -1813,9 +1813,17 @@ public class LockSettingsService extends ILockSettings.Stub {
addUserKeyAuth(userId, token, secretFromCredential(credential));
}
- private void clearUserKeyProtection(int userId) {
+ private void clearUserKeyProtection(int userId, byte[] secret) {
if (DEBUG) Slog.d(TAG, "clearUserKeyProtection user=" + userId);
- addUserKeyAuth(userId, null, null);
+ final UserInfo userInfo = mUserManager.getUserInfo(userId);
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ mStorageManager.clearUserKeyAuth(userId, userInfo.serialNumber, null, secret);
+ } catch (RemoteException e) {
+ throw new IllegalStateException("clearUserKeyAuth failed user=" + userId);
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
}
private static byte[] secretFromCredential(LockscreenCredential credential) {
@@ -2571,7 +2579,7 @@ public class LockSettingsService extends ILockSettings.Stub {
setAuthlessUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
setKeystorePassword(auth.deriveKeyStorePassword(), userId);
} else {
- clearUserKeyProtection(userId);
+ clearUserKeyProtection(userId, null);
setKeystorePassword(null, userId);
gateKeeperClearSecureUserId(userId);
}
@@ -2765,7 +2773,7 @@ public class LockSettingsService extends ILockSettings.Stub {
// during boot. Vold storage needs to be unlocked before manipulation of the keys can
// succeed.
unlockUserKey(userId, null, auth.deriveDiskEncryptionKey());
- clearUserKeyProtection(userId);
+ clearUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
fixateNewestUserKeyAuth(userId);
unlockKeystore(auth.deriveKeyStorePassword(), userId);
setKeystorePassword(null, userId);
diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java
index b67335ab82bc..837c489c0cac 100644
--- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java
+++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java
@@ -17,6 +17,7 @@
package com.android.server.media;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
@@ -58,6 +59,7 @@ class BluetoothRouteProvider {
private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver();
private final BluetoothProfileListener mProfileListener = new BluetoothProfileListener();
+ // TODO: The mActiveDevice should be set when BluetoothRouteProvider is created.
private BluetoothDevice mActiveDevice = null;
static synchronized BluetoothRouteProvider getInstance(@NonNull Context context,
@@ -125,6 +127,14 @@ class BluetoothRouteProvider {
return routes;
}
+ @Nullable String getActiveDeviceAddress() {
+ BluetoothDevice device = mActiveDevice;
+ if (device == null) {
+ return null;
+ }
+ return device.getAddress();
+ }
+
private void notifyBluetoothRoutesUpdated() {
if (mListener != null) {
mListener.onBluetoothRoutesUpdated(getBluetoothRoutes());
@@ -135,7 +145,7 @@ class BluetoothRouteProvider {
BluetoothRouteInfo newBtRoute = new BluetoothRouteInfo();
newBtRoute.btDevice = device;
newBtRoute.route = new MediaRoute2Info.Builder(device.getAddress(), device.getName())
- .addFeature(SystemMediaRoute2Provider.TYPE_LIVE_AUDIO)
+ .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO)
.setConnectionState(MediaRoute2Info.CONNECTION_STATE_DISCONNECTED)
.setDescription(mContext.getResources().getText(
R.string.bluetooth_a2dp_audio_route_name).toString())
@@ -281,8 +291,8 @@ class BluetoothRouteProvider {
setRouteConnectionStateForDevice(device,
MediaRoute2Info.CONNECTION_STATE_CONNECTED);
}
- notifyBluetoothRoutesUpdated();
mActiveDevice = device;
+ notifyBluetoothRoutesUpdated();
}
break;
case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 216753017010..f9169ee69d41 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -112,6 +112,30 @@ class MediaRouter2ServiceImpl {
}
}
+ @NonNull
+ public RoutingSessionInfo getSystemSessionInfo() {
+ final int uid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ RoutingSessionInfo systemSessionInfo = null;
+ synchronized (mLock) {
+ UserRecord userRecord = getOrCreateUserRecordLocked(userId);
+ List<RoutingSessionInfo> sessionInfos =
+ userRecord.mHandler.mSystemProvider.getSessionInfos();
+ if (sessionInfos != null && !sessionInfos.isEmpty()) {
+ systemSessionInfo = sessionInfos.get(0);
+ } else {
+ Slog.w(TAG, "System provider does not have any session info.");
+ }
+ }
+ return systemSessionInfo;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
public void registerClient(@NonNull IMediaRouter2Client client,
@NonNull String packageName) {
Objects.requireNonNull(client, "client must not be null");
@@ -1351,6 +1375,16 @@ class MediaRouter2ServiceImpl {
List<IMediaRouter2Manager> managers = getManagers();
notifySessionInfosChangedToManagers(managers);
+ // For system provider, notify all clients.
+ if (provider == mSystemProvider) {
+ MediaRouter2ServiceImpl service = mServiceRef.get();
+ if (service == null) {
+ return;
+ }
+ notifySessionInfoChangedToClients(getClients(), sessionInfo);
+ return;
+ }
+
Client2Record client2Record = mSessionToClientMap.get(
sessionInfo.getId());
if (client2Record == null) {
@@ -1509,6 +1543,17 @@ class MediaRouter2ServiceImpl {
}
}
+ private void notifySessionInfoChangedToClients(List<IMediaRouter2Client> clients,
+ RoutingSessionInfo sessionInfo) {
+ for (IMediaRouter2Client client : clients) {
+ try {
+ client.notifySessionInfoChanged(sessionInfo);
+ } catch (RemoteException ex) {
+ Slog.w(TAG, "Failed to notify session info changed. Client probably died.", ex);
+ }
+ }
+ }
+
private void notifyRoutesToManager(IMediaRouter2Manager manager) {
List<MediaRoute2Info> routes = new ArrayList<>();
for (MediaRoute2ProviderInfo providerInfo : mLastProviderInfos) {
diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java
index 5437fadf2d74..e1d38039b955 100644
--- a/services/core/java/com/android/server/media/MediaRouterService.java
+++ b/services/core/java/com/android/server/media/MediaRouterService.java
@@ -444,6 +444,12 @@ public final class MediaRouterService extends IMediaRouterService.Stub
// Binder call
@Override
+ public RoutingSessionInfo getSystemSessionInfo() {
+ return mService2.getSystemSessionInfo();
+ }
+
+ // Binder call
+ @Override
public void registerClient2(IMediaRouter2Client client, String packageName) {
final int uid = Binder.getCallingUid();
if (!validatePackageName(uid, packageName)) {
diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
index 56c33fe339ea..6f6d8a1e8df4 100644
--- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
+++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
@@ -16,6 +16,9 @@
package com.android.server.media;
+import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO;
+import static android.media.MediaRoute2Info.FEATURE_LIVE_VIDEO;
+
import android.annotation.NonNull;
import android.content.ComponentName;
import android.content.Context;
@@ -26,17 +29,20 @@ import android.media.IAudioRoutesObserver;
import android.media.IAudioService;
import android.media.MediaRoute2Info;
import android.media.MediaRoute2ProviderInfo;
+import android.media.RoutingSessionInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.text.TextUtils;
import android.util.Log;
import com.android.internal.R;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
/**
* Provides routes for local playbacks such as phone speaker, wired headset, or Bluetooth speakers.
@@ -46,11 +52,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
static final String DEFAULT_ROUTE_ID = "DEFAULT_ROUTE";
- static final String BLUETOOTH_ROUTE_ID = "BLUETOOTH_ROUTE";
-
- // TODO: Move these to a proper place
- public static final String TYPE_LIVE_AUDIO = "android.media.intent.route.TYPE_LIVE_AUDIO";
- public static final String TYPE_LIVE_VIDEO = "android.media.intent.route.TYPE_LIVE_VIDEO";
+ static final String SYSTEM_SESSION_ID = "SYSTEM_SESSION";
private final AudioManager mAudioManager;
private final IAudioService mAudioService;
@@ -92,6 +94,14 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
mBtRouteProvider = BluetoothRouteProvider.getInstance(context, (routes) -> {
mBluetoothRoutes = routes;
publishRoutes();
+
+ boolean sessionInfoChanged;
+ synchronized (mLock) {
+ sessionInfoChanged = updateSessionInfosIfNeededLocked();
+ }
+ if (sessionInfoChanged) {
+ notifySessionInfoUpdated();
+ }
});
initializeRoutes();
}
@@ -147,8 +157,8 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
: MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE)
.setVolumeMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC))
.setVolume(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC))
- .addFeature(TYPE_LIVE_AUDIO)
- .addFeature(TYPE_LIVE_VIDEO)
+ .addFeature(FEATURE_LIVE_AUDIO)
+ .addFeature(FEATURE_LIVE_VIDEO)
.build();
AudioRoutesInfo newAudioRoutes = null;
@@ -172,6 +182,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
}
setProviderState(builder.build());
mHandler.post(() -> notifyProviderState());
+
+ // Note: No lock needed when initializing.
+ updateSessionInfosIfNeededLocked();
}
void updateAudioRoutes(AudioRoutesInfo newRoutes) {
@@ -195,14 +208,43 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
: MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE)
.setVolumeMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC))
.setVolume(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC))
- .addFeature(TYPE_LIVE_AUDIO)
- .addFeature(TYPE_LIVE_VIDEO)
+ .addFeature(FEATURE_LIVE_AUDIO)
+ .addFeature(FEATURE_LIVE_VIDEO)
.build();
publishRoutes();
}
/**
+ * Updates the mSessionInfo. Returns true if the session info is changed.
+ */
+ boolean updateSessionInfosIfNeededLocked() {
+ RoutingSessionInfo oldSessionInfo = mSessionInfos.isEmpty() ? null : mSessionInfos.get(0);
+
+ RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
+ SYSTEM_SESSION_ID, "" /* clientPackageName */)
+ .setSystemSession(true);
+ String activeBtDeviceAddress = mBtRouteProvider.getActiveDeviceAddress();
+
+ RoutingSessionInfo newSessionInfo;
+ if (!TextUtils.isEmpty(activeBtDeviceAddress)) {
+ // Bluetooth route. Set the route ID with the device's address.
+ newSessionInfo = builder.addSelectedRoute(activeBtDeviceAddress).build();
+ } else {
+ // Default device
+ newSessionInfo = builder.addSelectedRoute(mDefaultRoute.getId()).build();
+ }
+
+ if (Objects.equals(oldSessionInfo, newSessionInfo)) {
+ return false;
+ } else {
+ mSessionInfos.clear();
+ mSessionInfos.add(newSessionInfo);
+ return true;
+ }
+ }
+
+ /**
* The first route should be the currently selected system route.
* For example, if there are two system routes (BT and device speaker),
* BT will be the first route in the list.
@@ -215,4 +257,12 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
}
setAndNotifyProviderState(builder.build());
}
+
+ void notifySessionInfoUpdated() {
+ RoutingSessionInfo sessionInfo;
+ synchronized (mLock) {
+ sessionInfo = mSessionInfos.get(0);
+ }
+ mCallback.onSessionUpdated(this, sessionInfo);
+ }
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 71555c98f9d2..78875da9e790 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -152,7 +152,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private static final int MSG_COMMIT = 1;
private static final int MSG_ON_PACKAGE_INSTALLED = 2;
private static final int MSG_SEAL = 3;
- private static final int MSG_TRANSFER = 4;
/** XML constants used for persisting a session */
static final String TAG_SESSION = "session";
@@ -388,32 +387,19 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private final Handler.Callback mHandlerCallback = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
- SomeArgs args;
- String packageName;
- IntentSender statusReceiver;
switch (msg.what) {
case MSG_SEAL:
- statusReceiver = (IntentSender) msg.obj;
-
- handleSeal(statusReceiver);
+ handleSeal((IntentSender) msg.obj);
break;
case MSG_COMMIT:
handleCommit();
break;
- case MSG_TRANSFER:
- args = (SomeArgs) msg.obj;
- packageName = (String) args.arg1;
- statusReceiver = (IntentSender) args.arg2;
- args.recycle();
-
- handleTransfer(statusReceiver, packageName);
- break;
case MSG_ON_PACKAGE_INSTALLED:
- args = (SomeArgs) msg.obj;
- packageName = (String) args.arg1;
+ final SomeArgs args = (SomeArgs) msg.obj;
+ final String packageName = (String) args.arg1;
final String message = (String) args.arg2;
final Bundle extras = (Bundle) args.arg3;
- statusReceiver = (IntentSender) args.arg4;
+ final IntentSender statusReceiver = (IntentSender) args.arg4;
final int returnCode = args.argi1;
args.recycle();
@@ -459,7 +445,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
* Checks if the permissions still need to be confirmed.
*
* <p>This is dependant on the identity of the installer, hence this cannot be cached if the
- * installer might still {@link #transfer(String, IntentSender) change}.
+ * installer might still {@link #transfer(String) change}.
*
* @return {@code true} iff we need to ask to confirm the permissions?
*/
@@ -1403,11 +1389,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
}
- private int assertCanBeTransferredAndReturnNewOwner(String packageName)
- throws PackageManager.NameNotFoundException {
+ @Override
+ public void transfer(String packageName) {
+ Objects.requireNonNull(packageName);
+
ApplicationInfo newOwnerAppInfo = mPm.getApplicationInfo(packageName, 0, userId);
if (newOwnerAppInfo == null) {
- throw new PackageManager.NameNotFoundException(packageName);
+ throw new ParcelableException(new PackageManager.NameNotFoundException(packageName));
}
if (PackageManager.PERMISSION_GRANTED != mPm.checkUidPermission(
@@ -1422,106 +1410,31 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
throw new SecurityException("Can only transfer sessions that use public options");
}
- return newOwnerAppInfo.uid;
- }
-
- @Override
- public void transfer(String packageName, IntentSender statusReceiver) {
- Objects.requireNonNull(statusReceiver);
- Objects.requireNonNull(packageName);
-
- try {
- assertCanBeTransferredAndReturnNewOwner(packageName);
- } catch (PackageManager.NameNotFoundException e) {
- throw new ParcelableException(e);
- }
+ List<PackageInstallerSession> childSessions = getChildSessions();
synchronized (mLock) {
assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotSealedLocked("transfer");
- }
-
- final SomeArgs args = SomeArgs.obtain();
- args.arg1 = packageName;
- args.arg2 = statusReceiver;
-
- mHandler.obtainMessage(MSG_TRANSFER, args).sendToTarget();
- }
-
- private void handleTransfer(IntentSender statusReceiver, String packageName) {
- List<PackageInstallerSession> childSessions = getChildSessions();
-
- try {
- final int uid = assertCanBeTransferredAndReturnNewOwner(packageName);
-
- synchronized (mLock) {
- assertPreparedAndNotSealedLocked("transfer");
-
- try {
- sealAndValidateLocked(childSessions);
- } catch (StreamingException e) {
- throw new IllegalArgumentException("Streaming failed", e);
- } catch (PackageManagerException e) {
- throw new IllegalArgumentException("Package is not valid", e);
- }
- if (!mPackageName.equals(mInstallSource.installerPackageName)) {
- throw new SecurityException(
- "Can only transfer sessions that update the original installer");
- }
+ try {
+ sealLocked(childSessions);
+ } catch (PackageManagerException e) {
+ throw new IllegalArgumentException("Package is not valid", e);
+ }
- mInstallerUid = uid;
- mInstallSource = InstallSource.create(packageName, null, packageName);
+ if (!mPackageName.equals(mInstallSource.installerPackageName)) {
+ throw new SecurityException("Can only transfer sessions that update the original "
+ + "installer");
}
- } catch (PackageManager.NameNotFoundException e) {
- onSessionTransferStatus(statusReceiver, packageName,
- PackageInstaller.STATUS_FAILURE_NAME_NOT_FOUND, e.getMessage());
- return;
- } catch (IllegalStateException e) {
- onSessionTransferStatus(statusReceiver, packageName,
- PackageInstaller.STATUS_FAILURE_ILLEGAL_STATE, e.getMessage());
- return;
- } catch (SecurityException e) {
- onSessionTransferStatus(statusReceiver, packageName,
- PackageInstaller.STATUS_FAILURE_SECURITY, e.getMessage());
- return;
- } catch (Throwable e) {
- onSessionTransferStatus(statusReceiver, packageName, PackageInstaller.STATUS_FAILURE,
- e.getMessage());
- return;
+
+ mInstallerUid = newOwnerAppInfo.uid;
+ mInstallSource = InstallSource.create(packageName, null, packageName);
}
// Persist the fact that we've sealed ourselves to prevent
// mutations of any hard links we create. We do this without holding
// the session lock, since otherwise it's a lock inversion.
mCallback.onSessionSealedBlocking(this);
-
- // Report success.
- onSessionTransferStatus(statusReceiver, packageName, PackageInstaller.STATUS_SUCCESS, null);
- }
-
- private void onSessionTransferStatus(IntentSender statusReceiver, String otherPackageName,
- int status, String statusMessage) {
- final String packageName;
- synchronized (mLock) {
- packageName = mPackageName;
- }
-
- final Intent fillIn = new Intent();
- fillIn.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, packageName);
- fillIn.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId);
- fillIn.putExtra(PackageInstaller.EXTRA_OTHER_PACKAGE_NAME, otherPackageName);
-
- fillIn.putExtra(PackageInstaller.EXTRA_STATUS, status);
- if (!TextUtils.isEmpty(statusMessage)) {
- fillIn.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, statusMessage);
- }
-
- try {
- statusReceiver.sendIntent(mContext, 0, fillIn, null, null);
- } catch (IntentSender.SendIntentException ignored) {
- }
-
}
private void handleCommit() {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index ea83adba4d8a..ec9049ee05ee 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -46,7 +46,6 @@ import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_SYSTEM_WINDOW;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
@@ -55,6 +54,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION;
import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION;
import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG;
@@ -1632,7 +1632,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// If a system window has focus, then it doesn't make sense
// right now to interact with applications.
if (info.layoutParamsType == TYPE_KEYGUARD_DIALOG
- || (info.layoutParamsPrivateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
+ || (info.layoutParamsType == TYPE_NOTIFICATION_SHADE
+ && isKeyguardShowing())) {
// the "app" is keyguard, so give it the key
return 0;
}
@@ -2205,12 +2206,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
public int getMaxWallpaperLayer() {
- return getWindowLayerFromTypeLw(TYPE_STATUS_BAR);
+ return getWindowLayerFromTypeLw(TYPE_NOTIFICATION_SHADE);
}
@Override
public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs) {
- return attrs.type == TYPE_STATUS_BAR;
+ return attrs.type == TYPE_NOTIFICATION_SHADE;
}
@Override
@@ -2221,6 +2222,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return false;
}
switch (win.getAttrs().type) {
+ case TYPE_NOTIFICATION_SHADE:
case TYPE_STATUS_BAR:
case TYPE_NAVIGATION_BAR:
case TYPE_WALLPAPER:
@@ -2228,7 +2230,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return false;
default:
// Hide only windows below the keyguard host window.
- return getWindowLayerLw(win) < getWindowLayerFromTypeLw(TYPE_STATUS_BAR);
+ return getWindowLayerLw(win) < getWindowLayerFromTypeLw(TYPE_NOTIFICATION_SHADE);
}
}
@@ -3445,7 +3447,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mKeyguardOccluded = false;
mKeyguardDelegate.setOccluded(false, true /* animate */);
if (mKeyguardCandidate != null) {
- mKeyguardCandidate.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD;
if (!mKeyguardDelegate.hasLockscreenWallpaper()) {
mKeyguardCandidate.getAttrs().flags |= FLAG_SHOW_WALLPAPER;
}
@@ -3455,7 +3456,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mKeyguardOccluded = true;
mKeyguardDelegate.setOccluded(true, false /* animate */);
if (mKeyguardCandidate != null) {
- mKeyguardCandidate.getAttrs().privateFlags &= ~PRIVATE_FLAG_KEYGUARD;
mKeyguardCandidate.getAttrs().flags &= ~FLAG_SHOW_WALLPAPER;
}
return true;
@@ -4658,6 +4658,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
+ public boolean isKeyguardShowing() {
+ if (mKeyguardDelegate == null) return false;
+ return mKeyguardDelegate.isShowing();
+ }
+
+ @Override
public boolean isKeyguardShowingAndNotOccluded() {
if (mKeyguardDelegate == null) return false;
return mKeyguardDelegate.isShowing() && !mKeyguardOccluded;
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index b014372fa7cb..c39da5fb0e99 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -39,6 +39,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_PHONE;
import static android.view.WindowManager.LayoutParams.TYPE_POINTER;
import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION;
@@ -812,55 +813,57 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
return 16;
case TYPE_STATUS_BAR:
return 17;
- case TYPE_STATUS_BAR_PANEL:
+ case TYPE_NOTIFICATION_SHADE:
return 18;
- case TYPE_STATUS_BAR_SUB_PANEL:
+ case TYPE_STATUS_BAR_PANEL:
return 19;
- case TYPE_KEYGUARD_DIALOG:
+ case TYPE_STATUS_BAR_SUB_PANEL:
return 20;
+ case TYPE_KEYGUARD_DIALOG:
+ return 21;
case TYPE_VOLUME_OVERLAY:
// the on-screen volume indicator and controller shown when the user
// changes the device volume
- return 21;
+ return 22;
case TYPE_SYSTEM_OVERLAY:
// the on-screen volume indicator and controller shown when the user
// changes the device volume
- return canAddInternalSystemWindow ? 22 : 11;
+ return canAddInternalSystemWindow ? 23 : 11;
case TYPE_NAVIGATION_BAR:
// the navigation bar, if available, shows atop most things
- return 23;
+ return 24;
case TYPE_NAVIGATION_BAR_PANEL:
// some panels (e.g. search) need to show on top of the navigation bar
- return 24;
+ return 25;
case TYPE_SCREENSHOT:
// screenshot selection layer shouldn't go above system error, but it should cover
// navigation bars at the very least.
- return 25;
+ return 26;
case TYPE_SYSTEM_ERROR:
// system-level error dialogs
- return canAddInternalSystemWindow ? 26 : 10;
+ return canAddInternalSystemWindow ? 27 : 10;
case TYPE_MAGNIFICATION_OVERLAY:
// used to highlight the magnified portion of a display
- return 27;
+ return 28;
case TYPE_DISPLAY_OVERLAY:
// used to simulate secondary display devices
- return 28;
+ return 29;
case TYPE_DRAG:
// the drag layer: input for drag-and-drop is associated with this window,
// which sits above all other focusable windows
- return 29;
+ return 30;
case TYPE_ACCESSIBILITY_OVERLAY:
// overlay put by accessibility services to intercept user interaction
- return 30;
+ return 31;
case TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY:
- return 31;
+ return 32;
case TYPE_SECURE_SYSTEM_OVERLAY:
- return 32;
- case TYPE_BOOT_PROGRESS:
return 33;
+ case TYPE_BOOT_PROGRESS:
+ return 34;
case TYPE_POINTER:
// the (mouse) pointer layer
- return 34;
+ return 35;
default:
Slog.e("WindowManager", "Unknown window type: " + type);
return APPLICATION_LAYER;
@@ -1195,6 +1198,11 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
public boolean isKeyguardOccluded();
/**
+ * @return true if in keyguard is on.
+ */
+ boolean isKeyguardShowing();
+
+ /**
* @return true if in keyguard is on and not occluded.
*/
public boolean isKeyguardShowingAndNotOccluded();
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index b596d2a207f0..8bc8ff4fb492 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -4089,11 +4089,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
@Override
boolean applyAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
- boolean isVoiceInteraction) {
+ boolean isVoiceInteraction, @Nullable Runnable animationFinishedCallback) {
if (mUseTransferredAnimation) {
return false;
}
- return super.applyAnimation(lp, transit, enter, isVoiceInteraction);
+ return super.applyAnimation(lp, transit, enter, isVoiceInteraction,
+ animationFinishedCallback);
}
/**
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index f5fba8e85d64..9e32ea085135 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -4946,18 +4946,6 @@ class ActivityStack extends WindowContainer<WindowContainer> implements BoundsAn
}
}
- @Override
- protected void onAnimationFinished() {
- super.onAnimationFinished();
- // TODO(b/142617871): we may need to add animation type parameter on onAnimationFinished to
- // identify if the callback is for launch animation finish and then calling
- // activity#onAnimationFinished.
- final ActivityRecord activity = getTopMostActivity();
- if (activity != null) {
- activity.onAnimationFinished();
- }
- }
-
/**
* Sets the current picture-in-picture aspect ratio.
*/
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 369dde665068..3927d5fa2604 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -352,6 +352,7 @@ public class AppTransitionController {
* Apply animation to the set of window containers.
*
* @param wcs The list of {@link WindowContainer}s to which an app transition animation applies.
+ * @param apps The list of {@link ActivityRecord}s being transitioning.
* @param transit The current transition type.
* @param visible {@code true} if the apps becomes visible, {@code false} if the apps becomes
* invisible.
@@ -359,12 +360,28 @@ public class AppTransitionController {
* @param voiceInteraction {@code true} if one of the apps in this transition belongs to a voice
* interaction session driving task.
*/
- private void applyAnimations(ArraySet<WindowContainer> wcs, @TransitionType int transit,
- boolean visible, LayoutParams animLp, boolean voiceInteraction) {
- final int appsCount = wcs.size();
- for (int i = 0; i < appsCount; i++) {
+ private void applyAnimations(ArraySet<WindowContainer> wcs, ArraySet<ActivityRecord> apps,
+ @TransitionType int transit, boolean visible, LayoutParams animLp,
+ boolean voiceInteraction) {
+ final int wcsCount = wcs.size();
+ for (int i = 0; i < wcsCount; i++) {
final WindowContainer wc = wcs.valueAt(i);
- wc.applyAnimation(animLp, transit, visible, voiceInteraction);
+ // If app transition animation target is promoted to higher level, SurfaceAnimator
+ // triggers WC#onAnimationFinished only on the promoted target. So we need to take care
+ // of triggering AR#onAnimationFinished on each ActivityRecord which is a part of the
+ // app transition.
+ final ArrayList<ActivityRecord> transitioningDecendants = new ArrayList<>();
+ for (int j = 0; j < apps.size(); ++j) {
+ final ActivityRecord app = apps.valueAt(j);
+ if (app.isDescendantOf(wc)) {
+ transitioningDecendants.add(app);
+ }
+ }
+ wc.applyAnimation(animLp, transit, visible, voiceInteraction, () -> {
+ for (int j = 0; j < transitioningDecendants.size(); ++j) {
+ transitioningDecendants.get(j).onAnimationFinished();
+ }
+ });
}
}
@@ -495,8 +512,10 @@ public class AppTransitionController {
openingApps, closingApps, true /* visible */);
final ArraySet<WindowContainer> closingWcs = getAnimationTargets(
openingApps, closingApps, false /* visible */);
- applyAnimations(openingWcs, transit, true /* visible */, animLp, voiceInteraction);
- applyAnimations(closingWcs, transit, false /* visible */, animLp, voiceInteraction);
+ applyAnimations(openingWcs, openingApps, transit, true /* visible */, animLp,
+ voiceInteraction);
+ applyAnimations(closingWcs, closingApps, transit, false /* visible */, animLp,
+ voiceInteraction);
final AccessibilityController accessibilityController =
mDisplayContent.mWmService.mAccessibilityController;
@@ -575,7 +594,8 @@ public class AppTransitionController {
ActivityRecord activity = apps.valueAt(i);
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Now changing app %s", activity);
activity.cancelAnimationOnly();
- activity.applyAnimation(null, transit, true, false);
+ activity.applyAnimation(null, transit, true, false,
+ null /* animationFinishedCallback */);
activity.updateReportedVisibilityLocked();
mService.openSurfaceTransaction();
try {
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index af859d3beab2..16aff9c10c7d 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -21,6 +21,7 @@ import static com.android.server.wm.AlphaAnimationSpecProto.FROM;
import static com.android.server.wm.AlphaAnimationSpecProto.TO;
import static com.android.server.wm.AnimationSpecProto.ALPHA;
+import android.annotation.Nullable;
import android.graphics.Rect;
import android.util.Log;
import android.util.proto.ProtoOutputStream;
@@ -156,7 +157,8 @@ class Dimmer {
@VisibleForTesting
interface SurfaceAnimatorStarter {
void startAnimation(SurfaceAnimator surfaceAnimator, SurfaceControl.Transaction t,
- AnimationAdapter anim, boolean hidden);
+ AnimationAdapter anim, boolean hidden,
+ @Nullable Runnable animationFinishedCallback);
}
Dimmer(WindowContainer host) {
@@ -342,7 +344,8 @@ class Dimmer {
SurfaceControl.Transaction t, float startAlpha, float endAlpha) {
mSurfaceAnimatorStarter.startAnimation(animator, t, new LocalAnimationAdapter(
new AlphaAnimationSpec(startAlpha, endAlpha, getDimDuration(container)),
- mHost.mWmService.mSurfaceAnimationRunner), false /* hidden */);
+ mHost.mWmService.mSurfaceAnimationRunner), false /* hidden */,
+ null /* animationFinishedCallback */);
}
private long getDimDuration(WindowContainer container) {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 908c4f1ddd66..32802eed94f4 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -65,7 +65,6 @@ import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
@@ -75,7 +74,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
-import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
@@ -219,6 +218,7 @@ import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.SurfaceSession;
import android.view.View;
+import android.view.ViewRootImpl;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
@@ -875,7 +875,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
if (w.mHasSurface && isDisplayed) {
final int type = w.mAttrs.type;
if (type == TYPE_SYSTEM_DIALOG || type == TYPE_SYSTEM_ERROR
- || (w.mAttrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
+ || mWmService.mPolicy.isKeyguardShowing()) {
mTmpApplySurfaceChangesTransactionState.syswin = true;
}
if (mTmpApplySurfaceChangesTransactionState.preferredRefreshRate == 0
@@ -3557,7 +3557,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
final SparseBooleanArray drawnWindowTypes = new SparseBooleanArray();
// Presuppose keyguard is drawn because if its window isn't attached, we don't know if it
// wants to be shown or hidden, then it should not delay enabling the screen.
- drawnWindowTypes.put(TYPE_STATUS_BAR, true);
+ drawnWindowTypes.put(TYPE_NOTIFICATION_SHADE, true);
final WindowState visibleNotDrawnWindow = getWindow(w -> {
if (w.mViewVisibility == View.VISIBLE && !w.mObscured && !w.isDrawnLw()) {
@@ -3568,8 +3568,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
if (type == TYPE_BOOT_PROGRESS || type == TYPE_BASE_APPLICATION
|| type == TYPE_WALLPAPER) {
drawnWindowTypes.put(type, true);
- } else if (type == TYPE_STATUS_BAR) {
- drawnWindowTypes.put(TYPE_STATUS_BAR, mWmService.mPolicy.isKeyguardDrawnLw());
+ } else if (type == TYPE_NOTIFICATION_SHADE) {
+ drawnWindowTypes.put(TYPE_NOTIFICATION_SHADE,
+ mWmService.mPolicy.isKeyguardDrawnLw());
}
}
return false;
@@ -3591,7 +3592,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
final boolean haveBootMsg = drawnWindowTypes.get(TYPE_BOOT_PROGRESS);
final boolean haveApp = drawnWindowTypes.get(TYPE_BASE_APPLICATION);
final boolean haveWallpaper = drawnWindowTypes.get(TYPE_WALLPAPER);
- final boolean haveKeyguard = drawnWindowTypes.get(TYPE_STATUS_BAR);
+ final boolean haveKeyguard = drawnWindowTypes.get(TYPE_NOTIFICATION_SHADE);
ProtoLog.i(WM_DEBUG_SCREEN_ON,
"******** booted=%b msg=%b haveBoot=%b haveApp=%b haveWall=%b "
@@ -3689,7 +3690,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
w.mSeq++;
w.mSystemUiVisibility = newValue;
}
- if (newValue != curValue || w.mAttrs.hasSystemUiListeners) {
+ if ((newValue != curValue || w.mAttrs.hasSystemUiListeners)
+ && ViewRootImpl.sNewInsetsMode != ViewRootImpl.NEW_INSETS_MODE_FULL) {
w.mClient.dispatchSystemUiVisibilityChanged(w.mSeq,
visibility, newValue, diff);
}
@@ -5445,7 +5447,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
final boolean stickyHideNav =
(sysUiVisibility & stickyHideNavFlags) == stickyHideNavFlags;
- return !stickyHideNav && type != TYPE_INPUT_METHOD && type != TYPE_STATUS_BAR
+ return !stickyHideNav && type != TYPE_INPUT_METHOD && type != TYPE_NOTIFICATION_SHADE
&& win.getActivityType() != ACTIVITY_TYPE_HOME;
}
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 9c62e9970b48..2c325e56cebe 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -58,11 +58,11 @@ import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_ONLY_DRAW_BOTTOM_BAR_BACKGROUND;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
@@ -77,6 +77,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT;
import static android.view.WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
@@ -289,6 +290,7 @@ public class DisplayPolicy {
private final ArraySet<WindowState> mScreenDecorWindows = new ArraySet<>();
private WindowState mStatusBar = null;
+ private WindowState mNotificationShade = null;
private final int[] mStatusBarHeightForRotation = new int[4];
private WindowState mNavigationBar = null;
@NavigationBarPosition
@@ -368,8 +370,6 @@ public class DisplayPolicy {
private WindowState mTopDockedOpaqueOrDimmingWindowState;
private boolean mTopIsFullscreen;
private boolean mForceStatusBar;
- private boolean mForceStatusBarFromKeyguard;
- private boolean mForceStatusBarTransparent;
private int mNavBarOpacityMode = NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED;
private boolean mForcingShowNavBar;
private int mForcingShowNavBarLayer;
@@ -851,15 +851,13 @@ public class DisplayPolicy {
// letterboxed. Hence always let them extend under the cutout.
attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
break;
- case TYPE_STATUS_BAR:
-
+ case TYPE_NOTIFICATION_SHADE:
// If the Keyguard is in a hidden state (occluded by another window), we force to
// remove the wallpaper and keyguard flag so that any change in-flight after setting
// the keyguard as occluded wouldn't set these flags again.
// See {@link #processKeyguardSetHiddenResultLw}.
if (mService.mPolicy.isKeyguardOccluded()) {
attrs.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
- attrs.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
}
break;
@@ -891,11 +889,6 @@ public class DisplayPolicy {
attrs.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
break;
}
-
- if (attrs.type != TYPE_STATUS_BAR) {
- // The status bar is the only window allowed to exhibit keyguard behavior.
- attrs.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
- }
}
/**
@@ -914,6 +907,7 @@ public class DisplayPolicy {
* Currently enforces that two window types are singletons per display:
* <ul>
* <li>{@link WindowManager.LayoutParams#TYPE_STATUS_BAR}</li>
+ * <li>{@link WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE}</li>
* <li>{@link WindowManager.LayoutParams#TYPE_NAVIGATION_BAR}</li>
* </ul>
*
@@ -940,6 +934,16 @@ public class DisplayPolicy {
}
}
break;
+ case TYPE_NOTIFICATION_SHADE:
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.STATUS_BAR_SERVICE,
+ "DisplayPolicy");
+ if (mNotificationShade != null) {
+ if (mNotificationShade.isAlive()) {
+ return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON;
+ }
+ }
+ break;
case TYPE_NAVIGATION_BAR:
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.STATUS_BAR_SERVICE,
@@ -974,12 +978,15 @@ public class DisplayPolicy {
}
switch (attrs.type) {
- case TYPE_STATUS_BAR:
- mStatusBar = win;
- mStatusBarController.setWindow(win);
+ case TYPE_NOTIFICATION_SHADE:
+ mNotificationShade = win;
if (mDisplayContent.isDefaultDisplay) {
mService.mPolicy.setKeyguardCandidateLw(win);
}
+ break;
+ case TYPE_STATUS_BAR:
+ mStatusBar = win;
+ mStatusBarController.setWindow(win);
final TriConsumer<DisplayFrames, WindowState, Rect> frameProvider =
(displayFrames, windowState, rect) -> {
rect.top = 0;
@@ -1036,14 +1043,16 @@ public class DisplayPolicy {
if (mStatusBar == win) {
mStatusBar = null;
mStatusBarController.setWindow(null);
- if (mDisplayContent.isDefaultDisplay) {
- mService.mPolicy.setKeyguardCandidateLw(null);
- }
mDisplayContent.setInsetProvider(ITYPE_STATUS_BAR, null, null);
} else if (mNavigationBar == win) {
mNavigationBar = null;
mNavigationBarController.setWindow(null);
mDisplayContent.setInsetProvider(ITYPE_NAVIGATION_BAR, null, null);
+ } else if (mNotificationShade == win) {
+ mNotificationShade = null;
+ if (mDisplayContent.isDefaultDisplay) {
+ mService.mPolicy.setKeyguardCandidateLw(null);
+ }
}
if (mLastFocusedWindow == win) {
mLastFocusedWindow = null;
@@ -1060,6 +1069,10 @@ public class DisplayPolicy {
return mStatusBar;
}
+ WindowState getNotificationShade() {
+ return mNotificationShade;
+ }
+
WindowState getNavigationBar() {
return mNavigationBar;
}
@@ -1082,12 +1095,6 @@ public class DisplayPolicy {
if (DEBUG_ANIM) Slog.i(TAG, "selectAnimation in " + win
+ ": transit=" + transit);
if (win == mStatusBar) {
- final boolean isKeyguard = (win.getAttrs().privateFlags & PRIVATE_FLAG_KEYGUARD) != 0;
- final boolean expanded = win.getAttrs().height == MATCH_PARENT
- && win.getAttrs().width == MATCH_PARENT;
- if (isKeyguard || expanded) {
- return ANIMATION_NONE;
- }
if (transit == TRANSIT_EXIT
|| transit == TRANSIT_HIDE) {
return R.anim.dock_top_exit;
@@ -1425,10 +1432,10 @@ public class DisplayPolicy {
|| (behavior & BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) != 0;
boolean navAllowedHidden = immersive || immersiveSticky;
navTranslucent &= !immersiveSticky; // transient trumps translucent
- boolean isKeyguardShowing = isStatusBarKeyguard()
- && !mService.mPolicy.isKeyguardOccluded();
- boolean statusBarForcesShowingNavigation = !isKeyguardShowing && mStatusBar != null
- && (mStatusBar.getAttrs().privateFlags
+ boolean isKeyguardShowing = isKeyguardShowing() && !isKeyguardOccluded();
+ boolean notificationShadeForcesShowingNavigation =
+ !isKeyguardShowing && mNotificationShade != null
+ && (mNotificationShade.getAttrs().privateFlags
& PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION) != 0;
// When the navigation bar isn't visible, we put up a fake input window to catch all
@@ -1455,7 +1462,7 @@ public class DisplayPolicy {
navVisible |= !canHideNavigationBar();
boolean updateSysUiVisibility = layoutNavigationBar(displayFrames, uiMode, navVisible,
- navTranslucent, navAllowedHidden, statusBarForcesShowingNavigation);
+ navTranslucent, navAllowedHidden, notificationShadeForcesShowingNavigation);
if (DEBUG_LAYOUT) Slog.i(TAG, "mDock rect:" + displayFrames.mDock);
updateSysUiVisibility |= layoutStatusBar(displayFrames, sysui, isKeyguardShowing);
if (updateSysUiVisibility) {
@@ -2104,7 +2111,7 @@ public class DisplayPolicy {
df.set(displayFrames.mUnrestricted);
pf.set(displayFrames.mUnrestricted);
} else if ((sysUiFl & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) != 0
- && (type == TYPE_STATUS_BAR
+ && (type == TYPE_NOTIFICATION_SHADE
|| type == TYPE_TOAST
|| type == TYPE_DOCK_DIVIDER
|| type == TYPE_VOICE_INTERACTION_STARTING
@@ -2210,7 +2217,8 @@ public class DisplayPolicy {
// Ensure that windows with a DEFAULT or NEVER display cutout mode are laid out in
// the cutout safe zone.
- if (cutoutMode != LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES) {
+ if (cutoutMode == LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
+ || cutoutMode == LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER) {
final Rect displayCutoutSafeExceptMaybeBars = sTmpDisplayCutoutSafeExceptMaybeBarsRect;
displayCutoutSafeExceptMaybeBars.set(displayFrames.mDisplayCutoutSafe);
if (layoutInScreen && layoutInsetDecor && !requestedFullscreen
@@ -2355,8 +2363,6 @@ public class DisplayPolicy {
mTopDockedOpaqueWindowState = null;
mTopDockedOpaqueOrDimmingWindowState = null;
mForceStatusBar = false;
- mForceStatusBarFromKeyguard = false;
- mForceStatusBarTransparent = false;
mForcingShowNavBar = false;
mForcingShowNavBarLayer = -1;
@@ -2384,14 +2390,6 @@ public class DisplayPolicy {
mForcingShowNavBar = true;
mForcingShowNavBarLayer = win.getSurfaceLayer();
}
- if (attrs.type == TYPE_STATUS_BAR) {
- if ((attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
- mForceStatusBarFromKeyguard = true;
- }
- if ((attrs.privateFlags & PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT) != 0) {
- mForceStatusBarTransparent = true;
- }
- }
boolean appWindow = attrs.type >= FIRST_APPLICATION_WINDOW
&& attrs.type < FIRST_SYSTEM_WINDOW;
@@ -2513,32 +2511,25 @@ public class DisplayPolicy {
if (mStatusBar != null) {
if (DEBUG_LAYOUT) Slog.i(TAG, "force=" + mForceStatusBar
- + " forcefkg=" + mForceStatusBarFromKeyguard
+ " top=" + mTopFullscreenOpaqueWindowState);
- boolean shouldBeTransparent = mForceStatusBarTransparent
- && !mForceStatusBar
- && !mForceStatusBarFromKeyguard;
- if (!shouldBeTransparent) {
- mStatusBarController.setShowTransparent(false /* transparent */);
- } else if (!mStatusBar.isVisibleLw()) {
- mStatusBarController.setShowTransparent(true /* transparent */);
- }
-
- boolean statusBarForcesShowingNavigation =
- (mStatusBar.getAttrs().privateFlags
+ final boolean forceShowStatusBar = (mStatusBar.getAttrs().privateFlags
+ & PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR) != 0;
+ final boolean notificationShadeForcesShowingNavigation =
+ mNotificationShade != null
+ && (mNotificationShade.getAttrs().privateFlags
& PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION) != 0;
+
boolean topAppHidesStatusBar = topAppHidesStatusBar();
- if (mForceStatusBar || mForceStatusBarFromKeyguard || mForceStatusBarTransparent
- || statusBarForcesShowingNavigation) {
+ if (mForceStatusBar || forceShowStatusBar) {
if (DEBUG_LAYOUT) Slog.v(TAG, "Showing status bar: forced");
if (mStatusBarController.setBarShowingLw(true)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT;
}
// Maintain fullscreen layout until incoming animation is complete.
topIsFullscreen = mTopIsFullscreen && mStatusBar.isAnimatingLw();
- // Transient status bar is not allowed if status bar is on lockscreen or status bar
- // is expecting the navigation keys from the user.
- if ((mForceStatusBarFromKeyguard || statusBarForcesShowingNavigation)
+ // Transient status bar is not allowed if notification shade is expecting the
+ // navigation keys from the user.
+ if (notificationShadeForcesShowingNavigation
&& mStatusBarController.isTransientShowing()) {
mStatusBarController.updateVisibilityLw(false /*transientAllowed*/,
mLastSystemUiFlags, mLastSystemUiFlags);
@@ -3102,11 +3093,9 @@ public class DisplayPolicy {
}
}
- private boolean isStatusBarKeyguard() {
- return mStatusBar != null
- && (mStatusBar.getAttrs().privateFlags & PRIVATE_FLAG_KEYGUARD) != 0;
+ boolean isKeyguardShowing() {
+ return mService.mPolicy.isKeyguardShowing();
}
-
private boolean isKeyguardOccluded() {
// TODO (b/113840485): Handle per display keyguard.
return mService.mPolicy.isKeyguardOccluded();
@@ -3139,7 +3128,7 @@ public class DisplayPolicy {
// keys, we let it keep controlling the visibility.
final boolean lastFocusCanReceiveKeys =
(mLastFocusedWindow != null && mLastFocusedWindow.canReceiveKeys());
- winCandidate = isStatusBarKeyguard() ? mStatusBar
+ winCandidate = isKeyguardShowing() ? mNotificationShade
: lastFocusCanReceiveKeys ? mLastFocusedWindow
: mTopFullscreenOpaqueWindowState;
if (winCandidate == null) {
@@ -3147,7 +3136,8 @@ public class DisplayPolicy {
}
}
final WindowState win = winCandidate;
- if ((win.getAttrs().privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 && isKeyguardOccluded()) {
+ if (win.getAttrs().type == TYPE_NOTIFICATION_SHADE && isKeyguardShowing()
+ && isKeyguardOccluded()) {
// We are updating at a point where the keyguard has gotten
// focus, but we were last in a state where the top window is
// hiding it. This is probably because the keyguard as been
@@ -3281,8 +3271,8 @@ public class DisplayPolicy {
private int updateLightStatusBarAppearanceLw(@Appearance int appearance, WindowState opaque,
WindowState opaqueOrDimming) {
- final boolean onKeyguard = isStatusBarKeyguard() && !isKeyguardOccluded();
- final WindowState statusColorWin = onKeyguard ? mStatusBar : opaqueOrDimming;
+ final boolean onKeyguard = isKeyguardShowing() && !isKeyguardOccluded();
+ final WindowState statusColorWin = onKeyguard ? mNotificationShade : opaqueOrDimming;
if (statusColorWin != null && (statusColorWin == opaque || onKeyguard)) {
// If the top fullscreen-or-dimming window is also the top fullscreen, respect
// its light flag.
@@ -3370,11 +3360,11 @@ public class DisplayPolicy {
// visibility changes.
mForceShowSystemBars = dockedStackVisible || win.inFreeformWindowingMode() || resizing
|| mForceShowSystemBarsFromExternal;
- final boolean forceOpaqueStatusBar = mForceShowSystemBars && !mForceStatusBarFromKeyguard;
+ final boolean forceOpaqueStatusBar = mForceShowSystemBars && !isKeyguardShowing();
// apply translucent bar vis flags
- WindowState fullscreenTransWin = isStatusBarKeyguard() && !isKeyguardOccluded()
- ? mStatusBar
+ WindowState fullscreenTransWin = isKeyguardShowing() && !isKeyguardOccluded()
+ ? mNotificationShade
: mTopFullscreenOpaqueWindowState;
vis = mStatusBarController.applyTranslucentFlagLw(fullscreenTransWin, vis, oldVis);
vis = mNavigationBarController.applyTranslucentFlagLw(fullscreenTransWin, vis, oldVis);
@@ -3394,8 +3384,8 @@ public class DisplayPolicy {
// prevent status bar interaction from clearing certain flags
int type = win.getAttrs().type;
- boolean statusBarHasFocus = type == TYPE_STATUS_BAR;
- if (statusBarHasFocus && !isStatusBarKeyguard()) {
+ boolean notificationShadeHasFocus = type == TYPE_NOTIFICATION_SHADE;
+ if (notificationShadeHasFocus && !isKeyguardShowing()) {
int flags = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE
@@ -3430,7 +3420,7 @@ public class DisplayPolicy {
(vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0;
final boolean transientStatusBarAllowed = mStatusBar != null
- && (statusBarHasFocus || (!mForceShowSystemBars
+ && (notificationShadeHasFocus || (!mForceShowSystemBars
&& (hideStatusBarWM || (hideStatusBarSysui && immersiveSticky))));
final boolean transientNavBarAllowed = mNavigationBar != null
@@ -3441,7 +3431,7 @@ public class DisplayPolicy {
&& now - mPendingPanicGestureUptime <= PANIC_GESTURE_EXPIRATION;
final DisplayPolicy defaultDisplayPolicy =
mService.getDefaultDisplayContentLocked().getDisplayPolicy();
- if (pendingPanic && hideNavBarSysui && !isStatusBarKeyguard()
+ if (pendingPanic && hideNavBarSysui && !isKeyguardShowing()
// TODO (b/111955725): Show keyguard presentation on all external displays
&& defaultDisplayPolicy.isKeyguardDrawComplete()) {
// The user performed the panic gesture recently, we're about to hide the bars,
@@ -3703,8 +3693,11 @@ public class DisplayPolicy {
pw.print(" mDreamingSleepToken="); pw.println(mDreamingSleepToken);
if (mStatusBar != null) {
pw.print(prefix); pw.print("mStatusBar="); pw.print(mStatusBar);
- pw.print(" isStatusBarKeyguard="); pw.println(isStatusBarKeyguard());
}
+ if (mNotificationShade != null) {
+ pw.print(prefix); pw.print("mExpandedPanel="); pw.print(mNotificationShade);
+ }
+ pw.print(" isKeyguardShowing="); pw.println(isKeyguardShowing());
if (mNavigationBar != null) {
pw.print(prefix); pw.print("mNavigationBar="); pw.println(mNavigationBar);
pw.print(prefix); pw.print("mNavBarOpacityMode="); pw.println(mNavBarOpacityMode);
@@ -3733,7 +3726,6 @@ public class DisplayPolicy {
}
pw.print(prefix); pw.print("mTopIsFullscreen="); pw.println(mTopIsFullscreen);
pw.print(prefix); pw.print("mForceStatusBar="); pw.print(mForceStatusBar);
- pw.print(" mForceStatusBarFromKeyguard="); pw.println(mForceStatusBarFromKeyguard);
pw.print(prefix); pw.print("mForceShowSystemBarsFromExternal=");
pw.print(mForceShowSystemBarsFromExternal);
pw.print(" mAllowLockscreenWhenOn="); pw.println(mAllowLockscreenWhenOn);
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 091f66c0b19a..4c5914bfd8c2 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -23,7 +23,6 @@ import static android.view.WindowManager.INPUT_CONSUMER_RECENTS_ANIMATION;
import static android.view.WindowManager.INPUT_CONSUMER_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
@@ -527,7 +526,7 @@ final class InputMonitor {
mDisableWallpaperTouchEvents = true;
}
final boolean hasWallpaper = wallpaperController.isWallpaperTarget(w)
- && (privateFlags & PRIVATE_FLAG_KEYGUARD) == 0
+ && !mService.mPolicy.isKeyguardShowing()
&& !mDisableWallpaperTouchEvents;
// If there's a drag in progress and 'child' is a potential drop target,
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index a0089639bce6..fa764e3dfc18 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -22,8 +22,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
import android.annotation.Nullable;
@@ -188,7 +187,7 @@ class InsetsPolicy {
if (mShowingTransientTypes.indexOf(ITYPE_STATUS_BAR) != -1) {
return mTransientControlTarget;
}
- if (areSystemBarsForciblyVisible() || isStatusBarForciblyVisible()) {
+ if (areSystemBarsForciblyVisible() || isKeyguardOrStatusBarForciblyVisible()) {
return null;
}
return focusedWin;
@@ -204,29 +203,27 @@ class InsetsPolicy {
return focusedWin;
}
- private boolean isStatusBarForciblyVisible() {
- final WindowState statusBar = mPolicy.getStatusBar();
- if (statusBar == null) {
- return false;
- }
- final int privateFlags = statusBar.mAttrs.privateFlags;
-
- // TODO(b/118118435): Pretend to the app that it's still able to control it?
- if ((privateFlags & PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT) != 0) {
+ private boolean isKeyguardOrStatusBarForciblyVisible() {
+ if (mPolicy.isKeyguardShowing()) {
return true;
}
- if ((privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
- return true;
+ final WindowState statusBar = mPolicy.getStatusBar();
+ if (statusBar != null) {
+ // TODO(b/118118435): Pretend to the app that it's still able to control it?
+ if ((statusBar.mAttrs.privateFlags & PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR) != 0) {
+ return true;
+ }
}
return false;
}
private boolean isNavBarForciblyVisible() {
- final WindowState statusBar = mPolicy.getStatusBar();
- if (statusBar == null) {
+ final WindowState notificationShade = mPolicy.getNotificationShade();
+ if (notificationShade == null) {
return false;
}
- if ((statusBar.mAttrs.privateFlags & PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION) != 0) {
+ if ((notificationShade.mAttrs.privateFlags
+ & PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION) != 0) {
return true;
}
return false;
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 2f726e9999eb..8b1005e2e847 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -35,7 +35,6 @@ import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
@@ -1147,7 +1146,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
// While a dream or keyguard is showing, obscure ordinary application content on
// secondary displays (by forcibly enabling mirroring unless there is other content
// we want to show) but still allow opaque keyguard dialogs to be shown.
- if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
+ if (type == TYPE_DREAM || mWmService.mPolicy.isKeyguardShowing()) {
mObscureApplicationContentOnSecondaryDisplays = true;
}
displayHasContent = true;
diff --git a/services/core/java/com/android/server/wm/StatusBarController.java b/services/core/java/com/android/server/wm/StatusBarController.java
index f4260d32a77d..cac992a67541 100644
--- a/services/core/java/com/android/server/wm/StatusBarController.java
+++ b/services/core/java/com/android/server/wm/StatusBarController.java
@@ -17,7 +17,6 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
-import static android.view.WindowManager.LayoutParams.MATCH_PARENT;
import static com.android.server.wm.WindowManagerInternal.AppTransitionListener;
@@ -102,11 +101,6 @@ public class StatusBarController extends BarController {
}
}
- @Override
- protected boolean skipAnimation() {
- return mWin.getAttrs().height == MATCH_PARENT;
- }
-
AppTransitionListener getAppTransitionListener() {
return mAppTransitionListener;
}
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index 5286a6e32958..cb1676f3a7b1 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -55,7 +55,9 @@ class SurfaceAnimator {
private final OnAnimationFinishedCallback mInnerAnimationFinishedCallback;
@VisibleForTesting
@Nullable
- final Runnable mAnimationFinishedCallback;
+ final Runnable mStaticAnimationFinishedCallback;
+ @Nullable
+ private Runnable mAnimationFinishedCallback;
private boolean mAnimationStartDelayed;
/**
@@ -66,7 +68,7 @@ class SurfaceAnimator {
WindowManagerService service) {
mAnimatable = animatable;
mService = service;
- mAnimationFinishedCallback = animationFinishedCallback;
+ mStaticAnimationFinishedCallback = animationFinishedCallback;
mInnerAnimationFinishedCallback = getFinishedCallback(animationFinishedCallback);
}
@@ -89,10 +91,14 @@ class SurfaceAnimator {
if (anim != mAnimation) {
return;
}
+ final Runnable animationFinishCallback = mAnimationFinishedCallback;
reset(mAnimatable.getPendingTransaction(), true /* destroyLeash */);
if (animationFinishedCallback != null) {
animationFinishedCallback.run();
}
+ if (animationFinishCallback != null) {
+ animationFinishCallback.run();
+ }
};
if (!mAnimatable.shouldDeferAnimationFinish(resetAndInvokeFinish)) {
resetAndInvokeFinish.run();
@@ -111,10 +117,13 @@ class SurfaceAnimator {
* @param hidden Whether the container holding the child surfaces is currently visible or not.
* This is important as it will start with the leash hidden or visible before
* handing it to the component that is responsible to run the animation.
+ * @param animationFinishedCallback The callback being triggered when the animation finishes.
*/
- void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden) {
+ void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden,
+ @Nullable Runnable animationFinishedCallback) {
cancelAnimation(t, true /* restarting */, true /* forwardCancel */);
mAnimation = anim;
+ mAnimationFinishedCallback = animationFinishedCallback;
final SurfaceControl surface = mAnimatable.getSurfaceControl();
if (surface == null) {
Slog.w(TAG, "Unable to start animation, surface is null or no children.");
@@ -131,6 +140,10 @@ class SurfaceAnimator {
mAnimation.startAnimation(mLeash, t, mInnerAnimationFinishedCallback);
}
+ void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden) {
+ startAnimation(t, anim, hidden, null /* animationFinishedCallback */);
+ }
+
/**
* Begins with delaying all animations to start. Any subsequent call to {@link #startAnimation}
* will not start the animation until {@link #endDelayingAnimationStart} is called. When an
@@ -232,6 +245,7 @@ class SurfaceAnimator {
cancelAnimation(t, true /* restarting */, true /* forwardCancel */);
mLeash = from.mLeash;
mAnimation = from.mAnimation;
+ mAnimationFinishedCallback = from.mAnimationFinishedCallback;
// Cancel source animation, but don't let animation runner cancel the animation.
from.cancelAnimation(t, false /* restarting */, false /* forwardCancel */);
@@ -258,13 +272,19 @@ class SurfaceAnimator {
if (DEBUG_ANIM) Slog.i(TAG, "Cancelling animation restarting=" + restarting);
final SurfaceControl leash = mLeash;
final AnimationAdapter animation = mAnimation;
+ final Runnable animationFinishedCallback = mAnimationFinishedCallback;
reset(t, false);
if (animation != null) {
if (!mAnimationStartDelayed && forwardCancel) {
animation.onAnimationCancelled(leash);
}
- if (!restarting && mAnimationFinishedCallback != null) {
- mAnimationFinishedCallback.run();
+ if (!restarting) {
+ if (mStaticAnimationFinishedCallback != null) {
+ mStaticAnimationFinishedCallback.run();
+ }
+ if (animationFinishedCallback != null) {
+ animationFinishedCallback.run();
+ }
}
}
@@ -304,6 +324,7 @@ class SurfaceAnimator {
}
mLeash = null;
mAnimation = null;
+ mAnimationFinishedCallback = null;
if (reparent) {
// Make sure to inform the animatable after the surface was reparented (or reparent
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 5cb7091bbed0..b7201b4dbde5 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -121,7 +121,6 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.os.Debug;
import android.os.IBinder;
-import android.os.Parcel;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
@@ -2616,18 +2615,6 @@ class Task extends WindowContainer<WindowContainer> {
}
@Override
- protected void onAnimationFinished() {
- super.onAnimationFinished();
- // TODO(b/142617871): we may need to add animation type parameter on onAnimationFinished to
- // identify if the callback is for launch animation finish and then calling
- // activity#onAnimationFinished.
- final ActivityRecord activity = getTopMostActivity();
- if (activity != null) {
- activity.onAnimationFinished();
- }
- }
-
- @Override
SurfaceControl.Builder makeSurface() {
return super.makeSurface().setMetadata(METADATA_TASK_ID, mTaskId);
}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 3b2d51985a39..a43f595e4a9f 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -562,6 +562,13 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
return false;
}
+ /** @return true if this window container is a descendant of the input container. */
+ boolean isDescendantOf(WindowContainer ancestor) {
+ final WindowContainer parent = getParent();
+ if (parent == ancestor) return true;
+ return (parent != null) && parent.isDescendantOf(ancestor);
+ }
+
/**
* Move a child from it's current place in siblings list to the specified position,
* with an option to move all its parents to top.
@@ -1832,13 +1839,19 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
* @param anim The animation to run.
* @param hidden Whether our container is currently hidden. TODO This should use isVisible at
* some point but the meaning is too weird to work for all containers.
+ * @param animationFinishedCallback The callback being triggered when the animation finishes.
*/
- void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden) {
+ void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden,
+ @Nullable Runnable animationFinishedCallback) {
if (DEBUG_ANIM) Slog.v(TAG, "Starting animation on " + this + ": " + anim);
// TODO: This should use isVisible() but because isVisible has a really weird meaning at
// the moment this doesn't work for all animatable window containers.
- mSurfaceAnimator.startAnimation(t, anim, hidden);
+ mSurfaceAnimator.startAnimation(t, anim, hidden, animationFinishedCallback);
+ }
+
+ void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden) {
+ startAnimation(t, anim, hidden, null /* animationFinishedCallback */);
}
void transferAnimation(WindowContainer from) {
@@ -1891,7 +1904,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
* @see #getAnimationAdapter
*/
boolean applyAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
- boolean isVoiceInteraction) {
+ boolean isVoiceInteraction, @Nullable Runnable animationFinishedCallback) {
if (mWmService.mDisableTransitionAnimation) {
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
"applyAnimation: transition animation is disabled or skipped. "
@@ -1911,7 +1924,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
AnimationAdapter adapter = adapters.first;
AnimationAdapter thumbnailAdapter = adapters.second;
if (adapter != null) {
- startAnimation(getPendingTransaction(), adapter, !isVisible());
+ startAnimation(getPendingTransaction(), adapter, !isVisible(),
+ animationFinishedCallback);
if (adapter.getShowWallpaper()) {
getDisplayContent().pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
}
diff --git a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
index 8e070f19cc30..8948f6fc2ab1 100644
--- a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
+++ b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
@@ -85,7 +85,8 @@ class WindowContainerThumbnail implements Animatable {
// We can't use a delegating constructor since we need to
// reference this::onAnimationFinished
mSurfaceAnimator =
- new SurfaceAnimator(this, this::onAnimationFinished, container.mWmService);
+ new SurfaceAnimator(this, null /* animationFinishedCallback */,
+ container.mWmService);
}
mWidth = thumbnailHeader.getWidth();
mHeight = thumbnailHeader.getHeight();
@@ -139,9 +140,6 @@ class WindowContainerThumbnail implements Animatable {
mSurfaceAnimator.startAnimation(t, anim, hidden);
}
- private void onAnimationFinished() {
- }
-
void setShowing(Transaction pendingTransaction, boolean show) {
// TODO: Not needed anymore once thumbnail is attached to the app.
if (show) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index e3b593e90fa5..77d755d6f36d 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -63,6 +63,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION;
import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
@@ -1283,6 +1284,7 @@ public class WindowManagerService extends IWindowManager.Stub
static boolean excludeWindowTypeFromTapOutTask(int windowType) {
switch (windowType) {
case TYPE_STATUS_BAR:
+ case TYPE_NOTIFICATION_SHADE:
case TYPE_NAVIGATION_BAR:
case TYPE_INPUT_METHOD_DIALOG:
return true;
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index a429741607e4..2965764e8961 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -73,6 +73,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_PHONE;
import static android.view.WindowManager.LayoutParams.TYPE_POINTER;
import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION;
@@ -3210,6 +3211,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
case TYPE_PRIORITY_PHONE:
case TYPE_SEARCH_BAR:
case TYPE_STATUS_BAR:
+ case TYPE_NOTIFICATION_SHADE:
case TYPE_STATUS_BAR_PANEL:
case TYPE_STATUS_BAR_SUB_PANEL:
case TYPE_SYSTEM_DIALOG:
@@ -5011,7 +5013,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
private void startAnimation(Transaction t, AnimationAdapter adapter) {
- startAnimation(t, adapter, mWinAnimator.mLastHidden);
+ startAnimation(t, adapter, mWinAnimator.mLastHidden, null /* animationFinishedCallback */);
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 486616df6f11..6189fbdbfb78 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -272,7 +272,8 @@ class WindowStateAnimator {
mWin.checkPolicyVisibilityChange();
final DisplayContent displayContent = mWin.getDisplayContent();
- if (mAttrType == LayoutParams.TYPE_STATUS_BAR && mWin.isVisibleByPolicy()) {
+ if ((mAttrType == LayoutParams.TYPE_STATUS_BAR
+ || mAttrType == LayoutParams.TYPE_NOTIFICATION_SHADE) && mWin.isVisibleByPolicy()) {
// Upon completion of a not-visible to visible status bar animation a relayout is
// required.
displayContent.setLayoutNeeded();
diff --git a/services/java/com/android/server/SystemConfigService.java b/services/java/com/android/server/SystemConfigService.java
new file mode 100644
index 000000000000..e8ab10124ef8
--- /dev/null
+++ b/services/java/com/android/server/SystemConfigService.java
@@ -0,0 +1,62 @@
+/*
+ * 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.server;
+
+import android.Manifest;
+import android.content.Context;
+import android.os.ISystemConfig;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Service class that runs inside the system_server process to handle queries to
+ * {@link com.android.server.SystemConfig}.
+ * @hide
+ */
+public class SystemConfigService extends SystemService {
+ private final Context mContext;
+
+ private final ISystemConfig.Stub mInterface = new ISystemConfig.Stub() {
+ @Override
+ public List<String> getDisabledUntilUsedPreinstalledCarrierApps() {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_CARRIER_APP_INFO,
+ "getDisabledUntilUsedPreInstalledCarrierApps requires READ_CARRIER_APP_INFO");
+ return new ArrayList<>(
+ SystemConfig.getInstance().getDisabledUntilUsedPreinstalledCarrierApps());
+ }
+
+ @Override
+ public Map getDisabledUntilUsedPreinstalledCarrierAssociatedApps() {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_CARRIER_APP_INFO,
+ "getDisabledUntilUsedPreInstalledCarrierAssociatedApps requires"
+ + " READ_CARRIER_APP_INFO");
+ return SystemConfig.getInstance()
+ .getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
+ }
+ };
+
+ public SystemConfigService(Context context) {
+ super(context);
+ mContext = context;
+ }
+
+ @Override
+ public void onStart() {
+ publishBinderService(Context.SYSTEM_CONFIG_SERVICE, mInterface);
+ }
+}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 92bdba03fa09..66d140767773 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -902,6 +902,11 @@ public final class SystemServer {
private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
t.traceBegin("startCoreServices");
+ // Service for system config
+ t.traceBegin("StartSystemConfigService");
+ mSystemServiceManager.startService(SystemConfigService.class);
+ t.traceEnd();
+
t.traceBegin("StartBatteryService");
// Tracks the battery level. Requires LightService.
mSystemServiceManager.startService(BatteryService.class);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java
index 193f540246e6..87b56586ee65 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java
@@ -80,7 +80,7 @@ public class AccessibilityInputFilterTest {
// The expected order of EventStreamTransformations.
private final Class[] mExpectedEventHandlerTypes =
{KeyboardInterceptor.class, MotionEventInjector.class,
- MagnificationGestureHandler.class, TouchExplorer.class,
+ FullScreenMagnificationGestureHandler.class, TouchExplorer.class,
AutoclickController.class, AccessibilityInputFilter.class};
private MagnificationController mMockMagnificationController;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/FullScreenMagnificationGestureHandlerTest.java
index de7d77d4b963..2007d4fff8c1 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/FullScreenMagnificationGestureHandlerTest.java
@@ -59,7 +59,7 @@ import org.junit.runner.RunWith;
import java.util.function.IntConsumer;
/**
- * Tests the state transitions of {@link MagnificationGestureHandler}
+ * Tests the state transitions of {@link FullScreenMagnificationGestureHandler}
*
* Here's a dot graph describing the transitions being tested:
* {@code
@@ -87,7 +87,7 @@ import java.util.function.IntConsumer;
* }
*/
@RunWith(AndroidJUnit4.class)
-public class MagnificationGestureHandlerTest {
+public class FullScreenMagnificationGestureHandlerTest {
public static final int STATE_IDLE = 1;
public static final int STATE_ZOOMED = 2;
@@ -113,7 +113,7 @@ public class MagnificationGestureHandlerTest {
MagnificationController mMagnificationController;
private OffsettableClock mClock;
- private MagnificationGestureHandler mMgh;
+ private FullScreenMagnificationGestureHandler mMgh;
private TestHandler mHandler;
private long mLastDownTime = Integer.MIN_VALUE;
@@ -154,16 +154,17 @@ public class MagnificationGestureHandlerTest {
}
@NonNull
- private MagnificationGestureHandler newInstance(boolean detectTripleTap,
+ private FullScreenMagnificationGestureHandler newInstance(boolean detectTripleTap,
boolean detectShortcutTrigger) {
- MagnificationGestureHandler h = new MagnificationGestureHandler(
+ FullScreenMagnificationGestureHandler h = new FullScreenMagnificationGestureHandler(
mContext, mMagnificationController,
detectTripleTap, detectShortcutTrigger, DISPLAY_0);
mHandler = new TestHandler(h.mDetectingState, mClock) {
@Override
protected String messageToString(Message m) {
return DebugUtils.valueToString(
- MagnificationGestureHandler.DetectingState.class, "MESSAGE_", m.what);
+ FullScreenMagnificationGestureHandler.DetectingState.class, "MESSAGE_",
+ m.what);
}
};
h.mDetectingState.mHandler = mHandler;
@@ -541,7 +542,8 @@ public class MagnificationGestureHandlerTest {
}
private static String stateToString(int state) {
- return DebugUtils.valueToString(MagnificationGestureHandlerTest.class, "STATE_", state);
+ return DebugUtils.valueToString(FullScreenMagnificationGestureHandlerTest.class, "STATE_",
+ state);
}
private void tap() {
@@ -591,7 +593,7 @@ public class MagnificationGestureHandlerTest {
private MotionEvent moveEvent(float x, float y) {
return fromTouchscreen(
- MotionEvent.obtain(mLastDownTime, mClock.now(), ACTION_MOVE, x, y, 0));
+ MotionEvent.obtain(mLastDownTime, mClock.now(), ACTION_MOVE, x, y, 0));
}
private MotionEvent downEvent() {
@@ -638,7 +640,7 @@ public class MagnificationGestureHandlerTest {
/* action */ action,
/* pointerCount */ 2,
/* pointerProperties */ new MotionEvent.PointerProperties[] {
- defPointerProperties, pointerProperties },
+ defPointerProperties, pointerProperties},
/* pointerCoords */ new MotionEvent.PointerCoords[] { defPointerCoords, pointerCoords },
/* metaState */ 0,
/* buttonState */ 0,
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
index a3d15dd7de3b..1b5c56a4b4c9 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
@@ -230,6 +230,18 @@ public abstract class BaseLockSettingsServiceTests {
}
}).when(sm).addUserKeyAuth(anyInt(), anyInt(), any(), any());
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ Object[] args = invocation.getArguments();
+ mStorageManager.clearUserKeyAuth((int) args[0] /* userId */,
+ (int) args[1] /* serialNumber */,
+ (byte[]) args[2] /* token */,
+ (byte[]) args[3] /* secret */);
+ return null;
+ }
+ }).when(sm).clearUserKeyAuth(anyInt(), anyInt(), any(), any());
+
doAnswer(
new Answer<Void>() {
@Override
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java b/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
index 1ae1fa65ddf2..102bac111ada 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
@@ -36,6 +36,15 @@ public class FakeStorageManager {
getUserAuth(userId).add(new Pair<>(token, secret));
}
+ public void clearUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret) {
+ ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
+ if (token == null && secret == null) {
+ return;
+ }
+ auths.remove(new Pair<>(token, secret));
+ auths.add(new Pair<>(null, null));
+ }
+
public void fixateNewestUserKeyAuth(int userId) {
ArrayList<Pair<byte[], byte[]>> auths = mAuth.get(userId);
Pair<byte[], byte[]> latest = auths.get(auths.size() - 1);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
index e8f7849ef96a..7344fa42016c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
@@ -27,8 +27,11 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.when;
+import android.annotation.Nullable;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.view.SurfaceControl;
@@ -111,8 +114,12 @@ public class DimmerTests extends WindowTestsBase {
private static class SurfaceAnimatorStarterImpl implements Dimmer.SurfaceAnimatorStarter {
@Override
public void startAnimation(SurfaceAnimator surfaceAnimator, SurfaceControl.Transaction t,
- AnimationAdapter anim, boolean hidden) {
- surfaceAnimator.mAnimationFinishedCallback.run();
+ AnimationAdapter anim, boolean hidden,
+ @Nullable Runnable animationFinishedCallback) {
+ surfaceAnimator.mStaticAnimationFinishedCallback.run();
+ if (animationFinishedCallback != null) {
+ animationFinishedCallback.run();
+ }
}
}
@@ -216,7 +223,8 @@ public class DimmerTests extends WindowTestsBase {
mDimmer.updateDims(mTransaction, new Rect());
verify(mSurfaceAnimatorStarter).startAnimation(any(SurfaceAnimator.class), any(
- SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean());
+ SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean(),
+ isNull());
verify(mHost.getPendingTransaction()).remove(dimLayer);
}
@@ -273,7 +281,8 @@ public class DimmerTests extends WindowTestsBase {
mDimmer.resetDimStates();
mDimmer.updateDims(mTransaction, new Rect());
verify(mSurfaceAnimatorStarter, never()).startAnimation(any(SurfaceAnimator.class), any(
- SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean());
+ SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean(),
+ isNull());
verify(mTransaction).remove(dimLayer);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index f2ba97c269d5..1637370df0f7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -39,6 +39,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
@@ -139,6 +140,7 @@ public class DisplayContentTests extends WindowTestsBase {
mChildAppWindowAbove,
mDockedDividerWindow,
mStatusBarWindow,
+ mNotificationShadeWindow,
mNavBarWindow,
mImeWindow,
mImeDialogWindow));
@@ -161,6 +163,7 @@ public class DisplayContentTests extends WindowTestsBase {
mImeDialogWindow,
mDockedDividerWindow,
mStatusBarWindow,
+ mNotificationShadeWindow,
mNavBarWindow));
}
@@ -177,6 +180,7 @@ public class DisplayContentTests extends WindowTestsBase {
mImeDialogWindow,
mDockedDividerWindow,
mStatusBarWindow,
+ mNotificationShadeWindow,
mNavBarWindow));
}
@@ -193,6 +197,24 @@ public class DisplayContentTests extends WindowTestsBase {
mStatusBarWindow,
mImeWindow,
mImeDialogWindow,
+ mNotificationShadeWindow,
+ mNavBarWindow));
+ }
+
+ @Test
+ public void testForAllWindows_WithNotificationShadeImeTarget() throws Exception {
+ mDisplayContent.mInputMethodTarget = mNotificationShadeWindow;
+
+ assertForAllWindowsOrder(Arrays.asList(
+ mWallpaperWindow,
+ mChildAppWindowBelow,
+ mAppWindow,
+ mChildAppWindowAbove,
+ mDockedDividerWindow,
+ mStatusBarWindow,
+ mNotificationShadeWindow,
+ mImeWindow,
+ mImeDialogWindow,
mNavBarWindow));
}
@@ -211,6 +233,7 @@ public class DisplayContentTests extends WindowTestsBase {
mDockedDividerWindow,
voiceInteractionWindow,
mStatusBarWindow,
+ mNotificationShadeWindow,
mNavBarWindow,
mImeWindow,
mImeDialogWindow));
@@ -585,7 +608,7 @@ public class DisplayContentTests extends WindowTestsBase {
final WindowState window = createWindow(null /* parent */, TYPE_BASE_APPLICATION, dc, "w");
window.mActivityRecord.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
- final WindowState keyguard = createWindow(null, TYPE_STATUS_BAR, dc, "keyguard");
+ final WindowState keyguard = createWindow(null, TYPE_NOTIFICATION_SHADE , dc, "keyguard");
keyguard.mHasSurface = true;
keyguard.mAttrs.screenOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
index df34c7c00b51..c3bead7162e6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
@@ -22,13 +22,16 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMAR
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -118,11 +121,11 @@ public class InsetsPolicyTest extends WindowTestsBase {
@Test
public void testControlsForDispatch_keyguard() {
- addWindow(TYPE_STATUS_BAR, "statusBar").mAttrs.privateFlags |= PRIVATE_FLAG_KEYGUARD;
+ addWindow(TYPE_NOTIFICATION_SHADE, "notificationShade");
addWindow(TYPE_NAVIGATION_BAR, "navBar");
+ mockKeyguardShowing();
final InsetsSourceControl[] controls = addAppWindowAndGetControlsForDispatch();
-
// The app must not control the top bar.
assertNotNull(controls);
assertEquals(1, controls.length);
@@ -130,9 +133,9 @@ public class InsetsPolicyTest extends WindowTestsBase {
// TODO: adjust this test if we pretend to the app that it's still able to control it.
@Test
- public void testControlsForDispatch_forceStatusBarVisibleTransparent() {
- addWindow(TYPE_STATUS_BAR, "statusBar").mAttrs.privateFlags |=
- PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
+ public void testControlsForDispatch_forceStatusBarVisible() {
+ addWindow(TYPE_STATUS_BAR, "topBar").mAttrs.privateFlags |=
+ PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
addWindow(TYPE_NAVIGATION_BAR, "navBar");
final InsetsSourceControl[] controls = addAppWindowAndGetControlsForDispatch();
@@ -144,7 +147,7 @@ public class InsetsPolicyTest extends WindowTestsBase {
@Test
public void testControlsForDispatch_statusBarForceShowNavigation() {
- addWindow(TYPE_STATUS_BAR, "statusBar").mAttrs.privateFlags |=
+ addWindow(TYPE_NOTIFICATION_SHADE, "notificationShade").mAttrs.privateFlags |=
PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
addWindow(TYPE_NAVIGATION_BAR, "navBar");
@@ -257,4 +260,10 @@ public class InsetsPolicyTest extends WindowTestsBase {
mDisplayContent.getInsetsPolicy().updateBarControlTarget(win);
return mDisplayContent.getInsetsStateController().getControlsForDispatch(win);
}
+
+ private void mockKeyguardShowing() {
+ final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
+ spyOn(displayPolicy);
+ doReturn(true).when(displayPolicy).isKeyguardShowing();
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 894890a2d0f1..277bc41cf34e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -18,6 +18,7 @@ package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
@@ -85,9 +86,12 @@ public class RootWindowContainerTests extends WindowTestsBase {
public void testIsAnyNonToastWindowVisibleForUid_aFewNonToastButNoneVisible() {
final WindowState statusBar =
createWindow(null, TYPE_STATUS_BAR, "statusBar", FAKE_CALLING_UID);
+ final WindowState notificationShade = createWindow(null, TYPE_NOTIFICATION_SHADE,
+ "notificationShade", FAKE_CALLING_UID);
final WindowState app = createWindow(null, TYPE_APPLICATION, "app", FAKE_CALLING_UID);
assertFalse(statusBar.isVisibleNow());
+ assertFalse(notificationShade.isVisibleNow());
assertFalse(app.isVisibleNow());
assertFalse(mWm.mRoot.isAnyNonToastWindowVisibleForUid(FAKE_CALLING_UID));
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 08ee0eb30d6b..9f45044c6a60 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -17,7 +17,7 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
-import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
@@ -91,7 +91,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy {
@Override
public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs) {
- return attrs.type == TYPE_STATUS_BAR;
+ return attrs.type == TYPE_NOTIFICATION_SHADE;
}
@Override
@@ -263,6 +263,11 @@ class TestWindowManagerPolicy implements WindowManagerPolicy {
}
@Override
+ public boolean isKeyguardShowing() {
+ return mKeyguardShowingAndNotOccluded;
+ }
+
+ @Override
public boolean isKeyguardShowingAndNotOccluded() {
return mKeyguardShowingAndNotOccluded;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index d3cd3cbb42ca..05d048d360ea 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -829,12 +829,15 @@ public class WindowContainerTests extends WindowTestsBase {
wc.getDisplayContent().mAppTransition.overridePendingAppTransitionRemote(adapter);
spyOn(wc);
doReturn(true).when(wc).okToAnimate();
+ final Runnable onAnimationFinishedCallback = mock(Runnable.class);
// Make sure animating state is as expected after applied animation.
- assertTrue(wc.applyAnimation(null, TRANSIT_TASK_OPEN, true, false));
+ assertTrue(wc.applyAnimation(null, TRANSIT_TASK_OPEN, true, false,
+ onAnimationFinishedCallback));
assertEquals(wc.getTopMostActivity(), act);
assertTrue(wc.isAnimating());
assertTrue(act.isAnimating(PARENTS));
+ verify(onAnimationFinishedCallback, times(0)).run();
// Make sure animation finish callback will be received and reset animating state after
// animation finish.
@@ -843,6 +846,7 @@ public class WindowContainerTests extends WindowTestsBase {
verify(wc).onAnimationFinished();
assertFalse(wc.isAnimating());
assertFalse(act.isAnimating(PARENTS));
+ verify(onAnimationFinishedCallback, times(1)).run();
}
/* Used so we can gain access to some protected members of the {@link WindowContainer} class */
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index 7e248f854dcf..6d0b54fd2ccd 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -545,7 +545,7 @@ public class WindowStateTests extends WindowTestsBase {
final WindowState startingWindow = createWindow(null /* parent */,
TYPE_APPLICATION_STARTING, startingApp.mToken, "starting");
startingApp.mActivityRecord.startingWindow = startingWindow;
- final WindowState keyguardHostWindow = mStatusBarWindow;
+ final WindowState keyguardHostWindow = mNotificationShadeWindow;
final WindowState allDrawnApp = mAppWindow;
allDrawnApp.mActivityRecord.allDrawn = true;
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index 31a7f2437536..20eab5a45ff1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -31,6 +31,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
@@ -76,6 +77,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
WindowState mImeWindow;
WindowState mImeDialogWindow;
WindowState mStatusBarWindow;
+ WindowState mNotificationShadeWindow;
WindowState mDockedDividerWindow;
WindowState mNavBarWindow;
WindowState mAppWindow;
@@ -119,6 +121,8 @@ class WindowTestsBase extends SystemServiceTestsBase {
mImeDialogWindow = createCommonWindow(null, TYPE_INPUT_METHOD_DIALOG,
"mImeDialogWindow");
mStatusBarWindow = createCommonWindow(null, TYPE_STATUS_BAR, "mStatusBarWindow");
+ mNotificationShadeWindow = createCommonWindow(null, TYPE_NOTIFICATION_SHADE,
+ "mNotificationShadeWindow");
mNavBarWindow = createCommonWindow(null, TYPE_NAVIGATION_BAR, "mNavBarWindow");
mDockedDividerWindow = createCommonWindow(null, TYPE_DOCK_DIVIDER,
"mDockedDividerWindow");
diff --git a/telephony/java/android/telephony/PinResult.java b/telephony/java/android/telephony/PinResult.java
index 683e85387c08..c14bd91d022c 100644
--- a/telephony/java/android/telephony/PinResult.java
+++ b/telephony/java/android/telephony/PinResult.java
@@ -67,9 +67,9 @@ public final class PinResult implements Parcelable {
/**
* Returns either success, incorrect or failure.
*
- * @see: #PIN_RESULT_TYPE_SUCCESS
- * @see: #PIN_RESULT_TYPE_INCORRECT
- * @see: #PIN_RESULT_TYPE_FAILURE
+ * @see #PIN_RESULT_TYPE_SUCCESS
+ * @see #PIN_RESULT_TYPE_INCORRECT
+ * @see #PIN_RESULT_TYPE_FAILURE
* @return The result type of the pin attempt.
*/
public @PinResultType int getType() {
@@ -94,9 +94,9 @@ public final class PinResult implements Parcelable {
* PinResult constructor
*
* @param type The type of pin result.
- * @see: #PIN_RESULT_TYPE_SUCCESS
- * @see: #PIN_RESULT_TYPE_INCORRECT
- * @see: #PIN_RESULT_TYPE_FAILURE
+ * @see #PIN_RESULT_TYPE_SUCCESS
+ * @see #PIN_RESULT_TYPE_INCORRECT
+ * @see #PIN_RESULT_TYPE_FAILURE
* @param attemptsRemaining Number of pin attempts remaining.
*/
public PinResult(@PinResultType int type, int attemptsRemaining) {
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index b42ce35aa79c..8de5b8541f56 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -782,6 +782,12 @@ public class SubscriptionManager {
public static final String UICC_APPLICATIONS_ENABLED = SimInfo.UICC_APPLICATIONS_ENABLED;
/**
+ * Indicate which network type is allowed. By default it's enabled.
+ * @hide
+ */
+ public static final String ALLOWED_NETWORK_TYPES = SimInfo.ALLOWED_NETWORK_TYPES;
+
+ /**
* Broadcast Action: The user has changed one of the default subs related to
* data, phone calls, or sms</p>
*
@@ -2434,7 +2440,28 @@ public class SubscriptionManager {
try {
return Integer.parseInt(result);
} catch (NumberFormatException err) {
- logd("getBooleanSubscriptionProperty NumberFormat exception");
+ logd("getIntegerSubscriptionProperty NumberFormat exception");
+ }
+ }
+ return defValue;
+ }
+
+ /**
+ * Returns long value corresponding to query result.
+ * @param subId Subscription Id of Subscription
+ * @param propKey Column name in SubscriptionInfo database
+ * @param defValue Default long value to be returned
+ * @return long result value to be returned
+ * @hide
+ */
+ public static long getLongSubscriptionProperty(int subId, String propKey, long defValue,
+ Context context) {
+ String result = getSubscriptionProperty(subId, propKey, context);
+ if (result != null) {
+ try {
+ return Long.parseLong(result);
+ } catch (NumberFormatException err) {
+ logd("getLongSubscriptionProperty NumberFormat exception");
}
}
return defValue;
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 7e493aee20ff..c9d5006946aa 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -7687,7 +7687,9 @@ public class TelephonyManager {
*
* @return the preferred network type.
* @hide
+ * @deprecated Use {@link #getPreferredNetworkTypeBitmask} instead.
*/
+ @Deprecated
@RequiresPermission((android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE))
@UnsupportedAppUsage
public @PrefNetworkMode int getPreferredNetworkType(int subId) {
@@ -7732,6 +7734,30 @@ public class TelephonyManager {
}
/**
+ * Get the allowed network types.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE}
+ * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ *
+ * @return the allowed network type bitmask
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SystemApi
+ public @NetworkTypeBitMask long getAllowedNetworkTypes() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.getAllowedNetworkTypes(getSubId());
+ }
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "getAllowedNetworkTypes RemoteException", ex);
+ }
+ return -1;
+ }
+
+ /**
* Sets the network selection mode to automatic.
*
* <p>If this object has been created with {@link #createForSubscriptionId}, applies to the
@@ -7982,7 +8008,9 @@ public class TelephonyManager {
* @param networkType the preferred network type
* @return true on success; false on any failure.
* @hide
+ * @deprecated Use {@link #setPreferredNetworkTypeBitmask} instead.
*/
+ @Deprecated
@UnsupportedAppUsage
public boolean setPreferredNetworkType(int subId, @PrefNetworkMode int networkType) {
try {
@@ -7997,7 +8025,8 @@ public class TelephonyManager {
}
/**
- * Set the preferred network type bitmask.
+ * Set the preferred network type bitmask but if {@link #setAllowedNetworkTypes} has been set,
+ * only the allowed network type will set to the modem.
*
* <p>If this object has been created with {@link #createForSubscriptionId}, applies to the
* given subId. Otherwise, applies to {@link SubscriptionManager#getDefaultSubscriptionId()}
@@ -8027,6 +8056,29 @@ public class TelephonyManager {
}
/**
+ * Set the allowed network types of the device. This is for carrier or privileged apps to
+ * enable/disable certain network types on the device. The user preferred network types should
+ * be set through {@link #setPreferredNetworkTypeBitmask}.
+ *
+ * @param allowedNetworkTypes The bitmask of allowed network types.
+ * @return true on success; false on any failure.
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ @SystemApi
+ public boolean setAllowedNetworkTypes(@NetworkTypeBitMask long allowedNetworkTypes) {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.setAllowedNetworkTypes(getSubId(), allowedNetworkTypes);
+ }
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "setAllowedNetworkTypes RemoteException", ex);
+ }
+ return false;
+ }
+
+ /**
* Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA.
*
* <p>Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
diff --git a/telephony/java/android/telephony/ims/ImsException.java b/telephony/java/android/telephony/ims/ImsException.java
index 39af2e770882..cb3f0f92625e 100644
--- a/telephony/java/android/telephony/ims/ImsException.java
+++ b/telephony/java/android/telephony/ims/ImsException.java
@@ -30,10 +30,7 @@ import java.lang.annotation.RetentionPolicy;
/**
* This class defines an IMS-related exception that has been thrown while interacting with a
* device or carrier provided ImsService implementation.
- * @hide
*/
-@SystemApi
-@TestApi
public final class ImsException extends Exception {
/**
@@ -83,7 +80,10 @@ public final class ImsException extends Exception {
/**
* A new {@link ImsException} with an unspecified {@link ImsErrorCode} code.
* @param message an optional message to detail the error condition more specifically.
+ * @hide
*/
+ @SystemApi
+ @TestApi
public ImsException(@Nullable String message) {
super(getMessage(message, CODE_ERROR_UNSPECIFIED));
}
@@ -91,7 +91,10 @@ public final class ImsException extends Exception {
/**
* A new {@link ImsException} that includes an {@link ImsErrorCode} error code.
* @param message an optional message to detail the error condition more specifically.
+ * @hide
*/
+ @SystemApi
+ @TestApi
public ImsException(@Nullable String message, @ImsErrorCode int code) {
super(getMessage(message, code));
mCode = code;
@@ -102,7 +105,10 @@ public final class ImsException extends Exception {
* {@link Throwable} that contains the original error that was thrown to lead to this Exception.
* @param message an optional message to detail the error condition more specifically.
* @param cause the {@link Throwable} that caused this {@link ImsException} to be created.
+ * @hide
*/
+ @SystemApi
+ @TestApi
public ImsException(@Nullable String message, @ImsErrorCode int code,
@Nullable Throwable cause) {
super(getMessage(message, code), cause);
diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java
index 91514e9ebe28..5fdef8307d42 100644
--- a/telephony/java/android/telephony/ims/ImsMmTelManager.java
+++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java
@@ -23,6 +23,8 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
+import android.annotation.SuppressAutoDoc;
+import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Binder;
@@ -55,10 +57,7 @@ import java.util.function.Consumer;
* associated subscription.
*
* @see #createForSubscriptionId(int)
- * @hide
*/
-@SystemApi
-@TestApi
public class ImsMmTelManager implements RegistrationManager {
/**
@@ -93,9 +92,11 @@ public class ImsMmTelManager implements RegistrationManager {
* @see #registerImsRegistrationCallback(Executor, RegistrationCallback) (RegistrationCallback)
* @see #unregisterImsRegistrationCallback(RegistrationCallback)
* @deprecated Use {@link RegistrationManager.RegistrationCallback} instead.
+ * @hide
*/
// Do not add to this class, add to RegistrationManager.RegistrationCallback instead.
@Deprecated
+ @SystemApi @TestApi
public static class RegistrationCallback extends RegistrationManager.RegistrationCallback {
/**
@@ -140,7 +141,7 @@ public class ImsMmTelManager implements RegistrationManager {
/**
* Receives IMS capability status updates from the ImsService. This information is also
- * available via the {@link #isAvailable(int, int)} method below.
+ * available via the {@see #isAvailable(int, int)} method below.
*
* @see #registerMmTelCapabilityCallback(Executor, CapabilityCallback) (CapabilityCallback)
* @see #unregisterMmTelCapabilityCallback(CapabilityCallback)
@@ -193,7 +194,7 @@ public class ImsMmTelManager implements RegistrationManager {
* If unavailable, the feature is not able to support the unavailable capability at this
* time.
*
- * This information can also be queried using the {@link #isAvailable(int, int)} API.
+ * This information can also be queried using the {@see #isAvailable(int, int)} API.
*
* @param capabilities The new availability of the capabilities.
*/
@@ -221,8 +222,20 @@ public class ImsMmTelManager implements RegistrationManager {
*
* @param subId The ID of the subscription that this ImsMmTelManager will use.
* @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList()
+ *
+ * <p>Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE
+ * READ_PRECISE_PHONE_STATE} or that the calling app has carrier privileges
+ * (see {@link android.telephony.TelephonyManager#hasCarrierPrivileges}).
+ *
* @throws IllegalArgumentException if the subscription is invalid.
+ *
*/
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE
+ })
+ @SuppressLint("ManagerLookup")
public static @NonNull ImsMmTelManager createForSubscriptionId(int subId) {
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
throw new IllegalArgumentException("Invalid subscription ID");
@@ -261,8 +274,10 @@ public class ImsMmTelManager implements RegistrationManager {
* reason.
* @deprecated Use {@link RegistrationManager#registerImsRegistrationCallback(Executor,
* RegistrationManager.RegistrationCallback)} instead.
+ * @hide
*/
@Deprecated
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void registerImsRegistrationCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull RegistrationCallback c) throws ImsException {
@@ -287,9 +302,20 @@ public class ImsMmTelManager implements RegistrationManager {
}
}
- /**{@inheritDoc}*/
+ /**
+ *
+ * <p>Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE
+ * READ_PRECISE_PHONE_STATE} or that the calling app has carrier privileges
+ * (see {@link android.telephony.TelephonyManager#hasCarrierPrivileges}).
+ *
+ * {@inheritDoc}
+ *
+ */
@Override
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public void registerImsRegistrationCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull RegistrationManager.RegistrationCallback c) throws ImsException {
if (c == null) {
@@ -320,8 +346,10 @@ public class ImsMmTelManager implements RegistrationManager {
* @see #registerImsRegistrationCallback(Executor, RegistrationCallback)
* @deprecated Use {@link #unregisterImsRegistrationCallback(
* RegistrationManager.RegistrationCallback)}.
+ * @hide
*/
@Deprecated
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void unregisterImsRegistrationCallback(@NonNull RegistrationCallback c) {
if (c == null) {
@@ -334,9 +362,20 @@ public class ImsMmTelManager implements RegistrationManager {
}
}
- /**{@inheritDoc}*/
+ /**
+ *
+ * <p>Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE
+ * READ_PRECISE_PHONE_STATE} or that the calling app has carrier privileges
+ * (see {@link android.telephony.TelephonyManager#hasCarrierPrivileges}).
+ * Access by profile owners is deprecated and will be removed in a future release.
+ *
+ *{@inheritDoc}
+ */
@Override
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public void unregisterImsRegistrationCallback(
@NonNull RegistrationManager.RegistrationCallback c) {
if (c == null) {
@@ -349,9 +388,13 @@ public class ImsMmTelManager implements RegistrationManager {
}
}
- /**{@inheritDoc}*/
+ /**
+ * {@inheritDoc}
+ * @hide
+ */
@Override
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SystemApi @TestApi
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void getRegistrationState(@NonNull @CallbackExecutor Executor executor,
@NonNull @ImsRegistrationState Consumer<Integer> stateCallback) {
if (stateCallback == null) {
@@ -372,9 +415,19 @@ public class ImsMmTelManager implements RegistrationManager {
}
}
- /**{@inheritDoc}*/
+ /**
+ * <p>Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE
+ * READ_PRECISE_PHONE_STATE} or that the calling app has carrier privileges
+ * (see {@link android.telephony.TelephonyManager#hasCarrierPrivileges}).
+ * Access by profile owners is deprecated and will be removed in a future release.
+ *
+ *{@inheritDoc}
+ */
@Override
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public void getRegistrationTransportType(@NonNull @CallbackExecutor Executor executor,
@NonNull @AccessNetworkConstants.TransportType
Consumer<Integer> transportTypeCallback) {
@@ -400,12 +453,25 @@ public class ImsMmTelManager implements RegistrationManager {
/**
* Registers a {@link CapabilityCallback} with the system, which will provide MmTel service
* availability updates for the subscription specified in
- * {@link #createForSubscriptionId(int)}. The method {@link #isAvailable(int, int)}
+ * {@link #createForSubscriptionId(int)}. The method {@see #isAvailable(int, int)}
* can also be used to query this information at any time.
*
* Use {@link SubscriptionManager.OnSubscriptionsChangedListener} to listen to
* subscription changed events and call
* {@link #unregisterMmTelCapabilityCallback(CapabilityCallback)} to clean up.
+ * <p>This API requires one of the following:
+ * <ul>
+ * <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
+ * <li>If the caller is the device or profile owner, the caller holds the
+ * {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
+ * <li>The caller has carrier privileges (see
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
+ * active subscription.</li>
+ * <li>The caller is the default SMS app for the device.</li>
+ * </ul>
+ * <p>The profile owner is an app that owns a managed profile on the device; for more details
+ * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
+ * Access by profile owners is deprecated and will be removed in a future release.
*
* When the callback is registered, it will initiate the callback c to be called with the
* current capabilities.
@@ -421,7 +487,10 @@ public class ImsMmTelManager implements RegistrationManager {
* the service crashed, for example. See {@link ImsException#getCode()} for a more detailed
* reason.
*/
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public void registerMmTelCapabilityCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull CapabilityCallback c) throws ImsException {
if (c == null) {
@@ -453,10 +522,27 @@ public class ImsMmTelManager implements RegistrationManager {
* When the subscription associated with this callback is removed (SIM removed, ESIM swap,
* etc...), this callback will automatically be removed. If this method is called for an
* inactive subscription, it will result in a no-op.
+ * <p>This API requires one of the following:
+ * <ul>
+ * <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
+ * <li>If the caller is the device or profile owner, the caller holds the
+ * {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
+ * <li>The caller has carrier privileges (see
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
+ * active subscription.</li>
+ * <li>The caller is the default SMS app for the device.</li>
+ * </ul>
+ * <p>The profile owner is an app that owns a managed profile on the device; for more details
+ * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
+ * Access by profile owners is deprecated and will be removed in a future release.
+ *
* @param c The MmTel {@link CapabilityCallback} to be removed.
* @see #registerMmTelCapabilityCallback(Executor, CapabilityCallback)
*/
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public void unregisterMmTelCapabilityCallback(@NonNull CapabilityCallback c) {
if (c == null) {
throw new IllegalArgumentException("Must include a non-null RegistrationCallback.");
@@ -478,6 +564,19 @@ public class ImsMmTelManager implements RegistrationManager {
* <p>
* Note: If the carrier configuration for advanced calling is not editable or hidden, this
* method will always return the default value.
+ * <p>This API requires one of the following:
+ * <ul>
+ * <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
+ * <li>If the caller is the device or profile owner, the caller holds the
+ * {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
+ * <li>The caller has carrier privileges (see
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
+ * active subscription.</li>
+ * <li>The caller is the default SMS app for the device.</li>
+ * </ul>
+ * <p>The profile owner is an app that owns a managed profile on the device; for more details
+ * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
+ * Access by profile owners is deprecated and will be removed in a future release.
*
* @see android.telephony.CarrierConfigManager#KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
* @see android.telephony.CarrierConfigManager#KEY_EDITABLE_ENHANCED_4G_LTE_BOOL
@@ -489,7 +588,10 @@ public class ImsMmTelManager implements RegistrationManager {
* active (SIM is not inserted, ESIM inactive) or invalid.
* @return true if the user's setting for advanced calling is enabled, false otherwise.
*/
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public boolean isAdvancedCallingSettingEnabled() {
try {
return getITelephony().isAdvancedCallingSettingEnabled(mSubId);
@@ -527,8 +629,10 @@ public class ImsMmTelManager implements RegistrationManager {
* @see #isAdvancedCallingSettingEnabled()
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
+ * @hide
*/
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
+ @SystemApi @TestApi
public void setAdvancedCallingSettingEnabled(boolean isEnabled) {
try {
getITelephony().setAdvancedCallingSettingEnabled(mSubId, isEnabled);
@@ -559,13 +663,15 @@ public class ImsMmTelManager implements RegistrationManager {
* {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
* @param capability The IMS MmTel capability to query, can be one of the following:
* {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE},
- * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO,
+ * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO},
* {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT},
* {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS}
* @return {@code true} if the MmTel IMS capability is capable for this subscription, false
* otherwise.
+ * @hide
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SystemApi @TestApi
public boolean isCapable(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability,
@ImsRegistrationImplBase.ImsRegistrationTech int imsRegTech) {
try {
@@ -586,12 +692,14 @@ public class ImsMmTelManager implements RegistrationManager {
* {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
* @param capability The IMS MmTel capability to query, can be one of the following:
* {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE},
- * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO,
+ * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO},
* {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT},
* {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS}
* @return {@code true} if the MmTel IMS capability is available for this subscription, false
* otherwise.
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public boolean isAvailable(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability,
@ImsRegistrationImplBase.ImsRegistrationTech int imsRegTech) {
@@ -616,7 +724,9 @@ public class ImsMmTelManager implements RegistrationManager {
* capability is supported on this carrier network for the transport specified.
* @throws ImsException if the subscription is no longer valid or the IMS service is not
* available.
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void isSupported(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability,
@AccessNetworkConstants.TransportType int transportType,
@@ -645,12 +755,32 @@ public class ImsMmTelManager implements RegistrationManager {
/**
* The user's setting for whether or not they have enabled the "Video Calling" setting.
*
+ * <p>
+ * Note: If the carrier configuration for advanced calling is not editable or hidden, this
+ * method will always return the default value.
+ * <p>This API requires one of the following:
+ * <ul>
+ * <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
+ * <li>If the caller is the device or profile owner, the caller holds the
+ * {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
+ * <li>The caller has carrier privileges (see
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
+ * active subscription.</li>
+ * <li>The caller is the default SMS app for the device.</li>
+ * </ul>
+ * <p>The profile owner is an app that owns a managed profile on the device; for more details
+ * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
+ * Access by profile owners is deprecated and will be removed in a future release.
+ *
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @return true if the user’s “Video Calling” setting is currently enabled.
* @see #setVtSettingEnabled(boolean)
*/
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
public boolean isVtSettingEnabled() {
try {
return getITelephony().isVtSettingEnabled(mSubId);
@@ -672,7 +802,9 @@ public class ImsMmTelManager implements RegistrationManager {
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @see #isVtSettingEnabled()
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setVtSettingEnabled(boolean isEnabled) {
try {
@@ -692,11 +824,28 @@ public class ImsMmTelManager implements RegistrationManager {
/**
* @return true if the user's setting for Voice over WiFi is enabled and false if it is not.
*
+ * <p>This API requires one of the following:
+ * <ul>
+ * <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
+ * <li>If the caller is the device or profile owner, the caller holds the
+ * {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
+ * <li>The caller has carrier privileges (see
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
+ * active subscription.</li>
+ * <li>The caller is the default SMS app for the device.</li>
+ * </ul>
+ * <p>The profile owner is an app that owns a managed profile on the device; for more details
+ * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
+ * Access by profile owners is deprecated and will be removed in a future release.
+ *
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @see #setVoWiFiSettingEnabled(boolean)
*/
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public boolean isVoWiFiSettingEnabled() {
try {
return getITelephony().isVoWiFiSettingEnabled(mSubId);
@@ -719,7 +868,9 @@ public class ImsMmTelManager implements RegistrationManager {
* active (SIM is not inserted, ESIM inactive) or invalid.
* @param isEnabled true if the user's setting for Voice over WiFi is enabled, false otherwise=
* @see #isVoWiFiSettingEnabled()
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setVoWiFiSettingEnabled(boolean isEnabled) {
try {
@@ -739,13 +890,30 @@ public class ImsMmTelManager implements RegistrationManager {
/**
* Returns the user's voice over WiFi roaming setting associated with the current subscription.
*
+ * <p>This API requires one of the following:
+ * <ul>
+ * <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
+ * <li>If the caller is the device or profile owner, the caller holds the
+ * {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
+ * <li>The caller has carrier privileges (see
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
+ * active subscription.</li>
+ * <li>The caller is the default SMS app for the device.</li>
+ * </ul>
+ * <p>The profile owner is an app that owns a managed profile on the device; for more details
+ * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
+ * Access by profile owners is deprecated and will be removed in a future release.
+ *
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @return true if the user's setting for Voice over WiFi while roaming is enabled, false
* if disabled.
* @see #setVoWiFiRoamingSettingEnabled(boolean)
*/
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public boolean isVoWiFiRoamingSettingEnabled() {
try {
return getITelephony().isVoWiFiRoamingSettingEnabled(mSubId);
@@ -769,7 +937,9 @@ public class ImsMmTelManager implements RegistrationManager {
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @see #isVoWiFiRoamingSettingEnabled()
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setVoWiFiRoamingSettingEnabled(boolean isEnabled) {
try {
@@ -799,7 +969,9 @@ public class ImsMmTelManager implements RegistrationManager {
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @see #setVoWiFiSettingEnabled(boolean)
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setVoWiFiNonPersistent(boolean isCapable, int mode) {
try {
@@ -819,6 +991,20 @@ public class ImsMmTelManager implements RegistrationManager {
/**
* Returns the user's voice over WiFi Roaming mode setting associated with the device.
*
+ * <p>This API requires one of the following:
+ * <ul>
+ * <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
+ * <li>If the caller is the device or profile owner, the caller holds the
+ * {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
+ * <li>The caller has carrier privileges (see
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
+ * active subscription.</li>
+ * <li>The caller is the default SMS app for the device.</li>
+ * </ul>
+ * <p>The profile owner is an app that owns a managed profile on the device; for more details
+ * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
+ * Access by profile owners is deprecated and will be removed in a future release.
+ *
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @return The Voice over WiFi Mode preference set by the user, which can be one of the
@@ -828,7 +1014,10 @@ public class ImsMmTelManager implements RegistrationManager {
* - {@link #WIFI_MODE_WIFI_PREFERRED}
* @see #setVoWiFiSettingEnabled(boolean)
*/
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public @WiFiCallingMode int getVoWiFiModeSetting() {
try {
return getITelephony().getVoWiFiModeSetting(mSubId);
@@ -854,7 +1043,9 @@ public class ImsMmTelManager implements RegistrationManager {
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @see #getVoWiFiModeSetting()
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setVoWiFiModeSetting(@WiFiCallingMode int mode) {
try {
@@ -883,7 +1074,9 @@ public class ImsMmTelManager implements RegistrationManager {
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @see #setVoWiFiRoamingSettingEnabled(boolean)
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public @WiFiCallingMode int getVoWiFiRoamingModeSetting() {
try {
@@ -912,7 +1105,9 @@ public class ImsMmTelManager implements RegistrationManager {
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @see #getVoWiFiRoamingModeSetting()
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setVoWiFiRoamingModeSetting(@WiFiCallingMode int mode) {
try {
@@ -939,7 +1134,9 @@ public class ImsMmTelManager implements RegistrationManager {
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @param isEnabled if true RTT should be enabled during calls made on this subscription.
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setRttCapabilitySetting(boolean isEnabled) {
try {
@@ -959,12 +1156,29 @@ public class ImsMmTelManager implements RegistrationManager {
/**
* @return true if TTY over VoLTE is supported
*
+ * <p>This API requires one of the following:
+ * <ul>
+ * <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
+ * <li>If the caller is the device or profile owner, the caller holds the
+ * {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
+ * <li>The caller has carrier privileges (see
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
+ * active subscription.</li>
+ * <li>The caller is the default SMS app for the device.</li>
+ * </ul>
+ * <p>The profile owner is an app that owns a managed profile on the device; for more details
+ * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
+ * Access by profile owners is deprecated and will be removed in a future release.
+ *
* @throws IllegalArgumentException if the subscription associated with this operation is not
* active (SIM is not inserted, ESIM inactive) or invalid.
* @see android.telecom.TelecomManager#getCurrentTtyMode
* @see android.telephony.CarrierConfigManager#KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL
*/
- @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ android.Manifest.permission.READ_PRECISE_PHONE_STATE})
public boolean isTtyOverVolteEnabled() {
try {
return getITelephony().isTtyOverVolteEnabled(mSubId);
@@ -991,7 +1205,9 @@ public class ImsMmTelManager implements RegistrationManager {
* specified when the service state has been retrieved from the IMS service.
* @throws ImsException if the IMS service associated with this subscription is not available or
* the IMS service is not available.
+ * @hide
*/
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void getFeatureState(@NonNull @CallbackExecutor Executor executor,
@NonNull @ImsFeature.ImsState Consumer<Integer> callback) throws ImsException {
diff --git a/telephony/java/android/telephony/ims/RegistrationManager.java b/telephony/java/android/telephony/ims/RegistrationManager.java
index ca081ec1ea51..5c86ba732701 100644
--- a/telephony/java/android/telephony/ims/RegistrationManager.java
+++ b/telephony/java/android/telephony/ims/RegistrationManager.java
@@ -22,8 +22,6 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
-import android.annotation.SystemApi;
-import android.annotation.TestApi;
import android.net.Uri;
import android.os.Binder;
import android.telephony.AccessNetworkConstants;
@@ -41,10 +39,7 @@ import java.util.function.Consumer;
/**
* Manages IMS Service registration state for associated {@link ImsFeature}s.
- * @hide
*/
-@SystemApi
-@TestApi
public interface RegistrationManager {
/**
@@ -157,7 +152,6 @@ public interface RegistrationManager {
}
}
- @Override
public void onSubscriberAssociatedUriChanged(Uri[] uris) {
if (mLocalCallback == null) return;
@@ -246,7 +240,11 @@ public interface RegistrationManager {
/**
* Registers a {@link RegistrationCallback} with the system. Use
- * {@link SubscriptionManager.OnSubscriptionsChangedListener} to listen to Subscription changed
+ * @param executor The {@link Executor} that will be used to call the IMS registration state
+ * callback.
+ * @param c A callback called on the supplied {@link Executor} that will contain the
+ * registration state of the IMS service, which will be one of the
+ * {@see SubscriptionManager.OnSubscriptionsChangedListener} to listen to Subscription changed
* events and call {@link #unregisterImsRegistrationCallback(RegistrationCallback)} to clean up.
*
* When the callback is registered, it will initiate the callback c to be called with the
@@ -296,10 +294,10 @@ public interface RegistrationManager {
* Gets the Transport Type associated with the current IMS registration.
* @param executor The {@link Executor} that will be used to call the transportTypeCallback.
* @param transportTypeCallback The transport type associated with the current IMS registration,
- * which will be one of following:
- * {@link AccessNetworkConstants#TRANSPORT_TYPE_WWAN},
- * {@link AccessNetworkConstants#TRANSPORT_TYPE_WLAN}, or
- * {@link AccessNetworkConstants#TRANSPORT_TYPE_INVALID}.
+ * which will be one of following:
+ * {@see AccessNetworkConstants#TRANSPORT_TYPE_WWAN},
+ * {@see AccessNetworkConstants#TRANSPORT_TYPE_WLAN}, or
+ * {@see AccessNetworkConstants#TRANSPORT_TYPE_INVALID}.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
void getRegistrationTransportType(
diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java
index 1004e1b4acb7..e5779b315c93 100644
--- a/telephony/java/android/telephony/ims/feature/ImsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java
@@ -60,15 +60,21 @@ public abstract class ImsFeature {
* This feature supports emergency calling over MMTEL. If defined, the framework will try to
* place an emergency call over IMS first. If it is not defined, the framework will only use
* CSFB for emergency calling.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int FEATURE_EMERGENCY_MMTEL = 0;
/**
* This feature supports the MMTEL feature.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int FEATURE_MMTEL = 1;
/**
* This feature supports the RCS feature.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int FEATURE_RCS = 2;
/**
* Total number of features defined
@@ -116,18 +122,24 @@ public abstract class ImsFeature {
* This {@link ImsFeature}'s state is unavailable and should not be communicated with. This will
* remove all bindings back to the framework. Any attempt to communicate with the framework
* during this time will result in an {@link IllegalStateException}.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int STATE_UNAVAILABLE = 0;
/**
* This {@link ImsFeature} state is initializing and should not be communicated with. This will
* remove all bindings back to the framework. Any attempt to communicate with the framework
* during this time will result in an {@link IllegalStateException}.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int STATE_INITIALIZING = 1;
/**
* This {@link ImsFeature} is ready for communication. Do not attempt to call framework methods
- * until {@link #onFeatureReady()} is called.
+ * until {@see #onFeatureReady()} is called.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int STATE_READY = 2;
/**
@@ -155,11 +167,15 @@ public abstract class ImsFeature {
/**
* The capability was unable to be changed.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int CAPABILITY_ERROR_GENERIC = -1;
/**
* The capability was able to be changed.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int CAPABILITY_SUCCESS = 0;
/**
@@ -331,7 +347,9 @@ public abstract class ImsFeature {
*
* @see SubscriptionManager#getSubscriptionIds(int) for more information on getting the
* subscription IDs associated with this slot.
+ * @hide
*/
+ @SystemApi @TestApi
public final int getSlotIndex() {
return mSlotId;
}
@@ -339,7 +357,9 @@ public abstract class ImsFeature {
/**
* @return The current state of the ImsFeature, set previously by {@link #setFeatureState(int)}
* or {@link #STATE_UNAVAILABLE} if it has not been updated yet.
+ * @hide
*/
+ @SystemApi @TestApi
public @ImsState int getFeatureState() {
synchronized (mLock) {
return mState;
@@ -351,7 +371,9 @@ public abstract class ImsFeature {
* stop communication, depending on the state sent.
* @param state The ImsFeature's state, defined as {@link #STATE_UNAVAILABLE},
* {@link #STATE_INITIALIZING}, or {@link #STATE_READY}.
+ * @hide
*/
+ @SystemApi @TestApi
public final void setFeatureState(@ImsState int state) {
synchronized (mLock) {
if (mState != state) {
diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
index 56c87710244c..0d5a979e5894 100644
--- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java
+++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
@@ -52,14 +52,18 @@ import java.lang.annotation.RetentionPolicy;
*
* Any class wishing to use MmTelFeature should extend this class and implement all methods that the
* service supports.
- * @hide
*/
-@SystemApi
-@TestApi
public class MmTelFeature extends ImsFeature {
private static final String LOG_TAG = "MmTelFeature";
+ /**
+ * @hide
+ */
+ @SystemApi @TestApi
+ public MmTelFeature() {
+ }
+
private final IImsMmTelFeature mImsMMTelBinder = new IImsMmTelFeature.Stub() {
@Override
@@ -215,11 +219,11 @@ public class MmTelFeature extends ImsFeature {
* {@link MmTelCapabilities#CAPABILITY_TYPE_SMS}.
*
* The capabilities of this MmTelFeature will be set by the framework and can be queried with
- * {@link #queryCapabilityStatus()}.
+ * {@see #queryCapabilityStatus()}.
*
* This MmTelFeature can then return the status of each of these capabilities (enabled or not)
- * by sending a {@link #notifyCapabilitiesStatusChanged} callback to the framework. The current
- * status can also be queried using {@link #queryCapabilityStatus()}.
+ * by sending a {@see #notifyCapabilitiesStatusChanged} callback to the framework. The current
+ * status can also be queried using {@see #queryCapabilityStatus()}.
* @see #isCapable(int)
*/
public static class MmTelCapabilities extends Capabilities {
@@ -228,13 +232,18 @@ public class MmTelFeature extends ImsFeature {
* Create a new empty {@link MmTelCapabilities} instance.
* @see #addCapabilities(int)
* @see #removeCapabilities(int)
+ * @hide
*/
+ @SystemApi @TestApi
public MmTelCapabilities() {
super();
}
- /**@deprecated Use {@link MmTelCapabilities} to construct a new instance instead.*/
+ /**@deprecated Use {@link MmTelCapabilities} to construct a new instance instead.
+ * @hide
+ */
@Deprecated
+ @SystemApi @TestApi
public MmTelCapabilities(Capabilities c) {
mCapabilities = c.mCapabilities;
}
@@ -243,11 +252,17 @@ public class MmTelFeature extends ImsFeature {
* Create a new {link @MmTelCapabilities} instance with the provided capabilities.
* @param capabilities The capabilities that are supported for MmTel in the form of a
* bitfield.
+ * @hide
*/
+ @SystemApi @TestApi
public MmTelCapabilities(@MmTelCapability int capabilities) {
super(capabilities);
}
+ /**
+ * @hide
+ */
+ @SystemApi @TestApi
@IntDef(flag = true,
value = {
CAPABILITY_TYPE_VOICE,
@@ -278,23 +293,39 @@ public class MmTelFeature extends ImsFeature {
*/
public static final int CAPABILITY_TYPE_SMS = 1 << 3;
+ /**
+ * @hide
+ */
@Override
+ @SystemApi @TestApi
public final void addCapabilities(@MmTelCapability int capabilities) {
super.addCapabilities(capabilities);
}
+ /**
+ * @hide
+ */
@Override
+ @SystemApi @TestApi
public final void removeCapabilities(@MmTelCapability int capability) {
super.removeCapabilities(capability);
}
+ /**
+ * @hide
+ */
@Override
+ @SystemApi @TestApi
public final boolean isCapable(@MmTelCapability int capabilities) {
return super.isCapable(capabilities);
}
+ /**
+ * @hide
+ */
@NonNull
@Override
+ @SystemApi @TestApi
public String toString() {
StringBuilder builder = new StringBuilder("MmTel Capabilities - [");
builder.append("Voice: ");
@@ -319,8 +350,10 @@ public class MmTelFeature extends ImsFeature {
/**
* Called when the IMS provider receives an incoming call.
* @param c The {@link ImsCallSession} associated with the new call.
+ * @hide
*/
@Override
+ @SystemApi @TestApi
public void onIncomingCall(IImsCallSession c, Bundle extras) {
}
@@ -329,8 +362,10 @@ public class MmTelFeature extends ImsFeature {
* Called when the IMS provider implicitly rejects an incoming call during setup.
* @param callProfile An {@link ImsCallProfile} with the call details.
* @param reason The {@link ImsReasonInfo} reason for call rejection.
+ * @hide
*/
@Override
+ @SystemApi @TestApi
public void onRejectedCall(ImsCallProfile callProfile, ImsReasonInfo reason) {
}
@@ -338,8 +373,10 @@ public class MmTelFeature extends ImsFeature {
/**
* Updates the Listener when the voice message count for IMS has changed.
* @param count an integer representing the new message count.
+ * @hide
*/
@Override
+ @SystemApi @TestApi
public void onVoiceMessageCountUpdate(int count) {
}
@@ -348,14 +385,22 @@ public class MmTelFeature extends ImsFeature {
/**
* To be returned by {@link #shouldProcessCall(String[])} when the ImsService should process the
* outgoing call as IMS.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int PROCESS_CALL_IMS = 0;
/**
* To be returned by {@link #shouldProcessCall(String[])} when the telephony framework should
* not process the outgoing call as IMS and should instead use circuit switch.
+ * @hide
*/
+ @SystemApi @TestApi
public static final int PROCESS_CALL_CSFB = 1;
+ /**
+ * @hide
+ */
+ @SystemApi @TestApi
@IntDef(flag = true,
value = {
PROCESS_CALL_IMS,
@@ -368,7 +413,9 @@ public class MmTelFeature extends ImsFeature {
* If the flag is present and true, it indicates that the incoming call is for USSD.
* <p>
* This is an optional boolean flag.
+ * @hide
*/
+ @SystemApi @TestApi
public static final String EXTRA_IS_USSD = "android.telephony.ims.feature.extra.IS_USSD";
/**
@@ -379,7 +426,9 @@ public class MmTelFeature extends ImsFeature {
* certain situations.
* <p>
* This is an optional boolean flag.
+ * @hide
*/
+ @SystemApi @TestApi
public static final String EXTRA_IS_UNKNOWN_CALL =
"android.telephony.ims.feature.extra.IS_UNKNOWN_CALL";
@@ -388,6 +437,7 @@ public class MmTelFeature extends ImsFeature {
/**
* @param listener A {@link Listener} used when the MmTelFeature receives an incoming call and
* notifies the framework.
+ * @hide
*/
private void setListener(IImsMmTelListener listener) {
synchronized (mLock) {
@@ -406,9 +456,11 @@ public class MmTelFeature extends ImsFeature {
* Should be a subset of the capabilities that are enabled by the framework in
* {@link #changeEnabledCapabilities}.
* @return A copy of the current MmTelFeature capability status.
+ * @hide
*/
@Override
- public final MmTelCapabilities queryCapabilityStatus() {
+ @SystemApi @TestApi
+ public @NonNull final MmTelCapabilities queryCapabilityStatus() {
return new MmTelCapabilities(super.queryCapabilityStatus());
}
@@ -420,7 +472,9 @@ public class MmTelFeature extends ImsFeature {
* the status of that capability is disabled. This can happen if the network does not currently
* support the capability that is enabled. A capability that is disabled by the framework (via
* {@link #changeEnabledCapabilities}) should also show the status as disabled.
+ * @hide
*/
+ @SystemApi @TestApi
public final void notifyCapabilitiesStatusChanged(@NonNull MmTelCapabilities c) {
if (c == null) {
throw new IllegalArgumentException("MmTelCapabilities must be non-null!");
@@ -433,7 +487,9 @@ public class MmTelFeature extends ImsFeature {
* @param c The {@link ImsCallSessionImplBase} of the new incoming call.
* @param extras A bundle containing extra parameters related to the call. See
* {@link #EXTRA_IS_UNKNOWN_CALL} and {@link #EXTRA_IS_USSD} above.
+ * @hide
*/
+ @SystemApi @TestApi
public final void notifyIncomingCall(@NonNull ImsCallSessionImplBase c,
@NonNull Bundle extras) {
if (c == null || extras == null) {
@@ -458,7 +514,9 @@ public class MmTelFeature extends ImsFeature {
* @param callProfile The {@link ImsCallProfile} IMS call profile with details.
* This can be null if no call information is available for the rejected call.
* @param reason The {@link ImsReasonInfo} call rejection reason.
+ * * @hide
*/
+ @SystemApi @TestApi
public final void notifyRejectedCall(@NonNull ImsCallProfile callProfile,
@NonNull ImsReasonInfo reason) {
if (callProfile == null || reason == null) {
@@ -497,7 +555,9 @@ public class MmTelFeature extends ImsFeature {
/**
* Notify the framework of a change in the Voice Message count.
* @link count the new Voice Message count.
+ * @hide
*/
+ @SystemApi @TestApi
public final void notifyVoiceMessageCountUpdate(int count) {
synchronized (mLock) {
if (mListener == null) {
@@ -518,8 +578,10 @@ public class MmTelFeature extends ImsFeature {
* status for capability A.
* @param capability The capability that we are querying the configuration for.
* @return true if the capability is enabled, false otherwise.
+ * @hide
*/
@Override
+ @SystemApi @TestApi
public boolean queryCapabilityConfiguration(@MmTelCapabilities.MmTelCapability int capability,
@ImsRegistrationImplBase.ImsRegistrationTech int radioTech) {
// Base implementation - Override to provide functionality
@@ -537,8 +599,10 @@ public class MmTelFeature extends ImsFeature {
* Enabling/Disabling a capability here indicates that the capability should be registered or
* deregistered (depending on the capability change) and become available or unavailable to
* the framework.
+ * * @hide
*/
@Override
+ @SystemApi @TestApi
public void changeEnabledCapabilities(@NonNull CapabilityChangeRequest request,
@NonNull CapabilityCallbackProxy c) {
// Base implementation, no-op
@@ -561,7 +625,9 @@ public class MmTelFeature extends ImsFeature {
* {@link ImsCallProfile#CALL_TYPE_VS_TX}
* {@link ImsCallProfile#CALL_TYPE_VS_RX}
* @return a {@link ImsCallProfile} object
+ * @hide
*/
+ @SystemApi @TestApi
public @Nullable ImsCallProfile createCallProfile(int callSessionType, int callType) {
// Base Implementation - Should be overridden
return null;
@@ -582,7 +648,9 @@ public class MmTelFeature extends ImsFeature {
* {@link ImsCallSession} directly.
*
* @param profile a call profile to make the call
+ * @hide
*/
+ @SystemApi @TestApi
public @Nullable ImsCallSessionImplBase createCallSession(@NonNull ImsCallProfile profile) {
// Base Implementation - Should be overridden
return null;
@@ -599,7 +667,9 @@ public class MmTelFeature extends ImsFeature {
* call as a conference.
* @return a {@link ProcessCallResult} to the framework, which will be used to determine if the
* call will be placed over IMS or via CSFB.
+ * @hide
*/
+ @SystemApi @TestApi
public @ProcessCallResult int shouldProcessCall(@NonNull String[] numbers) {
return PROCESS_CALL_IMS;
}
@@ -632,7 +702,9 @@ public class MmTelFeature extends ImsFeature {
/**
* @return The {@link ImsUtImplBase} Ut interface implementation for the supplementary service
* configuration.
+ * @hide
*/
+ @SystemApi @TestApi
public @NonNull ImsUtImplBase getUt() {
// Base Implementation - Should be overridden
return new ImsUtImplBase();
@@ -641,7 +713,9 @@ public class MmTelFeature extends ImsFeature {
/**
* @return The {@link ImsEcbmImplBase} Emergency call-back mode interface for emergency VoLTE
* calls that support it.
+ * @hide
*/
+ @SystemApi @TestApi
public @NonNull ImsEcbmImplBase getEcbm() {
// Base Implementation - Should be overridden
return new ImsEcbmImplBase();
@@ -650,7 +724,9 @@ public class MmTelFeature extends ImsFeature {
/**
* @return The {@link ImsMultiEndpointImplBase} implementation for implementing Dialog event
* package processing for multi-endpoint.
+ * @hide
*/
+ @SystemApi @TestApi
public @NonNull ImsMultiEndpointImplBase getMultiEndpoint() {
// Base Implementation - Should be overridden
return new ImsMultiEndpointImplBase();
@@ -676,7 +752,9 @@ public class MmTelFeature extends ImsFeature {
* // Remote side is dead
* }
* }
+ * @hide
*/
+ @SystemApi @TestApi
public void setUiTtyMode(int mode, @Nullable Message onCompleteMessage) {
// Base Implementation - Should be overridden
}
@@ -710,7 +788,9 @@ public class MmTelFeature extends ImsFeature {
*
* @return an instance of {@link ImsSmsImplBase} which should be implemented by the IMS
* Provider.
+ * @hide
*/
+ @SystemApi @TestApi
public @NonNull ImsSmsImplBase getSmsImplementation() {
return new ImsSmsImplBase();
}
@@ -719,14 +799,22 @@ public class MmTelFeature extends ImsFeature {
return getSmsImplementation().getSmsFormat();
}
- /**{@inheritDoc}*/
+ /**
+ * {@inheritDoc}
+ * @hide
+ */
@Override
+ @SystemApi @TestApi
public void onFeatureRemoved() {
// Base Implementation - Should be overridden
}
- /**{@inheritDoc}*/
+ /**
+ * {@inheritDoc}
+ * @hide
+ */
@Override
+ @SystemApi @TestApi
public void onFeatureReady() {
// Base Implementation - Should be overridden
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index a2dc0d5e1b7a..7add741e84fa 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -922,6 +922,23 @@ interface ITelephony {
int subId, in OperatorInfo operatorInfo, boolean persisSelection);
/**
+ * Get the allowed network types that store in the telephony provider.
+ *
+ * @param subId the id of the subscription.
+ * @return allowedNetworkTypes the allowed network types.
+ */
+ long getAllowedNetworkTypes(int subId);
+
+ /**
+ * Set the allowed network types.
+ *
+ * @param subId the id of the subscription.
+ * @param allowedNetworkTypes the allowed network types.
+ * @return true on success; false on any failure.
+ */
+ boolean setAllowedNetworkTypes(int subId, long allowedNetworkTypes);
+
+ /**
* Set the preferred network type.
* Used for device configuration by some CDMA operators.
*
diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
index 1c6920986318..a35fb407bca9 100644
--- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
+++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
@@ -222,7 +222,7 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
@Override
public Network getNetwork() {
- return mNetworkAgent.network;
+ return mNetworkAgent.getNetwork();
}
public void expectPreventReconnectReceived(long timeoutMs) {
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 1901a1db633b..4e2933472706 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -575,7 +575,7 @@ public class ConnectivityServiceTest {
}
};
- assertEquals(na.network.netId, nmNetworkCaptor.getValue().netId);
+ assertEquals(na.getNetwork().netId, nmNetworkCaptor.getValue().netId);
mNmCallbacks = nmCbCaptor.getValue();
mNmCallbacks.onNetworkMonitorCreated(mNetworkMonitor);
diff --git a/wifi/java/android/net/wifi/ScanResult.aidl b/wifi/java/android/net/wifi/ScanResult.aidl
index bb66722e4a13..b30689ca5d16 100644
--- a/wifi/java/android/net/wifi/ScanResult.aidl
+++ b/wifi/java/android/net/wifi/ScanResult.aidl
@@ -16,4 +16,4 @@
package android.net.wifi;
-parcelable ScanResult;
+@JavaOnlyStableParcelable parcelable ScanResult;
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index 341330587614..3fda6cda92f5 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -17,6 +17,7 @@
package android.net.wifi;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
@@ -27,8 +28,10 @@ import com.android.internal.annotations.VisibleForTesting;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -576,67 +579,120 @@ public class ScanResult implements Parcelable {
@UnsupportedAppUsage
public List<String> anqpLines;
- /** information elements from beacon
- * @hide
+ /**
+ * information elements from beacon.
*/
public static class InformationElement {
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_SSID = 0;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_SUPPORTED_RATES = 1;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_TIM = 5;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_BSS_LOAD = 11;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_ERP = 42;
+ /** @hide */
public static final int EID_HT_CAPABILITIES = 45;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_RSN = 48;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_EXTENDED_SUPPORTED_RATES = 50;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_HT_OPERATION = 61;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_INTERWORKING = 107;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_ROAMING_CONSORTIUM = 111;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_EXTENDED_CAPS = 127;
+ /** @hide */
public static final int EID_VHT_CAPABILITIES = 191;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_VHT_OPERATION = 192;
+ /** @hide */
@UnsupportedAppUsage
public static final int EID_VSA = 221;
+ /** @hide */
public static final int EID_EXTENSION_PRESENT = 255;
- /**
- * Extension IDs
- */
+ // Extension IDs
+ /** @hide */
public static final int EID_EXT_HE_CAPABILITIES = 35;
+ /** @hide */
public static final int EID_EXT_HE_OPERATION = 36;
+ /** @hide */
@UnsupportedAppUsage
public int id;
+ /** @hide */
public int idExt;
+
+ /** @hide */
@UnsupportedAppUsage
public byte[] bytes;
+ /** @hide */
public InformationElement() {
}
- public InformationElement(InformationElement rhs) {
+ public InformationElement(@NonNull InformationElement rhs) {
this.id = rhs.id;
this.idExt = rhs.idExt;
this.bytes = rhs.bytes.clone();
}
+
+ /**
+ * The element ID of the information element. Defined in the IEEE 802.11-2016 spec
+ * Table 9-77.
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * The element ID Extension of the information element. Defined in the IEEE 802.11-2016 spec
+ * Table 9-77.
+ */
+ public int getIdExt() {
+ return idExt;
+ }
+
+ /**
+ * Get the specific content of the information element.
+ */
+ @NonNull
+ public ByteBuffer getBytes() {
+ return ByteBuffer.wrap(bytes).asReadOnlyBuffer();
+ }
}
- /** information elements found in the beacon
+ /**
+ * information elements found in the beacon.
* @hide
*/
@UnsupportedAppUsage
public InformationElement[] informationElements;
+ /**
+ * Get all information elements found in the beacon.
+ */
+ @NonNull
+ public List<InformationElement> getInformationElements() {
+ return Collections.unmodifiableList(Arrays.asList(informationElements));
+ }
/** ANQP response elements.
* @hide
@@ -762,8 +818,8 @@ public class ScanResult implements Parcelable {
this.wifiSsid = wifiSsid;
}
- /** copy constructor {@hide} */
- public ScanResult(ScanResult source) {
+ /** copy constructor */
+ public ScanResult(@NonNull ScanResult source) {
if (source != null) {
wifiSsid = source.wifiSsid;
SSID = source.SSID;
@@ -929,9 +985,8 @@ public class ScanResult implements Parcelable {
}
}
- /** Implement the Parcelable interface {@hide} */
- @UnsupportedAppUsage
- public static final @android.annotation.NonNull Creator<ScanResult> CREATOR =
+ /** Implement the Parcelable interface */
+ public static final @NonNull Creator<ScanResult> CREATOR =
new Creator<ScanResult>() {
public ScanResult createFromParcel(Parcel in) {
WifiSsid wifiSsid = null;
diff --git a/wifi/java/android/net/wifi/SoftApConfiguration.java b/wifi/java/android/net/wifi/SoftApConfiguration.java
index 49fb5a365b89..c02f8c3a8cd1 100644
--- a/wifi/java/android/net/wifi/SoftApConfiguration.java
+++ b/wifi/java/android/net/wifi/SoftApConfiguration.java
@@ -24,6 +24,7 @@ import android.net.MacAddress;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
@@ -56,6 +57,8 @@ import java.util.Objects;
*/
public final class SoftApConfiguration implements Parcelable {
+ private static final String TAG = "SoftApConfiguration";
+
@VisibleForTesting
static final int PSK_MIN_LEN = 8;
@@ -472,6 +475,58 @@ public final class SoftApConfiguration implements Parcelable {
}
/**
+ * Returns a {@link WifiConfiguration} representation of this {@link SoftApConfiguration}.
+ * Note that SoftApConfiguration may contain configuration which is cannot be represented
+ * by the legacy WifiConfiguration, in such cases a null will be returned.
+ *
+ * <li> SoftAp band in {@link WifiConfiguration.apBand} only supports
+ * 2GHz, 5GHz, 2GHz+5GHz bands, so conversion is limited to these bands. </li>
+ *
+ * <li> SoftAp security type in {@link WifiConfiguration.KeyMgmt} only supports
+ * NONE, WPA2_PSK, so conversion is limited to these security type.</li>
+ * @hide
+ */
+ @Nullable
+ @SystemApi
+ public WifiConfiguration toWifiConfiguration() {
+ WifiConfiguration wifiConfig = new WifiConfiguration();
+ wifiConfig.SSID = mSsid;
+ if (mBssid != null) {
+ wifiConfig.BSSID = mBssid.toString();
+ }
+ wifiConfig.preSharedKey = mPassphrase;
+ wifiConfig.hiddenSSID = mHiddenSsid;
+ wifiConfig.apChannel = mChannel;
+ switch (mSecurityType) {
+ case SECURITY_TYPE_OPEN:
+ wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+ break;
+ case SECURITY_TYPE_WPA2_PSK:
+ wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+ break;
+ default:
+ Log.e(TAG, "Convert fail, unsupported security type :" + mSecurityType);
+ return null;
+ }
+
+ switch (mBand) {
+ case BAND_2GHZ:
+ wifiConfig.apBand = WifiConfiguration.AP_BAND_2GHZ;
+ break;
+ case BAND_5GHZ:
+ wifiConfig.apBand = WifiConfiguration.AP_BAND_5GHZ;
+ break;
+ case BAND_ANY:
+ wifiConfig.apBand = WifiConfiguration.AP_BAND_ANY;
+ break;
+ default:
+ Log.e(TAG, "Convert fail, unsupported band setting :" + mBand);
+ return null;
+ }
+ return wifiConfig;
+ }
+
+ /**
* Builds a {@link SoftApConfiguration}, which allows an app to configure various aspects of a
* Soft AP.
*
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index b2fbb401dde5..e84369fb7ba1 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -938,8 +938,10 @@ public class WifiConfiguration implements Parcelable {
}
/**
- * Indicate whther the network is trusted or not. Networks are considered trusted
+ * Indicate whether the network is trusted or not. Networks are considered trusted
* if the user explicitly allowed this network connection.
+ * This bit can be used by suggestion network, see
+ * {@link WifiNetworkSuggestion.Builder#setUnTrusted(boolean)}
* @hide
*/
public boolean trusted;
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 30f0fb5234bd..c35303da9056 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -193,6 +193,14 @@ public class WifiManager {
*/
public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5;
+ /**
+ * Reason code if one or more of the network suggestions added is not allowed.
+ *
+ * This error may be caused by suggestion is using SIM-based encryption method, but calling app
+ * is not carrier privileged.
+ */
+ public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED = 6;
+
/** @hide */
@IntDef(prefix = { "STATUS_NETWORK_SUGGESTIONS_" }, value = {
STATUS_NETWORK_SUGGESTIONS_SUCCESS,
@@ -201,6 +209,7 @@ public class WifiManager {
STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE,
STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP,
STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID,
+ STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface NetworkSuggestionsStatusCode {}
@@ -3246,9 +3255,13 @@ public class WifiManager {
* Gets the Wi-Fi AP Configuration.
* @return AP details in WifiConfiguration
*
+ * Note that AP detail may contain configuration which is cannot be represented
+ * by the legacy WifiConfiguration, in such cases a null will be returned.
+ *
* @deprecated This API is deprecated. Use {@link #getSoftApConfiguration()} instead.
* @hide
*/
+ @Nullable
@SystemApi
@RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE)
@Deprecated
@@ -3750,13 +3763,15 @@ public class WifiManager {
public class LocalOnlyHotspotReservation implements AutoCloseable {
private final CloseGuard mCloseGuard = new CloseGuard();
- private final SoftApConfiguration mConfig;
+ private final SoftApConfiguration mSoftApConfig;
+ private final WifiConfiguration mWifiConfig;
private boolean mClosed = false;
/** @hide */
@VisibleForTesting
public LocalOnlyHotspotReservation(SoftApConfiguration config) {
- mConfig = config;
+ mSoftApConfig = config;
+ mWifiConfig = config.toWifiConfiguration();
mCloseGuard.open("close");
}
@@ -3771,7 +3786,7 @@ public class WifiManager {
@Deprecated
@Nullable
public WifiConfiguration getWifiConfiguration() {
- return convertToWifiConfiguration(mConfig);
+ return mWifiConfig;
}
/**
@@ -3779,40 +3794,7 @@ public class WifiManager {
*/
@NonNull
public SoftApConfiguration getSoftApConfiguration() {
- return mConfig;
- }
-
- /**
- * Convert to WifiConfiguration from SoftApConfuration.
- *
- * Copy to the filed which is public and used by SoftAp.
- */
- private WifiConfiguration convertToWifiConfiguration(SoftApConfiguration softApConfig) {
- if (softApConfig == null) return null;
-
- WifiConfiguration wifiConfig = new WifiConfiguration();
- wifiConfig.networkId = WifiConfiguration.LOCAL_ONLY_NETWORK_ID;
- wifiConfig.SSID = softApConfig.getSsid();
- if (softApConfig.getBssid() != null) {
- wifiConfig.BSSID = softApConfig.getBssid().toString();
- }
- wifiConfig.preSharedKey = softApConfig.getPassphrase();
- wifiConfig.hiddenSSID = softApConfig.isHiddenSsid();
- int authType = softApConfig.getSecurityType();
- switch (authType) {
- case SoftApConfiguration.SECURITY_TYPE_OPEN:
- authType = WifiConfiguration.KeyMgmt.NONE;
- wifiConfig.allowedKeyManagement.set(authType);
- break;
- case SoftApConfiguration.SECURITY_TYPE_WPA2_PSK:
- authType = WifiConfiguration.KeyMgmt.WPA2_PSK;
- wifiConfig.allowedKeyManagement.set(authType);
- break;
- default:
- wifiConfig = null;
- break;
- }
- return wifiConfig;
+ return mSoftApConfig;
}
@Override
diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
index 7ecad9ee1031..0cf0c22d8dc2 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
@@ -139,6 +139,11 @@ public final class WifiNetworkSuggestion implements Parcelable {
*/
private @Nullable WifiEnterpriseConfig mWapiEnterpriseConfig;
+ /**
+ * Whether this network will be brought up as untrusted (TRUSTED capability bit removed).
+ */
+ private boolean mIsNetworkUntrusted;
+
public Builder() {
mSsid = null;
mBssid = null;
@@ -159,6 +164,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
mCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
mWapiPskPassphrase = null;
mWapiEnterpriseConfig = null;
+ mIsNetworkUntrusted = false;
}
/**
@@ -468,6 +474,27 @@ public final class WifiNetworkSuggestion implements Parcelable {
return this;
}
+ /**
+ * Specifies whether the system will bring up the network (if selected) as untrusted. An
+ * untrusted network has its {@link android.net.NetworkCapabilities#NET_CAPABILITY_TRUSTED}
+ * capability removed. The Wi-Fi network selection process may use this information to
+ * influence priority of the suggested network for Wi-Fi network selection (most likely to
+ * reduce it). The connectivity service may use this information to influence the overall
+ * network configuration of the device.
+ * <p>
+ * <li> An untrusted network's credentials may not be shared with the user using
+ * {@link #setCredentialSharedWithUser(boolean)}.</li>
+ * <li> If not set, defaults to false (i.e. network is trusted).</li>
+ *
+ * @param isUntrusted Boolean indicating whether the network should be brought up untrusted
+ * (if true) or trusted (if false).
+ * @return Instance of {@link Builder} to enable chaining of the builder method.
+ */
+ public @NonNull Builder setUntrusted(boolean isUntrusted) {
+ mIsNetworkUntrusted = isUntrusted;
+ return this;
+ }
+
private void setSecurityParamsInWifiConfiguration(
@NonNull WifiConfiguration configuration) {
if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
@@ -546,6 +573,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
wifiConfiguration.meteredOverride =
mIsMetered ? WifiConfiguration.METERED_OVERRIDE_METERED
: WifiConfiguration.METERED_OVERRIDE_NONE;
+ wifiConfiguration.trusted = !mIsNetworkUntrusted;
mPasspointConfiguration.setCarrierId(mCarrierId);
return wifiConfiguration;
}
@@ -641,13 +669,22 @@ public final class WifiNetworkSuggestion implements Parcelable {
+ "setCredentialSharedWithUser and "
+ "setIsAutoJoinEnabled set to false");
}
+ if (mIsNetworkUntrusted) {
+ if (mIsSharedWithUserSet && mIsSharedWithUser) {
+ throw new IllegalStateException("Should not be both"
+ + "setCredentialSharedWithUser and +"
+ + "setIsNetworkAsUntrusted to true");
+ }
+ mIsSharedWithUser = false;
+ }
return new WifiNetworkSuggestion(
wifiConfiguration,
mPasspointConfiguration,
mIsAppInteractionRequired,
mIsUserInteractionRequired,
mIsSharedWithUser,
- mIsInitialAutoJoinEnabled);
+ mIsInitialAutoJoinEnabled,
+ mIsNetworkUntrusted);
}
}
@@ -688,6 +725,13 @@ public final class WifiNetworkSuggestion implements Parcelable {
*/
public final boolean isInitialAutoJoinEnabled;
+ /**
+ * Whether this network will be brought up as untrusted (TRUSTED capability bit removed).
+ * @hide
+ */
+ public final boolean isNetworkUntrusted;
+
+
/** @hide */
public WifiNetworkSuggestion() {
this.wifiConfiguration = null;
@@ -696,6 +740,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
this.isUserInteractionRequired = false;
this.isUserAllowedToManuallyConnect = true;
this.isInitialAutoJoinEnabled = true;
+ this.isNetworkUntrusted = false;
}
/** @hide */
@@ -704,7 +749,8 @@ public final class WifiNetworkSuggestion implements Parcelable {
boolean isAppInteractionRequired,
boolean isUserInteractionRequired,
boolean isUserAllowedToManuallyConnect,
- boolean isInitialAutoJoinEnabled) {
+ boolean isInitialAutoJoinEnabled,
+ boolean isNetworkUntrusted) {
checkNotNull(networkConfiguration);
this.wifiConfiguration = networkConfiguration;
this.passpointConfiguration = passpointConfiguration;
@@ -713,6 +759,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
this.isUserInteractionRequired = isUserInteractionRequired;
this.isUserAllowedToManuallyConnect = isUserAllowedToManuallyConnect;
this.isInitialAutoJoinEnabled = isInitialAutoJoinEnabled;
+ this.isNetworkUntrusted = isNetworkUntrusted;
}
public static final @NonNull Creator<WifiNetworkSuggestion> CREATOR =
@@ -725,7 +772,8 @@ public final class WifiNetworkSuggestion implements Parcelable {
in.readBoolean(), // isAppInteractionRequired
in.readBoolean(), // isUserInteractionRequired
in.readBoolean(), // isSharedCredentialWithUser
- in.readBoolean() // isAutoJoinEnabled
+ in.readBoolean(), // isAutoJoinEnabled
+ in.readBoolean()
);
}
@@ -748,6 +796,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
dest.writeBoolean(isUserInteractionRequired);
dest.writeBoolean(isUserAllowedToManuallyConnect);
dest.writeBoolean(isInitialAutoJoinEnabled);
+ dest.writeBoolean(isNetworkUntrusted);
}
@Override
@@ -787,8 +836,9 @@ public final class WifiNetworkSuggestion implements Parcelable {
.append(", FQDN=").append(wifiConfiguration.FQDN)
.append(", isAppInteractionRequired=").append(isAppInteractionRequired)
.append(", isUserInteractionRequired=").append(isUserInteractionRequired)
- .append(", isUserAllowedToManuallyConnect=").append(isUserAllowedToManuallyConnect)
+ .append(", isCredentialSharedWithUser=").append(isUserAllowedToManuallyConnect)
.append(", isInitialAutoJoinEnabled=").append(isInitialAutoJoinEnabled)
+ .append(", isUnTrusted=").append(isNetworkUntrusted)
.append(" ]");
return sb.toString();
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java b/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
index a4115027b6c1..5484d248429f 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
@@ -61,6 +61,9 @@ public final class WifiP2pWfdInfo implements Parcelable {
* {@link #mDeviceInfo} & {@link #DEVICE_TYPE} is one of {@link #DEVICE_TYPE_WFD_SOURCE},
* {@link #DEVICE_TYPE_PRIMARY_SINK}, {@link #DEVICE_TYPE_SECONDARY_SINK} or
* {@link #DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK}.
+ *
+ * The bit definition is listed in 5.1.2 WFD Device Information Subelement in
+ * Wi-Fi Display Technical Specification.
*/
private static final int DEVICE_TYPE = 1 << 1 | 1 << 0;
private static final int COUPLED_SINK_SUPPORT_AT_SOURCE = 1 << 2;
@@ -69,6 +72,8 @@ public final class WifiP2pWfdInfo implements Parcelable {
private static final int SESSION_AVAILABLE_BIT2 = 1 << 5;
private static final int SESSION_AVAILABLE =
SESSION_AVAILABLE_BIT2 | SESSION_AVAILABLE_BIT1;
+ /* The support of Content Protection using the HDCP system 2.0/2.1. */
+ private static final int CONTENT_PROTECTION_SUPPORT = 1 << 8;
private int mCtrlPort;
@@ -146,6 +151,26 @@ public final class WifiP2pWfdInfo implements Parcelable {
}
}
+ /**
+ * @return true if Content Protection using the HDCP system 2.0/2.1 is supported.
+ */
+ public boolean isContentProtectionSupported() {
+ return (mDeviceInfo & CONTENT_PROTECTION_SUPPORT) != 0;
+ }
+
+ /**
+ * Sets whether Content Protection using the HDCP system 2.0/2.1 is supported.
+ *
+ * @param enabled true to indicate that Content Protection is supported, false otherwise.
+ */
+ public void setContentProtectionSupported(boolean enabled) {
+ if (enabled) {
+ mDeviceInfo |= CONTENT_PROTECTION_SUPPORT;
+ } else {
+ mDeviceInfo &= ~CONTENT_PROTECTION_SUPPORT;
+ }
+ }
+
/** Returns the TCP port at which the WFD Device listens for RTSP messages. */
public int getControlPort() {
return mCtrlPort;
diff --git a/wifi/java/android/net/wifi/wificond/DeviceWiphyCapabilities.java b/wifi/java/android/net/wifi/wificond/DeviceWiphyCapabilities.java
index de1c7600f8ef..13ae3b322841 100644
--- a/wifi/java/android/net/wifi/wificond/DeviceWiphyCapabilities.java
+++ b/wifi/java/android/net/wifi/wificond/DeviceWiphyCapabilities.java
@@ -37,12 +37,21 @@ public final class DeviceWiphyCapabilities implements Parcelable {
private boolean m80211nSupported;
private boolean m80211acSupported;
private boolean m80211axSupported;
+ private boolean mChannelWidth160MhzSupported;
+ private boolean mChannelWidth80p80MhzSupported;
+ private int mMaxNumberTxSpatialStreams;
+ private int mMaxNumberRxSpatialStreams;
+
/** public constructor */
public DeviceWiphyCapabilities() {
m80211nSupported = false;
m80211acSupported = false;
m80211axSupported = false;
+ mChannelWidth160MhzSupported = false;
+ mChannelWidth80p80MhzSupported = false;
+ mMaxNumberTxSpatialStreams = 1;
+ mMaxNumberRxSpatialStreams = 1;
}
/**
@@ -91,6 +100,88 @@ public final class DeviceWiphyCapabilities implements Parcelable {
}
}
+ /**
+ * Get the support for channel bandwidth
+ *
+ * @param chWidth valid values from {@link ScanResult}'s {@code CHANNEL_WIDTH_}
+ *
+ * @return {@code true} if supported, {@code false} otherwise.
+ */
+ public boolean isChannelWidthSupported(int chWidth) {
+ switch (chWidth) {
+ case ScanResult.CHANNEL_WIDTH_20MHZ:
+ return true;
+ case ScanResult.CHANNEL_WIDTH_40MHZ:
+ return (m80211nSupported || m80211acSupported || m80211axSupported);
+ case ScanResult.CHANNEL_WIDTH_80MHZ:
+ return (m80211acSupported || m80211axSupported);
+ case ScanResult.CHANNEL_WIDTH_160MHZ:
+ return mChannelWidth160MhzSupported;
+ case ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ:
+ return mChannelWidth80p80MhzSupported;
+ default:
+ Log.e(TAG, "isChannelWidthSupported called with invalid channel width: " + chWidth);
+ }
+ return false;
+ }
+
+ /**
+ * Set support for channel bandwidth
+ *
+ * @param chWidth valid values are {@link ScanResult#CHANNEL_WIDTH_160MHZ} and
+ * {@link ScanResult#CHANNEL_WIDTH_80MHZ_PLUS_MHZ}
+ * @param support {@code true} if supported, {@code false} otherwise.
+ */
+ public void setChannelWidthSupported(int chWidth, boolean support) {
+ switch (chWidth) {
+ case ScanResult.CHANNEL_WIDTH_160MHZ:
+ mChannelWidth160MhzSupported = support;
+ break;
+ case ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ:
+ mChannelWidth80p80MhzSupported = support;
+ break;
+ default:
+ Log.e(TAG, "setChannelWidthSupported called with Invalid channel width: "
+ + chWidth);
+ }
+ }
+
+ /**
+ * Get maximum number of transmit spatial streams
+ *
+ * @return number of spatial streams
+ */
+ public int getMaxNumberTxSpatialStreams() {
+ return mMaxNumberTxSpatialStreams;
+ }
+
+ /**
+ * Set maximum number of transmit spatial streams
+ *
+ * @param streams number of spatial streams
+ */
+ public void setMaxNumberTxSpatialStreams(int streams) {
+ mMaxNumberTxSpatialStreams = streams;
+ }
+
+ /**
+ * Get maximum number of receive spatial streams
+ *
+ * @return number of streams
+ */
+ public int getMaxNumberRxSpatialStreams() {
+ return mMaxNumberRxSpatialStreams;
+ }
+
+ /**
+ * Set maximum number of receive spatial streams
+ *
+ * @param streams number of streams
+ */
+ public void setMaxNumberRxSpatialStreams(int streams) {
+ mMaxNumberRxSpatialStreams = streams;
+ }
+
/** override comparator */
@Override
public boolean equals(Object rhs) {
@@ -102,13 +193,19 @@ public final class DeviceWiphyCapabilities implements Parcelable {
return m80211nSupported == capa.m80211nSupported
&& m80211acSupported == capa.m80211acSupported
- && m80211axSupported == capa.m80211axSupported;
+ && m80211axSupported == capa.m80211axSupported
+ && mChannelWidth160MhzSupported == capa.mChannelWidth160MhzSupported
+ && mChannelWidth80p80MhzSupported == capa.mChannelWidth80p80MhzSupported
+ && mMaxNumberTxSpatialStreams == capa.mMaxNumberTxSpatialStreams
+ && mMaxNumberRxSpatialStreams == capa.mMaxNumberRxSpatialStreams;
}
/** override hash code */
@Override
public int hashCode() {
- return Objects.hash(m80211nSupported, m80211acSupported, m80211axSupported);
+ return Objects.hash(m80211nSupported, m80211acSupported, m80211axSupported,
+ mChannelWidth160MhzSupported, mChannelWidth80p80MhzSupported,
+ mMaxNumberTxSpatialStreams, mMaxNumberRxSpatialStreams);
}
/** implement Parcelable interface */
@@ -126,6 +223,10 @@ public final class DeviceWiphyCapabilities implements Parcelable {
out.writeBoolean(m80211nSupported);
out.writeBoolean(m80211acSupported);
out.writeBoolean(m80211axSupported);
+ out.writeBoolean(mChannelWidth160MhzSupported);
+ out.writeBoolean(mChannelWidth80p80MhzSupported);
+ out.writeInt(mMaxNumberTxSpatialStreams);
+ out.writeInt(mMaxNumberRxSpatialStreams);
}
@Override
@@ -134,6 +235,13 @@ public final class DeviceWiphyCapabilities implements Parcelable {
sb.append("m80211nSupported:").append(m80211nSupported ? "Yes" : "No");
sb.append("m80211acSupported:").append(m80211acSupported ? "Yes" : "No");
sb.append("m80211axSupported:").append(m80211axSupported ? "Yes" : "No");
+ sb.append("mChannelWidth160MhzSupported: ")
+ .append(mChannelWidth160MhzSupported ? "Yes" : "No");
+ sb.append("mChannelWidth80p80MhzSupported: ")
+ .append(mChannelWidth80p80MhzSupported ? "Yes" : "No");
+ sb.append("mMaxNumberTxSpatialStreams: ").append(mMaxNumberTxSpatialStreams);
+ sb.append("mMaxNumberRxSpatialStreams: ").append(mMaxNumberRxSpatialStreams);
+
return sb.toString();
}
@@ -149,6 +257,10 @@ public final class DeviceWiphyCapabilities implements Parcelable {
capabilities.m80211nSupported = in.readBoolean();
capabilities.m80211acSupported = in.readBoolean();
capabilities.m80211axSupported = in.readBoolean();
+ capabilities.mChannelWidth160MhzSupported = in.readBoolean();
+ capabilities.mChannelWidth80p80MhzSupported = in.readBoolean();
+ capabilities.mMaxNumberTxSpatialStreams = in.readInt();
+ capabilities.mMaxNumberRxSpatialStreams = in.readInt();
return capabilities;
}
diff --git a/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java b/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java
index 6884a4ede27a..2efdd97543a9 100644
--- a/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java
+++ b/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java
@@ -18,6 +18,8 @@ package android.net.wifi;
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertNull;
+
import android.net.MacAddress;
import android.os.Parcel;
@@ -251,7 +253,7 @@ public class SoftApConfigurationTest {
}
@Test(expected = IllegalArgumentException.class)
- public void testsetClientListExceptionWhenExistMacAddressInBothList() {
+ public void testSetClientListExceptionWhenExistMacAddressInBothList() {
final MacAddress testMacAddress_1 = MacAddress.fromString("22:33:44:55:66:77");
final MacAddress testMacAddress_2 = MacAddress.fromString("aa:bb:cc:dd:ee:ff");
ArrayList<MacAddress> testAllowedClientList = new ArrayList<>();
@@ -262,4 +264,40 @@ public class SoftApConfigurationTest {
SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
configBuilder.setClientList(testBlockedClientList, testAllowedClientList);
}
+
+ @Test
+ public void testToWifiConfigurationWithUnsupportedParameter() {
+ SoftApConfiguration sae_config = new SoftApConfiguration.Builder()
+ .setPassphrase("secretsecret", SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)
+ .build();
+
+ assertNull(sae_config.toWifiConfiguration());
+ SoftApConfiguration band_6g_config = new SoftApConfiguration.Builder()
+ .setBand(SoftApConfiguration.BAND_6GHZ)
+ .build();
+
+ assertNull(band_6g_config.toWifiConfiguration());
+ SoftApConfiguration sae_transition_config = new SoftApConfiguration.Builder()
+ .setPassphrase("secretsecret",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)
+ .build();
+
+ assertNull(sae_transition_config.toWifiConfiguration());
+ }
+
+ @Test
+ public void testToWifiConfigurationWithSupportedParameter() {
+ SoftApConfiguration softApConfig = new SoftApConfiguration.Builder()
+ .setPassphrase("secretsecret",
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
+ .setChannel(149, SoftApConfiguration.BAND_5GHZ)
+ .setHiddenSsid(true)
+ .build();
+ WifiConfiguration wifiConfig = softApConfig.toWifiConfiguration();
+ assertThat(wifiConfig.getAuthType()).isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
+ assertThat(wifiConfig.preSharedKey).isEqualTo("secretsecret");
+ assertThat(wifiConfig.apBand).isEqualTo(WifiConfiguration.AP_BAND_5GHZ);
+ assertThat(wifiConfig.apChannel).isEqualTo(149);
+ assertThat(wifiConfig.hiddenSSID).isEqualTo(true);
+ }
}
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
index e778b9ad47a3..15accc337429 100644
--- a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
@@ -532,7 +532,7 @@ public class WifiNetworkSuggestionTest {
configuration.BSSID = TEST_BSSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion(
- configuration, null, false, true, true, false);
+ configuration, null, false, true, true, true, false);
Parcel parcelW = Parcel.obtain();
suggestion.writeToParcel(parcelW, 0);
@@ -603,14 +603,14 @@ public class WifiNetworkSuggestionTest {
configuration.BSSID = TEST_BSSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
WifiNetworkSuggestion suggestion =
- new WifiNetworkSuggestion(configuration, null, true, false, true, true);
+ new WifiNetworkSuggestion(configuration, null, true, false, true, true, false);
WifiConfiguration configuration1 = new WifiConfiguration();
configuration1.SSID = TEST_SSID;
configuration1.BSSID = TEST_BSSID;
configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
WifiNetworkSuggestion suggestion1 =
- new WifiNetworkSuggestion(configuration1, null, false, true, true, false);
+ new WifiNetworkSuggestion(configuration1, null, false, true, true, true, false);
assertEquals(suggestion, suggestion1);
assertEquals(suggestion.hashCode(), suggestion1.hashCode());
@@ -626,13 +626,13 @@ public class WifiNetworkSuggestionTest {
configuration.SSID = TEST_SSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
- new WifiNetworkSuggestion(configuration, null, false, false, true, false);
+ new WifiNetworkSuggestion(configuration, null, false, false, true, true, false);
WifiConfiguration configuration1 = new WifiConfiguration();
configuration1.SSID = TEST_SSID_1;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion1 =
- new WifiNetworkSuggestion(configuration1, null, false, false, true, false);
+ new WifiNetworkSuggestion(configuration1, null, false, false, true, true, false);
assertNotEquals(suggestion, suggestion1);
}
@@ -648,13 +648,13 @@ public class WifiNetworkSuggestionTest {
configuration.BSSID = TEST_BSSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
- new WifiNetworkSuggestion(configuration, null, false, false, true, true);
+ new WifiNetworkSuggestion(configuration, null, false, false, true, true, false);
WifiConfiguration configuration1 = new WifiConfiguration();
configuration1.SSID = TEST_SSID;
configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion1 =
- new WifiNetworkSuggestion(configuration1, null, false, false, true, true);
+ new WifiNetworkSuggestion(configuration1, null, false, false, true, true, false);
assertNotEquals(suggestion, suggestion1);
}
@@ -669,13 +669,13 @@ public class WifiNetworkSuggestionTest {
configuration.SSID = TEST_SSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
- new WifiNetworkSuggestion(configuration, null, false, false, true, true);
+ new WifiNetworkSuggestion(configuration, null, false, false, true, true, false);
WifiConfiguration configuration1 = new WifiConfiguration();
configuration1.SSID = TEST_SSID;
configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
WifiNetworkSuggestion suggestion1 =
- new WifiNetworkSuggestion(configuration1, null, false, false, true, true);
+ new WifiNetworkSuggestion(configuration1, null, false, false, true, true, false);
assertNotEquals(suggestion, suggestion1);
}
@@ -723,8 +723,8 @@ public class WifiNetworkSuggestionTest {
* true on a open network suggestion.
*/
@Test(expected = IllegalStateException.class)
- public void testSetIsUserAllowedToManuallyConnectToWithOpenNetwork() {
- new WifiNetworkSuggestion.Builder()
+ public void testSetCredentialSharedWithUserWithOpenNetwork() {
+ WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setCredentialSharedWithUser(true)
.build();
@@ -760,6 +760,53 @@ public class WifiNetworkSuggestionTest {
}
/**
+ * Validate {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} set the
+ * correct value to the WifiConfiguration.
+ */
+ @Test
+ public void testSetIsNetworkAsUntrusted() {
+ WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+ .setSsid(TEST_SSID)
+ .setWpa2Passphrase(TEST_PRESHARED_KEY)
+ .setUntrusted(true)
+ .build();
+ assertTrue(suggestion.isNetworkUntrusted);
+ assertFalse(suggestion.isUserAllowedToManuallyConnect);
+ }
+
+ /**
+ * Validate {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} set the
+ * correct value to the WifiConfiguration.
+ * Also the {@link WifiNetworkSuggestion#isUserAllowedToManuallyConnect} should be false;
+ */
+ @Test
+ public void testSetIsNetworkAsUntrustedOnPasspointNetwork() {
+ PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
+ WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+ .setPasspointConfig(passpointConfiguration)
+ .setUntrusted(true)
+ .build();
+ assertTrue(suggestion.isNetworkUntrusted);
+ assertFalse(suggestion.isUserAllowedToManuallyConnect);
+ }
+
+ /**
+ * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+ * when set {@link WifiNetworkSuggestion.Builder#setUntrusted(boolean)} to true and
+ * set {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} to true
+ * together.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testSetCredentialSharedWithUserWithSetIsNetworkAsUntrusted() {
+ new WifiNetworkSuggestion.Builder()
+ .setSsid(TEST_SSID)
+ .setWpa2Passphrase(TEST_PRESHARED_KEY)
+ .setCredentialSharedWithUser(true)
+ .setUntrusted(true)
+ .build();
+ }
+
+ /**
* Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
* when set both {@link WifiNetworkSuggestion.Builder#setIsInitialAutoJoinEnabled(boolean)}
* and {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} (boolean)}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java
index cea73efc88d0..15a0aacf6e5b 100644
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java
+++ b/wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java
@@ -45,6 +45,7 @@ public class WifiP2pWfdInfoTest {
// initialize device info flags.
mSourceInfo.setDeviceType(WifiP2pWfdInfo.DEVICE_TYPE_WFD_SOURCE);
mSourceInfo.setSessionAvailable(true);
+ mSourceInfo.setContentProtectionSupported(true);
}
/**
@@ -63,13 +64,16 @@ public class WifiP2pWfdInfoTest {
info.setSessionAvailable(true);
assertTrue(info.isSessionAvailable());
+ info.setContentProtectionSupported(true);
+ assertTrue(info.isContentProtectionSupported());
+
info.setControlPort(TEST_CTRL_PORT);
assertEquals(TEST_CTRL_PORT, info.getControlPort());
info.setMaxThroughput(TEST_MAX_TPUT);
assertEquals(TEST_MAX_TPUT, info.getMaxThroughput());
- assertEquals("0010270f0400", info.getDeviceInfoHex());
+ assertEquals("0110270f0400", info.getDeviceInfoHex());
}
/**
diff --git a/wifi/tests/src/android/net/wifi/wificond/DeviceWiphyCapabilitiesTest.java b/wifi/tests/src/android/net/wifi/wificond/DeviceWiphyCapabilitiesTest.java
index 1479acfe8e20..8e3627acd4ed 100644
--- a/wifi/tests/src/android/net/wifi/wificond/DeviceWiphyCapabilitiesTest.java
+++ b/wifi/tests/src/android/net/wifi/wificond/DeviceWiphyCapabilitiesTest.java
@@ -45,6 +45,10 @@ public class DeviceWiphyCapabilitiesTest {
capa.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11N, true);
capa.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11AC, true);
capa.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11AX, false);
+ capa.setChannelWidthSupported(ScanResult.CHANNEL_WIDTH_160MHZ, true);
+ capa.setChannelWidthSupported(ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ, false);
+ capa.setMaxNumberTxSpatialStreams(2);
+ capa.setMaxNumberRxSpatialStreams(1);
Parcel parcel = Parcel.obtain();
capa.writeToParcel(parcel, 0);
@@ -56,4 +60,29 @@ public class DeviceWiphyCapabilitiesTest {
assertEquals(capa, capaDeserialized);
assertEquals(capa.hashCode(), capaDeserialized.hashCode());
}
+
+ /**
+ * Test mapping wifi standard support into channel width support
+ */
+ @Test
+ public void testMappingWifiStandardIntoChannelWidthSupport() {
+ DeviceWiphyCapabilities capa = new DeviceWiphyCapabilities();
+
+ capa.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11N, false);
+ capa.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11AC, false);
+ capa.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11AX, false);
+ assertEquals(true, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_20MHZ));
+ assertEquals(false, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_40MHZ));
+ assertEquals(false, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_80MHZ));
+
+ capa.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11N, true);
+ assertEquals(true, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_20MHZ));
+ assertEquals(true, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_40MHZ));
+ assertEquals(false, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_80MHZ));
+
+ capa.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11AC, true);
+ assertEquals(true, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_20MHZ));
+ assertEquals(true, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_40MHZ));
+ assertEquals(true, capa.isChannelWidthSupported(ScanResult.CHANNEL_WIDTH_80MHZ));
+ }
}
diff --git a/wifi/tests/src/android/net/wifi/wificond/WifiCondManagerTest.java b/wifi/tests/src/android/net/wifi/wificond/WifiCondManagerTest.java
index 619c95efb173..f262268d7179 100644
--- a/wifi/tests/src/android/net/wifi/wificond/WifiCondManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/wificond/WifiCondManagerTest.java
@@ -1046,6 +1046,10 @@ public class WifiCondManagerTest {
capaExpected.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11N, true);
capaExpected.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11AC, true);
capaExpected.setWifiStandardSupport(ScanResult.WIFI_STANDARD_11AX, false);
+ capaExpected.setChannelWidthSupported(ScanResult.CHANNEL_WIDTH_160MHZ, true);
+ capaExpected.setChannelWidthSupported(ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ, false);
+ capaExpected.setMaxNumberTxSpatialStreams(2);
+ capaExpected.setMaxNumberRxSpatialStreams(1);
when(mWificond.getDeviceWiphyCapabilities(TEST_INTERFACE_NAME))
.thenReturn(capaExpected);