summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/appsearch/framework/api/current.txt11
-rw-r--r--apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java2
-rw-r--r--apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java12
-rw-r--r--apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl4
-rw-r--r--apex/appsearch/framework/java/external/android/app/appsearch/PackageIdentifier.java36
-rw-r--r--apex/appsearch/framework/java/external/android/app/appsearch/PutDocumentsRequest.java17
-rw-r--r--apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java3
-rw-r--r--apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java107
-rw-r--r--apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java22
-rw-r--r--apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java123
-rw-r--r--apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/VisibilityStore.java203
-rw-r--r--apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchSpecToProtoConverter.java58
-rw-r--r--apex/appsearch/synced_jetpack_changeid.txt2
-rw-r--r--core/api/current.txt48
-rw-r--r--core/api/system-current.txt31
-rw-r--r--core/api/test-current.txt14
-rw-r--r--core/api/test-lint-baseline.txt2
-rw-r--r--core/java/android/app/ActivityManagerInternal.java21
-rw-r--r--core/java/android/app/admin/DevicePolicyManagerInternal.java8
-rw-r--r--core/java/android/app/timezonedetector/TimeZoneDetector.java6
-rw-r--r--core/java/android/content/pm/parsing/ApkLite.java412
-rw-r--r--core/java/android/content/pm/parsing/ApkLiteParseUtils.java21
-rw-r--r--core/java/android/content/pm/parsing/PackageLite.java363
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageUtils.java79
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedActivityUtils.java11
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedIntentInfoUtils.java2
-rw-r--r--core/java/android/hardware/SensorPrivacyManager.java33
-rw-r--r--core/java/android/provider/Settings.java8
-rw-r--r--core/java/android/view/View.java1
-rw-r--r--core/java/com/android/internal/app/ChooserActivity.java54
-rw-r--r--core/java/com/android/internal/app/ChooserActivityLogger.java6
-rw-r--r--core/res/res/values-af/strings.xml4
-rw-r--r--core/res/res/values-am/strings.xml4
-rw-r--r--core/res/res/values-ar/strings.xml4
-rw-r--r--core/res/res/values-as/strings.xml4
-rw-r--r--core/res/res/values-az/strings.xml4
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml4
-rw-r--r--core/res/res/values-be/strings.xml4
-rw-r--r--core/res/res/values-bg/strings.xml4
-rw-r--r--core/res/res/values-bn/strings.xml4
-rw-r--r--core/res/res/values-bs/strings.xml4
-rw-r--r--core/res/res/values-ca/strings.xml4
-rw-r--r--core/res/res/values-cs/strings.xml3
-rw-r--r--core/res/res/values-da/strings.xml4
-rw-r--r--core/res/res/values-de/strings.xml4
-rw-r--r--core/res/res/values-el/strings.xml4
-rw-r--r--core/res/res/values-en-rAU/strings.xml4
-rw-r--r--core/res/res/values-en-rCA/strings.xml4
-rw-r--r--core/res/res/values-en-rGB/strings.xml4
-rw-r--r--core/res/res/values-en-rIN/strings.xml4
-rw-r--r--core/res/res/values-en-rXC/strings.xml3
-rw-r--r--core/res/res/values-es-rUS/strings.xml4
-rw-r--r--core/res/res/values-es/strings.xml4
-rw-r--r--core/res/res/values-et/strings.xml4
-rw-r--r--core/res/res/values-eu/strings.xml4
-rw-r--r--core/res/res/values-fa/strings.xml4
-rw-r--r--core/res/res/values-fi/strings.xml4
-rw-r--r--core/res/res/values-fr-rCA/strings.xml4
-rw-r--r--core/res/res/values-fr/strings.xml4
-rw-r--r--core/res/res/values-gl/strings.xml4
-rw-r--r--core/res/res/values-gu/strings.xml4
-rw-r--r--core/res/res/values-hi/strings.xml4
-rw-r--r--core/res/res/values-hr/strings.xml4
-rw-r--r--core/res/res/values-hu/strings.xml4
-rw-r--r--core/res/res/values-hy/strings.xml4
-rw-r--r--core/res/res/values-in/strings.xml4
-rw-r--r--core/res/res/values-is/strings.xml4
-rw-r--r--core/res/res/values-it/strings.xml4
-rw-r--r--core/res/res/values-iw/strings.xml4
-rw-r--r--core/res/res/values-ja/strings.xml4
-rw-r--r--core/res/res/values-ka/strings.xml4
-rw-r--r--core/res/res/values-kk/strings.xml4
-rw-r--r--core/res/res/values-km/strings.xml4
-rw-r--r--core/res/res/values-kn/strings.xml4
-rw-r--r--core/res/res/values-ko/strings.xml4
-rw-r--r--core/res/res/values-ky/strings.xml4
-rw-r--r--core/res/res/values-lo/strings.xml4
-rw-r--r--core/res/res/values-lt/strings.xml4
-rw-r--r--core/res/res/values-lv/strings.xml4
-rw-r--r--core/res/res/values-mk/strings.xml4
-rw-r--r--core/res/res/values-ml/strings.xml4
-rw-r--r--core/res/res/values-mn/strings.xml12
-rw-r--r--core/res/res/values-mr/strings.xml18
-rw-r--r--core/res/res/values-ms/strings.xml4
-rw-r--r--core/res/res/values-my/strings.xml4
-rw-r--r--core/res/res/values-nb/strings.xml4
-rw-r--r--core/res/res/values-ne/strings.xml4
-rw-r--r--core/res/res/values-nl/strings.xml4
-rw-r--r--core/res/res/values-or/strings.xml14
-rw-r--r--core/res/res/values-pa/strings.xml4
-rw-r--r--core/res/res/values-pl/strings.xml4
-rw-r--r--core/res/res/values-pt-rBR/strings.xml4
-rw-r--r--core/res/res/values-pt-rPT/strings.xml3
-rw-r--r--core/res/res/values-pt/strings.xml4
-rw-r--r--core/res/res/values-ro/strings.xml4
-rw-r--r--core/res/res/values-ru/strings.xml4
-rw-r--r--core/res/res/values-si/strings.xml4
-rw-r--r--core/res/res/values-sk/strings.xml4
-rw-r--r--core/res/res/values-sl/strings.xml4
-rw-r--r--core/res/res/values-sq/strings.xml4
-rw-r--r--core/res/res/values-sr/strings.xml4
-rw-r--r--core/res/res/values-sv/strings.xml4
-rw-r--r--core/res/res/values-sw/strings.xml4
-rw-r--r--core/res/res/values-ta/strings.xml4
-rw-r--r--core/res/res/values-te/strings.xml4
-rw-r--r--core/res/res/values-th/strings.xml4
-rw-r--r--core/res/res/values-tl/strings.xml4
-rw-r--r--core/res/res/values-tr/strings.xml4
-rw-r--r--core/res/res/values-uk/strings.xml4
-rw-r--r--core/res/res/values-ur/strings.xml4
-rw-r--r--core/res/res/values-uz/strings.xml16
-rw-r--r--core/res/res/values-vi/strings.xml4
-rw-r--r--core/res/res/values-zh-rCN/strings.xml4
-rw-r--r--core/res/res/values-zh-rHK/strings.xml4
-rw-r--r--core/res/res/values-zh-rTW/strings.xml4
-rw-r--r--core/res/res/values-zu/strings.xml4
-rw-r--r--core/res/res/values/attrs.xml5
-rw-r--r--core/res/res/values/colors.xml74
-rw-r--r--core/res/res/values/colors_device_defaults.xml12
-rw-r--r--core/res/res/values/config.xml5
-rw-r--r--core/res/res/values/ids.xml3
-rw-r--r--core/res/res/values/public.xml29
-rw-r--r--core/res/res/values/required_apps_managed_device.xml1
-rw-r--r--core/res/res/values/symbols.xml2
-rw-r--r--core/tests/coretests/src/android/app/appsearch/external/app/PutDocumentsRequestTest.java42
-rw-r--r--core/tests/coretests/src/android/app/appsearch/external/app/SearchSpecTest.java24
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java66
-rw-r--r--graphics/java/android/graphics/RecordingCanvas.java6
-rw-r--r--graphics/java/android/graphics/RenderNode.java18
-rw-r--r--graphics/java/android/graphics/fonts/FontFileUtil.java42
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java15
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java10
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java6
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java6
-rw-r--r--libs/hwui/DisplayList.h121
-rw-r--r--libs/hwui/RecordingCanvas.h7
-rw-r--r--libs/hwui/RenderNode.cpp71
-rw-r--r--libs/hwui/RenderNode.h17
-rw-r--r--libs/hwui/SkiaCanvas.h4
-rw-r--r--libs/hwui/WebViewFunctorManager.h4
-rw-r--r--libs/hwui/hwui/Canvas.h2
-rwxr-xr-xlibs/hwui/jni/Bitmap.cpp5
-rw-r--r--libs/hwui/jni/BitmapFactory.cpp2
-rw-r--r--libs/hwui/jni/GraphicsJNI.h1
-rw-r--r--libs/hwui/jni/android_graphics_DisplayListCanvas.cpp8
-rw-r--r--libs/hwui/jni/android_graphics_RenderNode.cpp15
-rw-r--r--libs/hwui/jni/fonts/Font.cpp56
-rw-r--r--libs/hwui/pipeline/skia/DumpOpsCanvas.h6
-rw-r--r--libs/hwui/pipeline/skia/RenderNodeDrawable.cpp11
-rw-r--r--libs/hwui/pipeline/skia/SkiaDisplayList.cpp2
-rw-r--r--libs/hwui/pipeline/skia/SkiaDisplayList.h2
-rw-r--r--libs/hwui/pipeline/skia/SkiaPipeline.cpp4
-rw-r--r--libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp4
-rw-r--r--libs/hwui/pipeline/skia/SkiaRecordingCanvas.h2
-rw-r--r--libs/hwui/tests/common/TestUtils.h15
-rw-r--r--libs/hwui/tests/microbench/DisplayListCanvasBench.cpp20
-rw-r--r--libs/hwui/tests/microbench/RenderNodeBench.cpp7
-rw-r--r--libs/hwui/tests/unit/RenderNodeTests.cpp2
-rw-r--r--libs/hwui/tests/unit/SkiaDisplayListTests.cpp5
-rw-r--r--location/java/android/location/CorrelationVector.java228
-rw-r--r--location/java/android/location/GnssCapabilities.java30
-rw-r--r--location/java/android/location/GnssMeasurement.java87
-rw-r--r--location/java/android/location/GnssMeasurementRequest.java50
-rw-r--r--location/java/android/location/LocationManager.java4
-rw-r--r--location/java/android/location/LocationManagerInternal.java8
-rw-r--r--media/java/android/media/MediaCodec.java22
-rw-r--r--media/java/android/media/metrics/IPlaybackMetricsManager.aidl2
-rw-r--r--media/java/android/media/metrics/PlaybackComponent.java36
-rw-r--r--media/java/android/media/metrics/PlaybackErrorEvent.aidl19
-rw-r--r--media/java/android/media/metrics/PlaybackErrorEvent.java234
-rw-r--r--media/java/android/media/metrics/PlaybackMetricsManager.java12
-rw-r--r--media/java/android/media/metrics/PlaybackSession.java7
-rw-r--r--media/java/android/media/tv/ITvInputManager.aidl2
-rw-r--r--media/java/android/media/tv/ITvInputSession.aidl2
-rw-r--r--media/java/android/media/tv/ITvInputSessionWrapper.java20
-rw-r--r--media/java/android/media/tv/TvInputInfo.java40
-rw-r--r--media/java/android/media/tv/TvInputManager.java34
-rwxr-xr-xmedia/java/android/media/tv/TvInputService.java38
-rw-r--r--media/java/android/media/tv/TvRecordingClient.java135
-rw-r--r--media/jni/tuner/FrontendClient.cpp253
-rw-r--r--media/jni/tuner/FrontendClient.h37
-rw-r--r--media/jni/tuner/TunerClient.cpp18
-rw-r--r--native/graphics/jni/corpus/webp-color-profile-lossless.webpbin0 -> 43866 bytes
-rw-r--r--native/graphics/jni/fuzz_imagedecoder.cpp8
-rw-r--r--packages/CompanionDeviceManager/res/values-af/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-am/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ar/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-as/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-az/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-be/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-bg/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-bn/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-bs/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ca/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-cs/strings.xml3
-rw-r--r--packages/CompanionDeviceManager/res/values-da/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-de/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-el/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rAU/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rCA/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rGB/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rIN/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rXC/strings.xml3
-rw-r--r--packages/CompanionDeviceManager/res/values-es-rUS/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-es/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-et/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-eu/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-fa/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-fi/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-fr/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-gl/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-gu/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-hi/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-hr/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-hu/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-hy/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-in/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-is/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-it/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-iw/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ja/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ka/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-kk/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-km/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-kn/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ko/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ky/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-lo/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-lt/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-lv/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-mk/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ml/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-mn/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-mr/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ms/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-my/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-nb/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ne/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-nl/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-or/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-pa/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-pl/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml3
-rw-r--r--packages/CompanionDeviceManager/res/values-pt/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ro/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ru/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-si/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-sk/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-sl/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-sq/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-sr/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-sv/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-sw/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ta/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-te/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-th/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-tl/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-tr/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-uk/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-ur/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-uz/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-vi/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml5
-rw-r--r--packages/CompanionDeviceManager/res/values-zu/strings.xml5
-rw-r--r--packages/InputDevices/res/values-eu/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml3
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java1
-rw-r--r--packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java1
-rw-r--r--packages/Shell/AndroidManifest.xml3
-rw-r--r--packages/SystemUI/res/layout/people_space_small_avatar_tile.xml4
-rw-r--r--packages/SystemUI/res/values-af/strings.xml6
-rw-r--r--packages/SystemUI/res/values-am/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml6
-rw-r--r--packages/SystemUI/res/values-as/strings.xml7
-rw-r--r--packages/SystemUI/res/values-az/strings.xml6
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml6
-rw-r--r--packages/SystemUI/res/values-be/strings.xml6
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml6
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml6
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml6
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml6
-rw-r--r--packages/SystemUI/res/values-da/strings.xml6
-rw-r--r--packages/SystemUI/res/values-de/strings.xml6
-rw-r--r--packages/SystemUI/res/values-el/strings.xml6
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml6
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml6
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml6
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml6
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml6
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml6
-rw-r--r--packages/SystemUI/res/values-es/strings.xml6
-rw-r--r--packages/SystemUI/res/values-et/strings.xml6
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml6
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml6
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml6
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml6
-rw-r--r--packages/SystemUI/res/values-in/strings.xml6
-rw-r--r--packages/SystemUI/res/values-is/strings.xml6
-rw-r--r--packages/SystemUI/res/values-it/strings.xml6
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml6
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml6
-rw-r--r--packages/SystemUI/res/values-km/strings.xml6
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml6
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml6
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml6
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml6
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml6
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml6
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml13
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml6
-rw-r--r--packages/SystemUI/res/values-my/strings.xml6
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml6
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-or/strings.xml7
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml13
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml6
-rw-r--r--packages/SystemUI/res/values-si/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml6
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml6
-rw-r--r--packages/SystemUI/res/values-te/strings.xml6
-rw-r--r--packages/SystemUI/res/values-th/strings.xml6
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml6
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml6
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml6
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml6
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml6
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml10
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml6
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml6
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml6
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java6
-rw-r--r--packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/ConvenienceExtensions.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java6
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java21
-rw-r--r--services/core/java/com/android/server/am/PendingIntentController.java5
-rw-r--r--services/core/java/com/android/server/am/PendingIntentRecord.java80
-rw-r--r--services/core/java/com/android/server/biometrics/Utils.java5
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java (renamed from services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java)10
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java131
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/EnumerateConsumer.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java2
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java8
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java2
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/Interruptable.java6
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java22
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java2
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/RemovalClient.java2
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/RemovalConsumer.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java2
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java6
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java44
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java46
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java39
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/Udfps.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java6
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java50
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java4
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java49
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java33
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java14
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java4
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java28
-rw-r--r--services/core/java/com/android/server/location/LocationManagerService.java36
-rw-r--r--services/core/java/com/android/server/location/LocationShellCommand.java8
-rw-r--r--services/core/java/com/android/server/location/gnss/GnssManagerService.java4
-rw-r--r--services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java25
-rw-r--r--services/core/java/com/android/server/location/gnss/hal/GnssNative.java13
-rw-r--r--services/core/java/com/android/server/location/provider/LocationProviderManager.java29
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java20
-rw-r--r--services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java18
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java6
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java49
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java21
-rw-r--r--services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java15
-rw-r--r--services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java14
-rwxr-xr-xservices/core/java/com/android/server/tv/TvInputManagerService.java40
-rw-r--r--services/core/java/com/android/server/wm/ActivityMetricsLogger.java4
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java9
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java66
-rw-r--r--services/core/java/com/android/server/wm/DisplayArea.java16
-rw-r--r--services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java5
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java31
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java6
-rw-r--r--services/core/java/com/android/server/wm/Task.java13
-rw-r--r--services/core/java/com/android/server/wm/TaskOrganizerController.java266
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimator.java1
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java68
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java24
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp6
-rw-r--r--services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp31
-rw-r--r--services/core/jni/gnss/GnssMeasurement.cpp27
-rw-r--r--services/core/jni/gnss/GnssMeasurement.h12
-rw-r--r--services/core/jni/gnss/GnssMeasurementCallback.cpp85
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java9
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt4
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java374
-rw-r--r--services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/VisibilityStoreTest.java77
-rw-r--r--services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java38
-rw-r--r--services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java4
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java16
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java41
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java10
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java197
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java109
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java28
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl2
532 files changed, 6240 insertions, 1796 deletions
diff --git a/apex/appsearch/framework/api/current.txt b/apex/appsearch/framework/api/current.txt
index ae32fba443f6..9fa4b8e5a4e7 100644
--- a/apex/appsearch/framework/api/current.txt
+++ b/apex/appsearch/framework/api/current.txt
@@ -162,7 +162,7 @@ package android.app.appsearch {
public static final class PutDocumentsRequest.Builder {
ctor public PutDocumentsRequest.Builder();
method @NonNull public android.app.appsearch.PutDocumentsRequest.Builder addGenericDocument(@NonNull android.app.appsearch.GenericDocument...);
- method @NonNull public android.app.appsearch.PutDocumentsRequest.Builder addGenericDocument(@NonNull java.util.Collection<android.app.appsearch.GenericDocument>);
+ method @NonNull public android.app.appsearch.PutDocumentsRequest.Builder addGenericDocument(@NonNull java.util.Collection<? extends android.app.appsearch.GenericDocument>);
method @NonNull public android.app.appsearch.PutDocumentsRequest build();
}
@@ -182,6 +182,7 @@ package android.app.appsearch {
public final class SearchResult {
method @NonNull public android.app.appsearch.GenericDocument getDocument();
method @NonNull public java.util.List<android.app.appsearch.SearchResult.MatchInfo> getMatches();
+ method @NonNull public String getPackageName();
}
public static final class SearchResult.MatchInfo {
@@ -204,9 +205,11 @@ package android.app.appsearch {
}
public final class SearchSpec {
+ method @NonNull public java.util.List<java.lang.String> getFilterPackageNames();
method public int getMaxSnippetSize();
method @NonNull public java.util.List<java.lang.String> getNamespaces();
method public int getOrder();
+ method @NonNull public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getProjections();
method public int getRankingStrategy();
method public int getResultCountPerPage();
method @NonNull public java.util.List<java.lang.String> getSchemaTypes();
@@ -215,17 +218,23 @@ package android.app.appsearch {
method public int getTermMatch();
field public static final int ORDER_ASCENDING = 1; // 0x1
field public static final int ORDER_DESCENDING = 0; // 0x0
+ field public static final String PROJECTION_SCHEMA_TYPE_WILDCARD = "*";
field public static final int RANKING_STRATEGY_CREATION_TIMESTAMP = 2; // 0x2
field public static final int RANKING_STRATEGY_DOCUMENT_SCORE = 1; // 0x1
field public static final int RANKING_STRATEGY_NONE = 0; // 0x0
+ field public static final int RANKING_STRATEGY_RELEVANCE_SCORE = 3; // 0x3
field public static final int TERM_MATCH_EXACT_ONLY = 1; // 0x1
field public static final int TERM_MATCH_PREFIX = 2; // 0x2
}
public static final class SearchSpec.Builder {
ctor public SearchSpec.Builder();
+ method @NonNull public android.app.appsearch.SearchSpec.Builder addFilterPackageNames(@NonNull java.lang.String...);
+ method @NonNull public android.app.appsearch.SearchSpec.Builder addFilterPackageNames(@NonNull java.util.Collection<java.lang.String>);
method @NonNull public android.app.appsearch.SearchSpec.Builder addNamespace(@NonNull java.lang.String...);
method @NonNull public android.app.appsearch.SearchSpec.Builder addNamespace(@NonNull java.util.Collection<java.lang.String>);
+ method @NonNull public android.app.appsearch.SearchSpec.Builder addProjection(@NonNull String, @NonNull java.lang.String...);
+ method @NonNull public android.app.appsearch.SearchSpec.Builder addProjection(@NonNull String, @NonNull java.util.Collection<java.lang.String>);
method @NonNull public android.app.appsearch.SearchSpec.Builder addSchemaType(@NonNull java.lang.String...);
method @NonNull public android.app.appsearch.SearchSpec.Builder addSchemaType(@NonNull java.util.Collection<java.lang.String>);
method @NonNull public android.app.appsearch.SearchSpec build();
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
index 685e5ffd59d2..a5b7080fcfba 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
@@ -28,6 +28,7 @@ import com.android.internal.infra.AndroidFuture;
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -234,6 +235,7 @@ public class AppSearchManager {
DEFAULT_DATABASE_NAME,
schemaBundles,
new ArrayList<>(request.getSchemasNotVisibleToSystemUi()),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
request.isForceOverride(),
mContext.getUserId(),
new IAppSearchResultCallback.Stub() {
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
index d628fb514272..d4872e815134 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
@@ -22,6 +22,7 @@ import android.annotation.UserIdInt;
import android.os.Bundle;
import android.os.ParcelableException;
import android.os.RemoteException;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
@@ -161,11 +162,22 @@ public final class AppSearchSession {
for (AppSearchSchema schema : request.getSchemas()) {
schemaBundles.add(schema.getBundle());
}
+ Map<String, List<Bundle>> schemasPackageAccessibleBundles =
+ new ArrayMap<>(request.getSchemasVisibleToPackagesInternal().size());
+ for (Map.Entry<String, Set<PackageIdentifier>> entry :
+ request.getSchemasVisibleToPackagesInternal().entrySet()) {
+ List<Bundle> packageIdentifierBundles = new ArrayList<>(entry.getValue().size());
+ for (PackageIdentifier packageIdentifier : entry.getValue()) {
+ packageIdentifierBundles.add(packageIdentifier.getBundle());
+ }
+ schemasPackageAccessibleBundles.put(entry.getKey(), packageIdentifierBundles);
+ }
try {
mService.setSchema(
mDatabaseName,
schemaBundles,
new ArrayList<>(request.getSchemasNotVisibleToSystemUi()),
+ schemasPackageAccessibleBundles,
request.isForceOverride(),
mUserId,
new IAppSearchResultCallback.Stub() {
diff --git a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
index af8b6132bb7e..2b437774b473 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
+++ b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
@@ -34,6 +34,8 @@ interface IAppSearchManager {
* @param schemaBundles List of {@link AppSearchSchema} bundles.
* @param schemasNotPlatformSurfaceable Schema types that should not be surfaced on platform
* surfaces.
+ * @param schemasPackageAccessibleBundles Schema types that are visible to the specified
+ * packages. The value List contains PackageIdentifier Bundles.
* @param forceOverride Whether to apply the new schema even if it is incompatible. All
* incompatible documents will be deleted.
* @param userId Id of the calling user
@@ -44,11 +46,11 @@ interface IAppSearchManager {
in String databaseName,
in List<Bundle> schemaBundles,
in List<String> schemasNotPlatformSurfaceable,
+ in Map<String, List<Bundle>> schemasPackageAccessibleBundles,
boolean forceOverride,
in int userId,
in IAppSearchResultCallback callback);
-
/**
* Retrieves the AppSearch schema for this database.
*
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/PackageIdentifier.java b/apex/appsearch/framework/java/external/android/app/appsearch/PackageIdentifier.java
index 43be442bd4dc..bfb9323047c8 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/PackageIdentifier.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/PackageIdentifier.java
@@ -17,16 +17,17 @@
package android.app.appsearch;
import android.annotation.NonNull;
+import android.app.appsearch.util.BundleUtil;
+import android.os.Bundle;
import com.android.internal.util.Preconditions;
-import java.util.Arrays;
-import java.util.Objects;
-
/** This class represents a uniquely identifiable package. */
public class PackageIdentifier {
- private final String mPackageName;
- private final byte[] mSha256Certificate;
+ private static final String PACKAGE_NAME_FIELD = "packageName";
+ private static final String SHA256_CERTIFICATE_FIELD = "sha256Certificate";
+
+ private final Bundle mBundle;
/**
* Creates a unique identifier for a package.
@@ -35,18 +36,30 @@ public class PackageIdentifier {
* @param sha256Certificate SHA256 certificate digest of the package.
*/
public PackageIdentifier(@NonNull String packageName, @NonNull byte[] sha256Certificate) {
- mPackageName = Preconditions.checkNotNull(packageName);
- mSha256Certificate = Preconditions.checkNotNull(sha256Certificate);
+ mBundle = new Bundle();
+ mBundle.putString(PACKAGE_NAME_FIELD, packageName);
+ mBundle.putByteArray(SHA256_CERTIFICATE_FIELD, sha256Certificate);
+ }
+
+ /** @hide */
+ public PackageIdentifier(@NonNull Bundle bundle) {
+ mBundle = Preconditions.checkNotNull(bundle);
+ }
+
+ /** @hide */
+ @NonNull
+ public Bundle getBundle() {
+ return mBundle;
}
@NonNull
public String getPackageName() {
- return mPackageName;
+ return Preconditions.checkNotNull(mBundle.getString(PACKAGE_NAME_FIELD));
}
@NonNull
public byte[] getSha256Certificate() {
- return mSha256Certificate;
+ return Preconditions.checkNotNull(mBundle.getByteArray(SHA256_CERTIFICATE_FIELD));
}
@Override
@@ -58,12 +71,11 @@ public class PackageIdentifier {
return false;
}
final PackageIdentifier other = (PackageIdentifier) obj;
- return this.mPackageName.equals(other.mPackageName)
- && Arrays.equals(this.mSha256Certificate, other.mSha256Certificate);
+ return BundleUtil.deepEquals(mBundle, other.mBundle);
}
@Override
public int hashCode() {
- return Objects.hash(mPackageName, Arrays.hashCode(mSha256Certificate));
+ return BundleUtil.deepHashCode(mBundle);
}
}
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/PutDocumentsRequest.java b/apex/appsearch/framework/java/external/android/app/appsearch/PutDocumentsRequest.java
index b9503eed153c..0f141d6bc6e2 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/PutDocumentsRequest.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/PutDocumentsRequest.java
@@ -30,7 +30,7 @@ import java.util.List;
/**
* Encapsulates a request to index a document into an {@link AppSearchSession} database.
*
- * @see AppSearchSession#putDocuments
+ * <p>@see AppSearchSession#putDocuments
*/
public final class PutDocumentsRequest {
private final List<GenericDocument> mDocuments;
@@ -45,12 +45,16 @@ public final class PutDocumentsRequest {
return Collections.unmodifiableList(mDocuments);
}
- /** Builder for {@link PutDocumentsRequest} objects. */
+ /**
+ * Builder for {@link PutDocumentsRequest} objects.
+ *
+ * <p>Once {@link #build} is called, the instance can no longer be used.
+ */
public static final class Builder {
private final List<GenericDocument> mDocuments = new ArrayList<>();
private boolean mBuilt = false;
- /** Adds one or more documents to the request. */
+ /** Adds one or more {@link GenericDocument} objects to the request. */
@SuppressLint("MissingGetterMatchingBuilder") // Merged list available from getDocuments()
@NonNull
public Builder addGenericDocument(@NonNull GenericDocument... documents) {
@@ -58,17 +62,18 @@ public final class PutDocumentsRequest {
return addGenericDocument(Arrays.asList(documents));
}
- /** Adds one or more documents to the request. */
+ /** Adds a collection of {@link GenericDocument} objects to the request. */
@SuppressLint("MissingGetterMatchingBuilder") // Merged list available from getDocuments()
@NonNull
- public Builder addGenericDocument(@NonNull Collection<GenericDocument> documents) {
+ public Builder addGenericDocument(
+ @NonNull Collection<? extends GenericDocument> documents) {
Preconditions.checkState(!mBuilt, "Builder has already been used");
Preconditions.checkNotNull(documents);
mDocuments.addAll(documents);
return this;
}
- /** Builds a new {@link PutDocumentsRequest}. */
+ /** Creates a new {@link PutDocumentsRequest} object. */
@NonNull
public PutDocumentsRequest build() {
Preconditions.checkState(!mBuilt, "Builder has already been used");
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java b/apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java
index eb0b7324a117..4931cc026466 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java
@@ -109,10 +109,9 @@ public final class SearchResult {
}
/**
- * Contains the package name that stored the {@link GenericDocument}.
+ * Contains the package name of the app that stored the {@link GenericDocument}.
*
* @return Package name that stored the document
- * @hide
*/
@NonNull
public String getPackageName() {
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java b/apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java
index c3f0d8ab53e3..b5d5f04dfae7 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java
@@ -19,6 +19,7 @@ package android.app.appsearch;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
+import android.annotation.SuppressLint;
import android.app.appsearch.exceptions.IllegalSearchSpecException;
import android.os.Bundle;
import android.util.ArrayMap;
@@ -42,17 +43,15 @@ import java.util.Set;
// TODO(sidchhabra) : AddResultSpec fields for Snippets etc.
public final class SearchSpec {
/**
- * Schema type to be used in {@link SearchSpec.Builder#addProjectionTypePropertyPath} to apply
- * property paths to all results, excepting any types that have had their own, specific property
- * paths set.
- *
- * @hide
+ * Schema type to be used in {@link SearchSpec.Builder#addProjection} to apply property paths to
+ * all results, excepting any types that have had their own, specific property paths set.
*/
public static final String PROJECTION_SCHEMA_TYPE_WILDCARD = "*";
static final String TERM_MATCH_TYPE_FIELD = "termMatchType";
static final String SCHEMA_TYPE_FIELD = "schemaType";
static final String NAMESPACE_FIELD = "namespace";
+ static final String PACKAGE_NAME_FIELD = "packageName";
static final String NUM_PER_PAGE_FIELD = "numPerPage";
static final String RANKING_STRATEGY_FIELD = "rankingStrategy";
static final String ORDER_FIELD = "order";
@@ -106,7 +105,8 @@ public final class SearchSpec {
value = {
RANKING_STRATEGY_NONE,
RANKING_STRATEGY_DOCUMENT_SCORE,
- RANKING_STRATEGY_CREATION_TIMESTAMP
+ RANKING_STRATEGY_CREATION_TIMESTAMP,
+ RANKING_STRATEGY_RELEVANCE_SCORE
})
@Retention(RetentionPolicy.SOURCE)
public @interface RankingStrategy {}
@@ -117,6 +117,8 @@ public final class SearchSpec {
public static final int RANKING_STRATEGY_DOCUMENT_SCORE = 1;
/** Ranked by document creation timestamps. */
public static final int RANKING_STRATEGY_CREATION_TIMESTAMP = 2;
+ /** Ranked by document relevance score. */
+ public static final int RANKING_STRATEGY_RELEVANCE_SCORE = 3;
/**
* Order for query result.
@@ -172,7 +174,7 @@ public final class SearchSpec {
}
/**
- * Returns the list of namespaces to search for.
+ * Returns the list of namespaces to search over.
*
* <p>If empty, the query will search over all namespaces.
*/
@@ -185,6 +187,40 @@ public final class SearchSpec {
return Collections.unmodifiableList(namespaces);
}
+ /**
+ * Returns the list of package name filters to search over.
+ *
+ * <p>If empty, the query will search over all packages that the caller has access to. If
+ * package names are specified which caller doesn't have access to, then those package names
+ * will be ignored.
+ */
+ @NonNull
+ public List<String> getFilterPackageNames() {
+ List<String> packageNames = mBundle.getStringArrayList(PACKAGE_NAME_FIELD);
+ if (packageNames == null) {
+ return Collections.emptyList();
+ }
+ return Collections.unmodifiableList(packageNames);
+ }
+
+ /**
+ * Returns the list of package names to search over.
+ *
+ * <p>If unset, the query will search over all packages that the caller has access to. If
+ * package names are specified which caller doesn't have access to, then those package names
+ * will be ignored.
+ *
+ * @hide
+ */
+ @NonNull
+ public List<String> getPackageNames() {
+ List<String> packageNames = mBundle.getStringArrayList(PACKAGE_NAME_FIELD);
+ if (packageNames == null) {
+ return Collections.emptyList();
+ }
+ return Collections.unmodifiableList(packageNames);
+ }
+
/** Returns the number of results per page in the result set. */
public int getResultCountPerPage() {
return mBundle.getInt(NUM_PER_PAGE_FIELD, DEFAULT_NUM_PER_PAGE);
@@ -224,11 +260,9 @@ public final class SearchSpec {
*
* <p>Calling this function repeatedly is inefficient. Prefer to retain the Map returned by this
* function, rather than calling it multiple times.
- *
- * @hide
*/
@NonNull
- public Map<String, List<String>> getProjectionTypePropertyPaths() {
+ public Map<String, List<String>> getProjections() {
Bundle typePropertyPathsBundle = mBundle.getBundle(PROJECTION_TYPE_PROPERTY_PATHS_FIELD);
Set<String> schemaTypes = typePropertyPathsBundle.keySet();
Map<String, List<String>> typePropertyPathsMap = new ArrayMap<>(schemaTypes.size());
@@ -245,6 +279,7 @@ public final class SearchSpec {
private final Bundle mBundle;
private final ArrayList<String> mSchemaTypes = new ArrayList<>();
private final ArrayList<String> mNamespaces = new ArrayList<>();
+ private final ArrayList<String> mPackageNames = new ArrayList<>();
private final Bundle mProjectionTypePropertyMasks = new Bundle();
private boolean mBuilt = false;
@@ -319,6 +354,43 @@ public final class SearchSpec {
}
/**
+ * Adds a package name filter to {@link SearchSpec} Entry. Only search for documents that
+ * were indexed from the specified packages.
+ *
+ * <p>If unset, the query will search over all packages that the caller has access to. If
+ * package names are specified which caller doesn't have access to, then those package names
+ * will be ignored.
+ */
+ // Getter is called "getFilterPackageNames" (as opposed to the suggested
+ // "getFilterPackageNameses")
+ @SuppressLint("MissingGetterMatchingBuilder")
+ @NonNull
+ public Builder addFilterPackageNames(@NonNull String... packageNames) {
+ Preconditions.checkNotNull(packageNames);
+ Preconditions.checkState(!mBuilt, "Builder has already been used");
+ return addFilterPackageNames(Arrays.asList(packageNames));
+ }
+
+ /**
+ * Adds a package name filter to {@link SearchSpec} Entry. Only search for documents that
+ * were indexed from the specified packages.
+ *
+ * <p>If unset, the query will search over all packages that the caller has access to. If
+ * package names are specified which caller doesn't have access to, then those package names
+ * will be ignored.
+ */
+ // Getter is called "getFilterPackageNames" (as opposed to the suggested
+ // "getFilterPackageNameses")
+ @SuppressLint("MissingGetterMatchingBuilder")
+ @NonNull
+ public Builder addFilterPackageNames(@NonNull Collection<String> packageNames) {
+ Preconditions.checkNotNull(packageNames);
+ Preconditions.checkState(!mBuilt, "Builder has already been used");
+ mPackageNames.addAll(packageNames);
+ return this;
+ }
+
+ /**
* Sets the number of results per page in the returned object.
*
* <p>The default number of results per page is 10.
@@ -339,7 +411,7 @@ public final class SearchSpec {
Preconditions.checkArgumentInRange(
rankingStrategy,
RANKING_STRATEGY_NONE,
- RANKING_STRATEGY_CREATION_TIMESTAMP,
+ RANKING_STRATEGY_RELEVANCE_SCORE,
"Result ranking strategy");
mBundle.putInt(RANKING_STRATEGY_FIELD, rankingStrategy);
return this;
@@ -480,14 +552,12 @@ public final class SearchSpec {
* subject: "IMPORTANT"
* }
* }</pre>
- *
- * @hide
*/
@NonNull
- public SearchSpec.Builder addProjectionTypePropertyPaths(
+ public SearchSpec.Builder addProjection(
@NonNull String schemaType, @NonNull String... propertyPaths) {
Preconditions.checkNotNull(propertyPaths);
- return addProjectionTypePropertyPaths(schemaType, Arrays.asList(propertyPaths));
+ return addProjection(schemaType, Arrays.asList(propertyPaths));
}
/**
@@ -503,12 +573,10 @@ public final class SearchSpec {
* then those property paths will apply to all results, excepting any types that have their
* own, specific property paths set.
*
- * <p>{@see SearchSpec.Builder#addProjectionTypePropertyPath(String, String...)}
- *
- * @hide
+ * <p>{@see SearchSpec.Builder#addProjection(String, String...)}
*/
@NonNull
- public SearchSpec.Builder addProjectionTypePropertyPaths(
+ public SearchSpec.Builder addProjection(
@NonNull String schemaType, @NonNull Collection<String> propertyPaths) {
Preconditions.checkState(!mBuilt, "Builder has already been used");
Preconditions.checkNotNull(schemaType);
@@ -535,6 +603,7 @@ public final class SearchSpec {
}
mBundle.putStringArrayList(NAMESPACE_FIELD, mNamespaces);
mBundle.putStringArrayList(SCHEMA_TYPE_FIELD, mSchemaTypes);
+ mBundle.putStringArrayList(PACKAGE_NAME_FIELD, mPackageNames);
mBundle.putBundle(PROJECTION_TYPE_PROPERTY_PATHS_FIELD, mProjectionTypePropertyMasks);
mBuilt = true;
return new SearchSpec(mBundle);
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
index 87c41e53dc63..1f1e9a1a28a8 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
@@ -27,6 +27,7 @@ import android.app.appsearch.GenericDocument;
import android.app.appsearch.IAppSearchBatchResultCallback;
import android.app.appsearch.IAppSearchManager;
import android.app.appsearch.IAppSearchResultCallback;
+import android.app.appsearch.PackageIdentifier;
import android.app.appsearch.SearchResultPage;
import android.app.appsearch.SearchSpec;
import android.content.Context;
@@ -34,6 +35,7 @@ import android.os.Binder;
import android.os.Bundle;
import android.os.ParcelableException;
import android.os.RemoteException;
+import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.util.Preconditions;
@@ -42,6 +44,7 @@ import com.android.server.appsearch.external.localstorage.AppSearchImpl;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* TODO(b/142567528): add comments when implement this class
@@ -64,6 +67,7 @@ public class AppSearchManagerService extends SystemService {
@NonNull String databaseName,
@NonNull List<Bundle> schemaBundles,
@NonNull List<String> schemasNotPlatformSurfaceable,
+ @NonNull Map<String, List<Bundle>> schemasPackageAccessibleBundles,
boolean forceOverride,
@UserIdInt int userId,
@NonNull IAppSearchResultCallback callback) {
@@ -78,9 +82,25 @@ public class AppSearchManagerService extends SystemService {
for (int i = 0; i < schemaBundles.size(); i++) {
schemas.add(new AppSearchSchema(schemaBundles.get(i)));
}
+ Map<String, List<PackageIdentifier>> schemasPackageAccessible =
+ new ArrayMap<>(schemasPackageAccessibleBundles.size());
+ for (Map.Entry<String, List<Bundle>> entry :
+ schemasPackageAccessibleBundles.entrySet()) {
+ List<PackageIdentifier> packageIdentifiers =
+ new ArrayList<>(entry.getValue().size());
+ for (int i = 0; i < packageIdentifiers.size(); i++) {
+ packageIdentifiers.add(new PackageIdentifier(entry.getValue().get(i)));
+ }
+ schemasPackageAccessible.put(entry.getKey(), packageIdentifiers);
+ }
AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
String packageName = convertUidToPackageName(callingUid);
- impl.setSchema(packageName, databaseName, schemas, schemasNotPlatformSurfaceable,
+ impl.setSchema(
+ packageName,
+ databaseName,
+ schemas,
+ schemasNotPlatformSurfaceable,
+ schemasPackageAccessible,
forceOverride);
invokeCallbackOnResult(callback,
AppSearchResult.newSuccessfulResult(/*result=*/ null));
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
index a2126b19d31e..b75492629a2a 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
@@ -21,10 +21,12 @@ import android.annotation.WorkerThread;
import android.app.appsearch.AppSearchResult;
import android.app.appsearch.AppSearchSchema;
import android.app.appsearch.GenericDocument;
+import android.app.appsearch.PackageIdentifier;
import android.app.appsearch.SearchResultPage;
import android.app.appsearch.SearchSpec;
import android.app.appsearch.exceptions.AppSearchException;
import android.os.Bundle;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
@@ -230,6 +232,7 @@ public final class AppSearchImpl {
* @param schemas Schemas to set for this app.
* @param schemasNotPlatformSurfaceable Schema types that should not be surfaced on platform
* surfaces.
+ * @param schemasPackageAccessible Schema types that are visible to the specified packages.
* @param forceOverride Whether to force-apply the schema even if it is incompatible. Documents
* which do not comply with the new schema will be deleted.
* @throws AppSearchException on IcingSearchEngine error.
@@ -239,6 +242,7 @@ public final class AppSearchImpl {
@NonNull String databaseName,
@NonNull List<AppSearchSchema> schemas,
@NonNull List<String> schemasNotPlatformSurfaceable,
+ @NonNull Map<String, List<PackageIdentifier>> schemasPackageAccessible,
boolean forceOverride)
throws AppSearchException {
mReadWriteLock.writeLock().lock();
@@ -291,7 +295,18 @@ public final class AppSearchImpl {
prefixedSchemasNotPlatformSurfaceable.add(
prefix + schemasNotPlatformSurfaceable.get(i));
}
- mVisibilityStoreLocked.setVisibility(prefix, prefixedSchemasNotPlatformSurfaceable);
+
+ Map<String, List<PackageIdentifier>> prefixedSchemasPackageAccessible =
+ new ArrayMap<>(schemasNotPlatformSurfaceable.size());
+ for (Map.Entry<String, List<PackageIdentifier>> entry :
+ schemasPackageAccessible.entrySet()) {
+ prefixedSchemasPackageAccessible.put(prefix + entry.getKey(), entry.getValue());
+ }
+
+ mVisibilityStoreLocked.setVisibility(
+ prefix,
+ prefixedSchemasNotPlatformSurfaceable,
+ prefixedSchemasPackageAccessible);
// Determine whether to schedule an immediate optimize.
if (setSchemaResultProto.getDeletedSchemaTypesCount() > 0
@@ -448,6 +463,13 @@ public final class AppSearchImpl {
@NonNull String queryExpression,
@NonNull SearchSpec searchSpec)
throws AppSearchException {
+ if (!searchSpec.getPackageNames().isEmpty()
+ && !searchSpec.getPackageNames().contains(packageName)) {
+ // Client wanted to query over some packages that weren't its own. This isn't
+ // allowed through local query so we can return early with no results.
+ return new SearchResultPage(Bundle.EMPTY);
+ }
+
mReadWriteLock.readLock().lock();
try {
return doQueryLocked(
@@ -480,13 +502,25 @@ public final class AppSearchImpl {
// verified.
mReadWriteLock.readLock().lock();
try {
- // We use the mNamespaceMap.keySet here because it's the smaller set of valid prefixes
- // that could exist.
- Set<String> prefixes = mNamespaceMapLocked.keySet();
+ Set<String> prefixes = new ArraySet<>();
+ Set<String> packageFilters = new ArraySet<>(searchSpec.getPackageNames());
+
+ for (String prefix : mNamespaceMapLocked.keySet()) {
+ if (prefix.equals(VisibilityStore.VISIBILITY_STORE_PREFIX)) {
+ // Filter out any VisibilityStore documents which are AppSearch-internal only.
+ continue;
+ }
+
+ if (!packageFilters.isEmpty() && !packageFilters.contains(getPackageName(prefix))) {
+ // Client wanted to restrict search over specified packages. Since the
+ // specified packages don't include this prefix, don't add it to our search
+ // filters.
+ continue;
+ }
- // Filter out any VisibilityStore documents which are AppSearch-internal only.
- prefixes.remove(
- createPrefix(VisibilityStore.PACKAGE_NAME, VisibilityStore.DATABASE_NAME));
+ // Otherwise, include this prefix in our global search.
+ prefixes.add(prefix);
+ }
return doQueryLocked(prefixes, queryExpression, searchSpec);
} finally {
@@ -500,22 +534,30 @@ public final class AppSearchImpl {
@NonNull String queryExpression,
@NonNull SearchSpec searchSpec)
throws AppSearchException {
- SearchSpecProto searchSpecProto = SearchSpecToProtoConverter.toSearchSpecProto(searchSpec);
SearchSpecProto.Builder searchSpecBuilder =
- searchSpecProto.toBuilder().setQuery(queryExpression);
-
- ResultSpecProto resultSpec = SearchSpecToProtoConverter.toResultSpecProto(searchSpec);
- ScoringSpecProto scoringSpec = SearchSpecToProtoConverter.toScoringSpecProto(searchSpec);
- SearchResultProto searchResultProto;
-
+ SearchSpecToProtoConverter.toSearchSpecProto(searchSpec).toBuilder()
+ .setQuery(queryExpression);
// rewriteSearchSpecForPrefixesLocked will return false if none of the prefixes that the
// client is trying to search on exist, so we can return an empty SearchResult and skip
// sending request to Icing.
if (!rewriteSearchSpecForPrefixesLocked(searchSpecBuilder, prefixes)) {
return new SearchResultPage(Bundle.EMPTY);
}
- searchResultProto =
- mIcingSearchEngineLocked.search(searchSpecBuilder.build(), scoringSpec, resultSpec);
+
+ ResultSpecProto.Builder resultSpecBuilder =
+ SearchSpecToProtoConverter.toResultSpecProto(searchSpec).toBuilder();
+
+ // rewriteResultSpecForPrefixesLocked will return false if none of the prefixes that the
+ // client is trying to search on exist, so we can return an empty SearchResult and skip
+ // sending request to Icing.
+ if (!rewriteResultSpecForPrefixesLocked(resultSpecBuilder, prefixes)) {
+ return new SearchResultPage(Bundle.EMPTY);
+ }
+
+ ScoringSpecProto scoringSpec = SearchSpecToProtoConverter.toScoringSpecProto(searchSpec);
+ SearchResultProto searchResultProto =
+ mIcingSearchEngineLocked.search(
+ searchSpecBuilder.build(), scoringSpec, resultSpecBuilder.build());
checkSuccess(searchResultProto.getStatus());
return rewriteSearchResultProto(searchResultProto);
@@ -607,6 +649,14 @@ public final class AppSearchImpl {
@NonNull String queryExpression,
@NonNull SearchSpec searchSpec)
throws AppSearchException {
+ if (!searchSpec.getPackageNames().isEmpty()
+ && !searchSpec.getPackageNames().contains(packageName)) {
+ // We're only removing documents within the parameter `packageName`. If we're not
+ // restricting our remove-query to this package name, then there's nothing for us to
+ // remove.
+ return;
+ }
+
SearchSpecProto searchSpecProto = SearchSpecToProtoConverter.toSearchSpecProto(searchSpec);
SearchSpecProto.Builder searchSpecBuilder =
searchSpecProto.toBuilder().setQuery(queryExpression);
@@ -915,6 +965,47 @@ public final class AppSearchImpl {
return true;
}
+ /**
+ * Rewrites the typePropertyMasks that exist in {@code prefixes}.
+ *
+ * <p>This method should be only called in query methods and get the READ lock to keep thread
+ * safety.
+ *
+ * @return false if none of the requested prefixes exist.
+ */
+ @VisibleForTesting
+ @GuardedBy("mReadWriteLock")
+ boolean rewriteResultSpecForPrefixesLocked(
+ @NonNull ResultSpecProto.Builder resultSpecBuilder, @NonNull Set<String> prefixes) {
+ // Create a copy since retainAll() modifies the original set.
+ Set<String> existingPrefixes = new ArraySet<>(mNamespaceMapLocked.keySet());
+ existingPrefixes.retainAll(prefixes);
+
+ if (existingPrefixes.isEmpty()) {
+ // None of the prefixes exist, empty query.
+ return false;
+ }
+
+ List<ResultSpecProto.TypePropertyMask> prefixedTypePropertyMasks = new ArrayList<>();
+ // Rewrite filters to include a database prefix.
+ for (String prefix : existingPrefixes) {
+ Set<String> existingSchemaTypes = mSchemaMapLocked.get(prefix);
+ // Qualify the given schema types
+ for (ResultSpecProto.TypePropertyMask typePropertyMask :
+ resultSpecBuilder.getTypePropertyMasksList()) {
+ String qualifiedType = prefix + typePropertyMask.getSchemaType();
+ if (existingSchemaTypes.contains(qualifiedType)) {
+ prefixedTypePropertyMasks.add(
+ typePropertyMask.toBuilder().setSchemaType(qualifiedType).build());
+ }
+ }
+ }
+ resultSpecBuilder
+ .clearTypePropertyMasks()
+ .addAllTypePropertyMasks(prefixedTypePropertyMasks);
+ return true;
+ }
+
@VisibleForTesting
@GuardedBy("mReadWriteLock")
SchemaProto getSchemaProtoLocked() throws AppSearchException {
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/VisibilityStore.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/VisibilityStore.java
index 7e4ebb51c388..a940ec10b44d 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/VisibilityStore.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/VisibilityStore.java
@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.app.appsearch.AppSearchResult;
import android.app.appsearch.AppSearchSchema;
import android.app.appsearch.GenericDocument;
+import android.app.appsearch.PackageIdentifier;
import android.app.appsearch.exceptions.AppSearchException;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -27,19 +28,21 @@ import android.util.ArraySet;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
/**
- * Manages any visibility settings for all the databases that AppSearchImpl knows about. Persists
- * the visibility settings and reloads them on initialization.
+ * Manages any visibility settings for all the package's databases that AppSearchImpl knows about.
+ * Persists the visibility settings and reloads them on initialization.
*
- * <p>The VisibilityStore creates a document for each database. This document holds the visibility
- * settings that apply to that database. The VisibilityStore also creates a schema for these
- * documents and has its own database so that its data doesn't interfere with any clients' data. It
- * persists the document and schema through AppSearchImpl.
+ * <p>The VisibilityStore creates a document for each package's databases. This document holds the
+ * visibility settings that apply to that package's database. The VisibilityStore also creates a
+ * schema for these documents and has its own package and database so that its data doesn't
+ * interfere with any clients' data. It persists the document and schema through AppSearchImpl.
*
* <p>These visibility settings are used to ensure AppSearch queries respect the clients' settings
* on who their data is visible to.
@@ -52,18 +55,31 @@ import java.util.Set;
*/
class VisibilityStore {
/** Schema type for documents that hold AppSearch's metadata, e.g. visibility settings */
- @VisibleForTesting static final String SCHEMA_TYPE = "Visibility";
+ @VisibleForTesting static final String VISIBILITY_TYPE = "VisibilityType";
/**
* Property that holds the list of platform-hidden schemas, as part of the visibility settings.
*/
- @VisibleForTesting
- static final String NOT_PLATFORM_SURFACEABLE_PROPERTY = "notPlatformSurfaceable";
+ private static final String NOT_PLATFORM_SURFACEABLE_PROPERTY = "notPlatformSurfaceable";
- /** Schema for the VisibilityStore's docuemnts. */
- @VisibleForTesting
- static final AppSearchSchema SCHEMA =
- new AppSearchSchema.Builder(SCHEMA_TYPE)
+ /** Property that holds nested documents of package accessible schemas. */
+ private static final String PACKAGE_ACCESSIBLE_PROPERTY = "packageAccessible";
+
+ /** Schema type for nested documents that hold package accessible information. */
+ private static final String PACKAGE_ACCESSIBLE_TYPE = "PackageAccessibleType";
+
+ /** Property that holds the package name that can access a schema. */
+ private static final String PACKAGE_NAME_PROPERTY = "packageName";
+
+ /** Property that holds the SHA 256 certificate of the app that can access a schema. */
+ private static final String SHA_256_CERT_PROPERTY = "sha256Cert";
+
+ /** Property that holds the prefixed schema type that is accessible by some package. */
+ private static final String ACCESSIBLE_SCHEMA_PROPERTY = "accessibleSchema";
+
+ /** Schema for the VisibilityStore's documents. */
+ private static final AppSearchSchema VISIBILITY_SCHEMA =
+ new AppSearchSchema.Builder(VISIBILITY_TYPE)
.addProperty(
new AppSearchSchema.PropertyConfig.Builder(
NOT_PLATFORM_SURFACEABLE_PROPERTY)
@@ -71,6 +87,39 @@ class VisibilityStore {
.setCardinality(
AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
.build())
+ .addProperty(
+ new AppSearchSchema.PropertyConfig.Builder(PACKAGE_ACCESSIBLE_PROPERTY)
+ .setDataType(AppSearchSchema.PropertyConfig.DATA_TYPE_DOCUMENT)
+ .setSchemaType(PACKAGE_ACCESSIBLE_TYPE)
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
+ .build())
+ .build();
+
+ /**
+ * Schema for package accessible documents, these will be nested in a top-level visibility
+ * document.
+ */
+ private static final AppSearchSchema PACKAGE_ACCESSIBLE_SCHEMA =
+ new AppSearchSchema.Builder(PACKAGE_ACCESSIBLE_TYPE)
+ .addProperty(
+ new AppSearchSchema.PropertyConfig.Builder(PACKAGE_NAME_PROPERTY)
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+ .setDataType(AppSearchSchema.PropertyConfig.DATA_TYPE_STRING)
+ .build())
+ .addProperty(
+ new AppSearchSchema.PropertyConfig.Builder(SHA_256_CERT_PROPERTY)
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+ .setDataType(AppSearchSchema.PropertyConfig.DATA_TYPE_BYTES)
+ .build())
+ .addProperty(
+ new AppSearchSchema.PropertyConfig.Builder(ACCESSIBLE_SCHEMA_PROPERTY)
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+ .setDataType(AppSearchSchema.PropertyConfig.DATA_TYPE_STRING)
+ .build())
.build();
/**
@@ -86,7 +135,7 @@ class VisibilityStore {
* database name. Tracked here to tell when we're looking at our own prefix when looking through
* AppSearchImpl.
*/
- private static final String VISIBILITY_STORE_PREFIX =
+ static final String VISIBILITY_STORE_PREFIX =
AppSearchImpl.createPrefix(PACKAGE_NAME, DATABASE_NAME);
/** Namespace of documents that contain visibility settings */
@@ -102,10 +151,23 @@ class VisibilityStore {
/**
* Maps prefixes to the set of schemas that are platform-hidden within that prefix. All schemas
* in the map are prefixed.
+ *
+ * <p>Although the prefix key isn't used for lookup, it's helpful in ensuring that all previous
+ * visibility settings for a prefix are completely overridden by new visibility settings.
*/
private final Map<String, Set<String>> mNotPlatformSurfaceableMap = new ArrayMap<>();
/**
+ * Maps prefixes to a an internal map. The internal map maps prefixed schemas to the set of
+ * PackageIdentifiers that have access to that schema.
+ *
+ * <p>Although the prefix key isn't used for lookup, it's helpful in ensuring that all previous
+ * visibility settings for a prefix are completely overridden by new visibility settings.
+ */
+ private final Map<String, Map<String, Set<PackageIdentifier>>> mPackageAccessibleMap =
+ new ArrayMap<>();
+
+ /**
* Creates an uninitialized VisibilityStore object. Callers must also call {@link #initialize()}
* before using the object.
*
@@ -120,19 +182,22 @@ class VisibilityStore {
*
* <p>This is kept separate from the constructor because this will call methods on
* AppSearchImpl. Some may even then recursively call back into VisibilityStore (for example,
- * {@link AppSearchImpl#setSchema} will call {@link #setVisibility(String, Set)}. We need to
- * have both AppSearchImpl and VisibilityStore fully initialized for this call flow to work.
+ * {@link AppSearchImpl#setSchema} will call {@link #setVisibility}. We need to have both
+ * AppSearchImpl and VisibilityStore fully initialized for this call flow to work.
*
* @throws AppSearchException AppSearchException on AppSearchImpl error.
*/
public void initialize() throws AppSearchException {
- if (!mAppSearchImpl.hasSchemaTypeLocked(PACKAGE_NAME, DATABASE_NAME, SCHEMA_TYPE)) {
+ if (!mAppSearchImpl.hasSchemaTypeLocked(PACKAGE_NAME, DATABASE_NAME, VISIBILITY_TYPE)
+ || !mAppSearchImpl.hasSchemaTypeLocked(
+ PACKAGE_NAME, DATABASE_NAME, PACKAGE_ACCESSIBLE_TYPE)) {
// Schema type doesn't exist yet. Add it.
mAppSearchImpl.setSchema(
PACKAGE_NAME,
DATABASE_NAME,
- Collections.singletonList(SCHEMA),
+ Arrays.asList(VISIBILITY_SCHEMA, PACKAGE_ACCESSIBLE_SCHEMA),
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
}
@@ -153,9 +218,41 @@ class VisibilityStore {
NAMESPACE,
/*uri=*/ addUriPrefix(prefix));
+ // Update platform visibility settings
String[] schemas =
document.getPropertyStringArray(NOT_PLATFORM_SURFACEABLE_PROPERTY);
- mNotPlatformSurfaceableMap.put(prefix, new ArraySet<>(Arrays.asList(schemas)));
+ if (schemas != null) {
+ mNotPlatformSurfaceableMap.put(prefix, new ArraySet<>(Arrays.asList(schemas)));
+ }
+
+ // Update 3p package visibility settings
+ Map<String, Set<PackageIdentifier>> schemaToPackageIdentifierMap = new ArrayMap<>();
+ GenericDocument[] packageAccessibleDocuments =
+ document.getPropertyDocumentArray(PACKAGE_ACCESSIBLE_PROPERTY);
+ if (packageAccessibleDocuments != null) {
+ for (int i = 0; i < packageAccessibleDocuments.length; i++) {
+ String packageName =
+ packageAccessibleDocuments[i].getPropertyString(
+ PACKAGE_NAME_PROPERTY);
+ byte[] sha256Cert =
+ packageAccessibleDocuments[i].getPropertyBytes(
+ SHA_256_CERT_PROPERTY);
+ PackageIdentifier packageIdentifier =
+ new PackageIdentifier(packageName, sha256Cert);
+
+ String prefixedSchema =
+ packageAccessibleDocuments[i].getPropertyString(
+ ACCESSIBLE_SCHEMA_PROPERTY);
+ Set<PackageIdentifier> packageIdentifiers =
+ schemaToPackageIdentifierMap.get(prefixedSchema);
+ if (packageIdentifiers == null) {
+ packageIdentifiers = new ArraySet<>();
+ }
+ packageIdentifiers.add(packageIdentifier);
+ schemaToPackageIdentifierMap.put(prefixedSchema, packageIdentifiers);
+ }
+ }
+ mPackageAccessibleMap.put(prefix, schemaToPackageIdentifierMap);
} catch (AppSearchException e) {
if (e.getResultCode() == AppSearchResult.RESULT_NOT_FOUND) {
// TODO(b/172068212): This indicates some desync error. We were expecting a
@@ -176,31 +273,67 @@ class VisibilityStore {
* @param prefix Prefix that identifies who owns the {@code schemasNotPlatformSurfaceable}.
* @param schemasNotPlatformSurfaceable Set of prefixed schemas that should be hidden from the
* platform.
+ * @param schemasPackageAccessible Map of prefixed schemas to a list of package identifiers that
+ * have access to the schema.
* @throws AppSearchException on AppSearchImpl error.
*/
public void setVisibility(
- @NonNull String prefix, @NonNull Set<String> schemasNotPlatformSurfaceable)
+ @NonNull String prefix,
+ @NonNull Set<String> schemasNotPlatformSurfaceable,
+ @NonNull Map<String, List<PackageIdentifier>> schemasPackageAccessible)
throws AppSearchException {
Preconditions.checkNotNull(prefix);
Preconditions.checkNotNull(schemasNotPlatformSurfaceable);
+ Preconditions.checkNotNull(schemasPackageAccessible);
// Persist the document
GenericDocument.Builder visibilityDocument =
- new GenericDocument.Builder(/*uri=*/ addUriPrefix(prefix), SCHEMA_TYPE)
+ new GenericDocument.Builder(/*uri=*/ addUriPrefix(prefix), VISIBILITY_TYPE)
.setNamespace(NAMESPACE);
if (!schemasNotPlatformSurfaceable.isEmpty()) {
visibilityDocument.setPropertyString(
NOT_PLATFORM_SURFACEABLE_PROPERTY,
schemasNotPlatformSurfaceable.toArray(new String[0]));
}
+
+ Map<String, Set<PackageIdentifier>> schemaToPackageIdentifierMap = new ArrayMap<>();
+ List<GenericDocument> packageAccessibleDocuments = new ArrayList<>();
+ for (Map.Entry<String, List<PackageIdentifier>> entry :
+ schemasPackageAccessible.entrySet()) {
+ for (int i = 0; i < entry.getValue().size(); i++) {
+ // TODO(b/169883602): remove the "placeholder" uri once upstream changes to relax
+ // nested
+ // document uri rules gets synced down.
+ GenericDocument packageAccessibleDocument =
+ new GenericDocument.Builder(/*uri=*/ "placeholder", PACKAGE_ACCESSIBLE_TYPE)
+ .setNamespace(NAMESPACE)
+ .setPropertyString(
+ PACKAGE_NAME_PROPERTY,
+ entry.getValue().get(i).getPackageName())
+ .setPropertyBytes(
+ SHA_256_CERT_PROPERTY,
+ entry.getValue().get(i).getSha256Certificate())
+ .setPropertyString(ACCESSIBLE_SCHEMA_PROPERTY, entry.getKey())
+ .build();
+ packageAccessibleDocuments.add(packageAccessibleDocument);
+ }
+ schemaToPackageIdentifierMap.put(entry.getKey(), new ArraySet<>(entry.getValue()));
+ }
+ if (!packageAccessibleDocuments.isEmpty()) {
+ visibilityDocument.setPropertyDocument(
+ PACKAGE_ACCESSIBLE_PROPERTY,
+ packageAccessibleDocuments.toArray(new GenericDocument[0]));
+ }
+
mAppSearchImpl.putDocument(PACKAGE_NAME, DATABASE_NAME, visibilityDocument.build());
// Update derived data structures.
mNotPlatformSurfaceableMap.put(prefix, schemasNotPlatformSurfaceable);
+ mPackageAccessibleMap.put(prefix, schemaToPackageIdentifierMap);
}
/** Returns if the schema is surfaceable by the platform. */
- @NonNull
+ // TODO(b/169883602): check permissions against the allowlisted global querier package name.
public boolean isSchemaPlatformSurfaceable(
@NonNull String prefix, @NonNull String prefixedSchema) {
Preconditions.checkNotNull(prefix);
@@ -212,6 +345,31 @@ class VisibilityStore {
return !notPlatformSurfaceableSchemas.contains(prefixedSchema);
}
+ /** Returns whether the schema is accessible by {@code accessingPackage}. */
+ // TODO(b/169883602): check certificate and package against the incoming querier's uid/package.
+ public boolean isSchemaPackageAccessible(
+ @NonNull String prefix,
+ @NonNull String prefixedSchema,
+ @NonNull PackageIdentifier accessingPackage) {
+ Preconditions.checkNotNull(prefix);
+ Preconditions.checkNotNull(prefixedSchema);
+ Preconditions.checkNotNull(accessingPackage);
+
+ Map<String, Set<PackageIdentifier>> schemaToPackageIdentifierMap =
+ mPackageAccessibleMap.get(prefix);
+ if (schemaToPackageIdentifierMap == null) {
+ return false;
+ }
+
+ Set<PackageIdentifier> packageIdentifiers =
+ schemaToPackageIdentifierMap.get(prefixedSchema);
+ if (packageIdentifiers == null) {
+ return false;
+ }
+
+ return packageIdentifiers.contains(accessingPackage);
+ }
+
/**
* Handles an {@code AppSearchImpl#reset()} by clearing any cached state.
*
@@ -219,6 +377,7 @@ class VisibilityStore {
*/
void handleReset() {
mNotPlatformSurfaceableMap.clear();
+ mPackageAccessibleMap.clear();
}
/**
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchSpecToProtoConverter.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchSpecToProtoConverter.java
index 814ee4f7636a..073a7f624d89 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchSpecToProtoConverter.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchSpecToProtoConverter.java
@@ -26,6 +26,9 @@ import com.google.android.icing.proto.ScoringSpecProto;
import com.google.android.icing.proto.SearchSpecProto;
import com.google.android.icing.proto.TermMatchType;
+import java.util.List;
+import java.util.Map;
+
/**
* Translates a {@link SearchSpec} into icing search protos.
*
@@ -57,14 +60,22 @@ public final class SearchSpecToProtoConverter {
@NonNull
public static ResultSpecProto toResultSpecProto(@NonNull SearchSpec spec) {
Preconditions.checkNotNull(spec);
- return ResultSpecProto.newBuilder()
- .setNumPerPage(spec.getResultCountPerPage())
- .setSnippetSpec(
- ResultSpecProto.SnippetSpecProto.newBuilder()
- .setNumToSnippet(spec.getSnippetCount())
- .setNumMatchesPerProperty(spec.getSnippetCountPerProperty())
- .setMaxWindowBytes(spec.getMaxSnippetSize()))
- .build();
+ ResultSpecProto.Builder builder =
+ ResultSpecProto.newBuilder()
+ .setNumPerPage(spec.getResultCountPerPage())
+ .setSnippetSpec(
+ ResultSpecProto.SnippetSpecProto.newBuilder()
+ .setNumToSnippet(spec.getSnippetCount())
+ .setNumMatchesPerProperty(spec.getSnippetCountPerProperty())
+ .setMaxWindowBytes(spec.getMaxSnippetSize()));
+ Map<String, List<String>> projectionTypePropertyPaths = spec.getProjections();
+ for (Map.Entry<String, List<String>> e : projectionTypePropertyPaths.entrySet()) {
+ builder.addTypePropertyMasks(
+ ResultSpecProto.TypePropertyMask.newBuilder()
+ .setSchemaType(e.getKey())
+ .addAllPaths(e.getValue()));
+ }
+ return builder.build();
}
/** Extracts {@link ScoringSpecProto} information from a {@link SearchSpec}. */
@@ -79,17 +90,28 @@ public final class SearchSpecToProtoConverter {
if (orderCodeProto == null) {
throw new IllegalArgumentException("Invalid result ranking order: " + orderCode);
}
- protoBuilder.setOrderBy(orderCodeProto);
-
- @SearchSpec.RankingStrategy int rankingStrategyCode = spec.getRankingStrategy();
- ScoringSpecProto.RankingStrategy.Code rankingStrategyCodeProto =
- ScoringSpecProto.RankingStrategy.Code.forNumber(rankingStrategyCode);
- if (rankingStrategyCodeProto == null) {
- throw new IllegalArgumentException(
- "Invalid result ranking strategy: " + rankingStrategyCode);
- }
- protoBuilder.setRankBy(rankingStrategyCodeProto);
+ protoBuilder
+ .setOrderBy(orderCodeProto)
+ .setRankBy(toProtoRankingStrategy(spec.getRankingStrategy()));
return protoBuilder.build();
}
+
+ private static ScoringSpecProto.RankingStrategy.Code toProtoRankingStrategy(
+ @SearchSpec.RankingStrategy int rankingStrategyCode) {
+ switch (rankingStrategyCode) {
+ case SearchSpec.RANKING_STRATEGY_NONE:
+ return ScoringSpecProto.RankingStrategy.Code.NONE;
+ case SearchSpec.RANKING_STRATEGY_DOCUMENT_SCORE:
+ return ScoringSpecProto.RankingStrategy.Code.DOCUMENT_SCORE;
+ case SearchSpec.RANKING_STRATEGY_CREATION_TIMESTAMP:
+ return ScoringSpecProto.RankingStrategy.Code.CREATION_TIMESTAMP;
+ case SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE:
+ return ScoringSpecProto.RankingStrategy.Code
+ .RELEVANCE_SCORE_NONFUNCTIONAL_PLACEHOLDER;
+ default:
+ throw new IllegalArgumentException(
+ "Invalid result ranking strategy: " + rankingStrategyCode);
+ }
+ }
}
diff --git a/apex/appsearch/synced_jetpack_changeid.txt b/apex/appsearch/synced_jetpack_changeid.txt
index 73f64dc500ae..f8e5a8aba17b 100644
--- a/apex/appsearch/synced_jetpack_changeid.txt
+++ b/apex/appsearch/synced_jetpack_changeid.txt
@@ -1 +1 @@
-I8b7425b3f87153547d1c8f5b560be5a54c9be97e
+I6745091e5cb97d69ce2e5f85d3d15c073e7e3ef7
diff --git a/core/api/current.txt b/core/api/current.txt
index a1a2314163eb..8a522d14da9f 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -393,6 +393,7 @@ package android {
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
field public static final int canControlMagnification = 16844039; // 0x1010507
+ field public static final int canPauseRecording = 16844314; // 0x101061a
field public static final int canPerformGestures = 16844045; // 0x101050d
field public static final int canRecord = 16844060; // 0x101051c
field @Deprecated public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
@@ -1054,11 +1055,11 @@ package android {
field public static final int parentActivityName = 16843687; // 0x10103a7
field @Deprecated public static final int password = 16843100; // 0x101015c
field public static final int path = 16842794; // 0x101002a
- field public static final int pathAdvancedPattern = 16844318; // 0x101061e
+ field public static final int pathAdvancedPattern = 16844319; // 0x101061f
field public static final int pathData = 16843781; // 0x1010405
field public static final int pathPattern = 16842796; // 0x101002c
field public static final int pathPrefix = 16842795; // 0x101002b
- field public static final int pathSuffix = 16844316; // 0x101061c
+ field public static final int pathSuffix = 16844317; // 0x101061d
field public static final int patternPathData = 16843978; // 0x10104ca
field public static final int permission = 16842758; // 0x1010006
field public static final int permissionFlags = 16843719; // 0x10103c7
@@ -1151,7 +1152,7 @@ package android {
field public static final int reqNavigation = 16843306; // 0x101022a
field public static final int reqTouchScreen = 16843303; // 0x1010227
field public static final int requestLegacyExternalStorage = 16844291; // 0x1010603
- field public static final int requireDeviceScreenOn = 16844315; // 0x101061b
+ field public static final int requireDeviceScreenOn = 16844316; // 0x101061c
field public static final int requireDeviceUnlock = 16843756; // 0x10103ec
field public static final int required = 16843406; // 0x101028e
field public static final int requiredAccountType = 16843734; // 0x10103d6
@@ -1292,10 +1293,10 @@ package android {
field public static final int spotShadowAlpha = 16843967; // 0x10104bf
field public static final int src = 16843033; // 0x1010119
field public static final int ssp = 16843747; // 0x10103e3
- field public static final int sspAdvancedPattern = 16844319; // 0x101061f
+ field public static final int sspAdvancedPattern = 16844320; // 0x1010620
field public static final int sspPattern = 16843749; // 0x10103e5
field public static final int sspPrefix = 16843748; // 0x10103e4
- field public static final int sspSuffix = 16844317; // 0x101061d
+ field public static final int sspSuffix = 16844318; // 0x101061e
field public static final int stackFromBottom = 16843005; // 0x10100fd
field public static final int stackViewStyle = 16843838; // 0x101043e
field public static final int starStyle = 16842882; // 0x1010082
@@ -1690,6 +1691,30 @@ package android {
field @Deprecated public static final int secondary_text_dark_nodisable = 17170438; // 0x1060006
field @Deprecated public static final int secondary_text_light = 17170439; // 0x1060007
field @Deprecated public static final int secondary_text_light_nodisable = 17170440; // 0x1060008
+ field public static final int system_accent_0 = 17170473; // 0x1060029
+ field public static final int system_accent_100 = 17170475; // 0x106002b
+ field public static final int system_accent_1000 = 17170484; // 0x1060034
+ field public static final int system_accent_200 = 17170476; // 0x106002c
+ field public static final int system_accent_300 = 17170477; // 0x106002d
+ field public static final int system_accent_400 = 17170478; // 0x106002e
+ field public static final int system_accent_50 = 17170474; // 0x106002a
+ field public static final int system_accent_500 = 17170479; // 0x106002f
+ field public static final int system_accent_600 = 17170480; // 0x1060030
+ field public static final int system_accent_700 = 17170481; // 0x1060031
+ field public static final int system_accent_800 = 17170482; // 0x1060032
+ field public static final int system_accent_900 = 17170483; // 0x1060033
+ field public static final int system_main_0 = 17170461; // 0x106001d
+ field public static final int system_main_100 = 17170463; // 0x106001f
+ field public static final int system_main_1000 = 17170472; // 0x1060028
+ field public static final int system_main_200 = 17170464; // 0x1060020
+ field public static final int system_main_300 = 17170465; // 0x1060021
+ field public static final int system_main_400 = 17170466; // 0x1060022
+ field public static final int system_main_50 = 17170462; // 0x106001e
+ field public static final int system_main_500 = 17170467; // 0x1060023
+ field public static final int system_main_600 = 17170468; // 0x1060024
+ field public static final int system_main_700 = 17170469; // 0x1060025
+ field public static final int system_main_800 = 17170470; // 0x1060026
+ field public static final int system_main_900 = 17170471; // 0x1060027
field public static final int tab_indicator_text = 17170441; // 0x1060009
field @Deprecated public static final int tertiary_text_dark = 17170448; // 0x1060010
field @Deprecated public static final int tertiary_text_light = 17170449; // 0x1060011
@@ -24727,6 +24752,7 @@ package android.media.tv {
}
public final class TvInputInfo implements android.os.Parcelable {
+ method public boolean canPauseRecording();
method public boolean canRecord();
method @Deprecated public android.content.Intent createSettingsIntent();
method public android.content.Intent createSetupIntent();
@@ -24760,6 +24786,7 @@ package android.media.tv {
public static final class TvInputInfo.Builder {
ctor public TvInputInfo.Builder(android.content.Context, android.content.ComponentName);
method public android.media.tv.TvInputInfo build();
+ method @NonNull public android.media.tv.TvInputInfo.Builder setCanPauseRecording(boolean);
method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean);
method public android.media.tv.TvInputInfo.Builder setExtras(android.os.Bundle);
method public android.media.tv.TvInputInfo.Builder setTunerCount(int);
@@ -24851,7 +24878,9 @@ package android.media.tv {
method public void notifyRecordingStopped(android.net.Uri);
method public void notifyTuned(android.net.Uri);
method public void onAppPrivateCommand(@NonNull String, android.os.Bundle);
+ method public void onPauseRecording(@NonNull android.os.Bundle);
method public abstract void onRelease();
+ method public void onResumeRecording(@NonNull android.os.Bundle);
method public abstract void onStartRecording(@Nullable android.net.Uri);
method public void onStartRecording(@Nullable android.net.Uri, @NonNull android.os.Bundle);
method public abstract void onStopRecording();
@@ -24901,7 +24930,11 @@ package android.media.tv {
public class TvRecordingClient {
ctor public TvRecordingClient(android.content.Context, String, @NonNull android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler);
+ method public void pauseRecording();
+ method public void pauseRecording(@NonNull android.os.Bundle);
method public void release();
+ method public void resumeRecording();
+ method public void resumeRecording(@NonNull android.os.Bundle);
method public void sendAppPrivateCommand(@NonNull String, android.os.Bundle);
method public void startRecording(@Nullable android.net.Uri);
method public void startRecording(@Nullable android.net.Uri, @NonNull android.os.Bundle);
@@ -41826,8 +41859,8 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void switchMultiSimConfig(int);
method public void unregisterPhoneStateListener(@NonNull android.telephony.PhoneStateListener);
method public void updateAvailableNetworks(@NonNull java.util.List<android.telephony.AvailableNetworkInfo>, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Integer>);
- method public void uploadCallComposerPicture(@NonNull java.nio.file.Path, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.os.ParcelUuid,android.telephony.TelephonyManager.CallComposerException>);
- method public void uploadCallComposerPicture(@NonNull java.io.InputStream, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.os.ParcelUuid,android.telephony.TelephonyManager.CallComposerException>);
+ method public void uploadCallComposerPicture(@NonNull java.nio.file.Path, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.os.ParcelUuid,android.telephony.TelephonyManager.CallComposerException>);
+ method public void uploadCallComposerPicture(@NonNull java.io.InputStream, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.os.ParcelUuid,android.telephony.TelephonyManager.CallComposerException>);
field public static final String ACTION_CARRIER_MESSAGING_CLIENT_SERVICE = "android.telephony.action.CARRIER_MESSAGING_CLIENT_SERVICE";
field public static final String ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE = "android.telephony.action.CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE";
field public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE = "android.telephony.action.CARRIER_SIGNAL_PCO_VALUE";
@@ -41978,6 +42011,7 @@ package android.telephony {
field public static final int ERROR_FILE_TOO_LARGE = 2; // 0x2
field public static final int ERROR_INPUT_CLOSED = 4; // 0x4
field public static final int ERROR_IO_EXCEPTION = 5; // 0x5
+ field public static final int ERROR_NETWORK_UNAVAILABLE = 6; // 0x6
field public static final int ERROR_REMOTE_END_CLOSED = 1; // 0x1
field public static final int ERROR_UNKNOWN = 0; // 0x0
}
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 21a6ba1a78aa..2ebcb1984ae0 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -3983,6 +3983,25 @@ package android.location {
method public void onLocationBatch(java.util.List<android.location.Location>);
}
+ public final class CorrelationVector implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=0) public int getFrequencyOffsetMetersPerSecond();
+ method @NonNull public int[] getMagnitude();
+ method @FloatRange(from=0.0f) public double getSamplingStartMeters();
+ method @FloatRange(from=0.0f, fromInclusive=false) public double getSamplingWidthMeters();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.CorrelationVector> CREATOR;
+ }
+
+ public static final class CorrelationVector.Builder {
+ ctor public CorrelationVector.Builder();
+ method @NonNull public android.location.CorrelationVector build();
+ method @NonNull public android.location.CorrelationVector.Builder setFrequencyOffsetMetersPerSecond(@IntRange(from=0) int);
+ method @NonNull public android.location.CorrelationVector.Builder setMagnitude(@NonNull int[]);
+ method @NonNull public android.location.CorrelationVector.Builder setSamplingStartMeters(@FloatRange(from=0.0f) double);
+ method @NonNull public android.location.CorrelationVector.Builder setSamplingWidthMeters(@FloatRange(from=0.0f, fromInclusive=false) double);
+ }
+
public final class GnssCapabilities implements android.os.Parcelable {
method public boolean hasGeofencing();
method public boolean hasLowPowerMode();
@@ -3991,6 +4010,7 @@ package android.location {
method public boolean hasMeasurementCorrectionsLosSats();
method @Deprecated public boolean hasMeasurementCorrectionsReflectingPane();
method public boolean hasMeasurementCorrectionsReflectingPlane();
+ method public boolean hasMeasurementCorrelationVectors();
method @Deprecated public boolean hasNavMessages();
method @Deprecated public boolean hasSatelliteBlacklist();
method public boolean hasSatelliteBlocklist();
@@ -4004,12 +4024,15 @@ package android.location {
method @NonNull public android.location.GnssCapabilities.Builder setHasMeasurementCorrectionsExcessPathLength(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasMeasurementCorrectionsLosSats(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasMeasurementCorrectionsReflectingPlane(boolean);
+ method @NonNull public android.location.GnssCapabilities.Builder setHasMeasurementCorrelationVectors(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasSatelliteBlocklist(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasSatellitePvt(boolean);
}
public final class GnssMeasurement implements android.os.Parcelable {
+ method @Nullable public java.util.Collection<android.location.CorrelationVector> getCorrelationVectors();
method @Nullable public android.location.SatellitePvt getSatellitePvt();
+ method public boolean hasCorrelationVectors();
method public boolean hasSatellitePvt();
}
@@ -4043,6 +4066,14 @@ package android.location {
method @NonNull public android.location.GnssMeasurementCorrections.Builder setVerticalPositionUncertaintyMeters(@FloatRange(from=0.0f) double);
}
+ public final class GnssMeasurementRequest implements android.os.Parcelable {
+ method public boolean isCorrelationVectorOutputsEnabled();
+ }
+
+ public static final class GnssMeasurementRequest.Builder {
+ method @NonNull public android.location.GnssMeasurementRequest.Builder setCorrelationVectorOutputsEnabled(boolean);
+ }
+
public final class GnssReflectingPlane implements android.os.Parcelable {
method public int describeContents();
method @FloatRange(from=-1000.0F, to=10000.0f) public double getAltitudeMeters();
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 62c660cbcb6c..015ae64a9257 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -730,6 +730,18 @@ package android.graphics.drawable {
}
+package android.hardware {
+
+ public final class SensorPrivacyManager {
+ method public boolean isIndividualSensorPrivacyEnabled(int);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacy(int, boolean);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacyForProfileGroup(int, boolean);
+ field public static final int INDIVIDUAL_SENSOR_CAMERA = 2; // 0x2
+ field public static final int INDIVIDUAL_SENSOR_MICROPHONE = 1; // 0x1
+ }
+
+}
+
package android.hardware.biometrics {
public class BiometricManager {
@@ -929,6 +941,7 @@ package android.location {
method @Deprecated public void resetCarrierPhase();
method @Deprecated public void resetCarrierPhaseUncertainty();
method public void resetCodeType();
+ method public void resetCorrelationVectors();
method public void resetFullInterSignalBiasNanos();
method public void resetFullInterSignalBiasUncertaintyNanos();
method public void resetSatelliteInterSignalBiasNanos();
@@ -948,6 +961,7 @@ package android.location {
method public void setCn0DbHz(double);
method public void setCodeType(@NonNull String);
method public void setConstellationType(int);
+ method public void setCorrelationVectors(@Nullable java.util.Collection<android.location.CorrelationVector>);
method public void setFullInterSignalBiasNanos(double);
method public void setFullInterSignalBiasUncertaintyNanos(@FloatRange(from=0.0) double);
method public void setMultipathIndicator(int);
diff --git a/core/api/test-lint-baseline.txt b/core/api/test-lint-baseline.txt
index 3bd88a47f30d..216d34069083 100644
--- a/core/api/test-lint-baseline.txt
+++ b/core/api/test-lint-baseline.txt
@@ -468,6 +468,8 @@ GetterSetterNames: android.location.GnssMeasurement#setBasebandCn0DbHz(double):
GetterSetterNames: android.location.GnssMeasurement#setCarrierFrequencyHz(float):
GetterSetterNames: android.location.GnssMeasurement#setCodeType(String):
+
+GetterSetterNames: android.location.GnssMeasurement#setCorrelationVectors(java.util.Collection<android.location.CorrelationVector>):
GetterSetterNames: android.location.GnssMeasurement#setFullInterSignalBiasNanos(double):
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index b1890b075c59..f7f42a6e2713 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -98,11 +98,15 @@ public abstract class ActivityManagerInternal {
public abstract void killForegroundAppsForUser(@UserIdInt int userId);
/**
- * Sets how long a {@link PendingIntent} can be temporarily whitelist to by bypass restrictions
- * such as Power Save mode.
+ * Sets how long a {@link PendingIntent} can be temporarily whitelist to by bypass restrictions
+ * such as Power Save mode.
+ * @param target
+ * @param whitelistToken
+ * @param duration temp allowlist duration in milliseconds.
+ * @param type temp allowlist type defined at {@link BroadcastOptions.TempAllowListType}
*/
public abstract void setPendingIntentWhitelistDuration(IIntentSender target,
- IBinder whitelistToken, long duration);
+ IBinder whitelistToken, long duration, int type);
/**
* Returns the flags set for a {@link PendingIntent}.
@@ -318,8 +322,17 @@ public abstract class ActivityManagerInternal {
public abstract boolean isBooted();
public abstract void finishBooting();
+ /**
+ * Temp allowlist a UID for PendingIntent.
+ * @param callerPid the PID that sent the PendingIntent.
+ * @param callerUid the UID that sent the PendingIntent.
+ * @param targetUid the UID that is been temp allowlisted.
+ * @param duration temp allowlist duration in milliseconds.
+ * @param type temp allowlist type defined at {@link BroadcastOptions.TempAllowListType}
+ * @param tag
+ */
public abstract void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid,
- long duration, String tag);
+ long duration, int type, String tag);
public abstract int broadcastIntentInPackage(String packageName, @Nullable String featureId,
int uid, int realCallingUid, int realCallingPid, Intent intent, String resolvedType,
diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java
index ce2fd4fb60b2..a0d2977cf09a 100644
--- a/core/java/android/app/admin/DevicePolicyManagerInternal.java
+++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java
@@ -231,7 +231,13 @@ public abstract class DevicePolicyManagerInternal {
* Returns the profile owner component for the given user, or {@code null} if there is not one.
*/
@Nullable
- public abstract ComponentName getProfileOwnerAsUser(int userHandle);
+ public abstract ComponentName getProfileOwnerAsUser(@UserIdInt int userId);
+
+ /**
+ * Returns the user id of the device owner, or {@link UserHandle#USER_NULL} if there is not one.
+ */
+ @UserIdInt
+ public abstract int getDeviceOwnerUserId();
/**
* Returns whether the given package is a device owner or a profile owner in the calling user.
diff --git a/core/java/android/app/timezonedetector/TimeZoneDetector.java b/core/java/android/app/timezonedetector/TimeZoneDetector.java
index ee718b35d4c5..b216e913b6ff 100644
--- a/core/java/android/app/timezonedetector/TimeZoneDetector.java
+++ b/core/java/android/app/timezonedetector/TimeZoneDetector.java
@@ -55,12 +55,6 @@ public interface TimeZoneDetector {
String SHELL_COMMAND_IS_GEO_DETECTION_SUPPORTED = "is_geo_detection_supported";
/**
- * A shell command that prints the current user's "location enabled" setting.
- * @hide
- */
- String SHELL_COMMAND_IS_LOCATION_ENABLED = "is_location_enabled";
-
- /**
* A shell command that prints the current user's "location-based time zone detection enabled"
* setting.
* @hide
diff --git a/core/java/android/content/pm/parsing/ApkLite.java b/core/java/android/content/pm/parsing/ApkLite.java
new file mode 100644
index 000000000000..d8ec512d9f1e
--- /dev/null
+++ b/core/java/android/content/pm/parsing/ApkLite.java
@@ -0,0 +1,412 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm.parsing;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageParser.SigningDetails;
+import android.content.pm.VerifierInfo;
+
+import com.android.internal.util.DataClass;
+
+import java.util.List;
+
+/**
+ * Lightweight parsed details about a single APK file.
+ *
+ * @hide
+ */
+@DataClass(genConstructor = false, genConstDefs = false)
+public class ApkLite {
+ /** Name of the package as used to identify it in the system */
+ private final @NonNull String mPackageName;
+ /** Path where this APK file was found on disk */
+ private final @NonNull String mPath;
+ /** Split name of this APK */
+ private final @Nullable String mSplitName;
+ /** Dependencies of the split APK */
+ /** Name of the split APK that this APK depends on */
+ private final @Nullable String mUsesSplitName;
+ /** Name of the split APK that this APK is a configuration for */
+ private final @Nullable String mConfigForSplit;
+
+ /** Major version number of this package */
+ private final int mVersionCodeMajor;
+ /** Minor version number of this package */
+ private final int mVersionCode;
+ /** Revision code of this APK */
+ private final int mRevisionCode;
+ /**
+ * Indicate the install location of this package
+ *
+ * @see {@link PackageInfo#INSTALL_LOCATION_AUTO}
+ * @see {@link PackageInfo#INSTALL_LOCATION_INTERNAL_ONLY}
+ * @see {@link PackageInfo#INSTALL_LOCATION_PREFER_EXTERNAL}
+ */
+ private final int mInstallLocation;
+ /** Indicate the minimum SDK version number that the app requires */
+ private final int mMinSdkVersion;
+ /** Indicate the SDK version number that the application is targeting */
+ private final int mTargetSdkVersion;
+ /** Information about a package verifiers as used during package verification */
+ private final @NonNull VerifierInfo[] mVerifiers;
+ /** Signing-related data of an application package */
+ private final @NonNull SigningDetails mSigningDetails;
+
+ /** Indicate whether this APK is a 'feature' split */
+ private final boolean mFeatureSplit;
+ /** Indicate whether each split should be load into their own Context objects */
+ private final boolean mIsolatedSplits;
+ /**
+ * Indicate whether this package requires at least one split (either feature or resource)
+ * to be present in order to function
+ */
+ private final boolean mSplitRequired;
+ /** Indicate whether this app is coreApp */
+ private final boolean mCoreApp;
+ /** Indicate whether this app can be debugged */
+ private final boolean mDebuggable;
+ /** Indicate whether this app is profileable by Shell */
+ private final boolean mProfileableByShell;
+ /** Indicate whether this app needs to be loaded into other applications' processes */
+ private final boolean mMultiArch;
+ /** Indicate whether the 32 bit version of the ABI should be used */
+ private final boolean mUse32bitAbi;
+ /** Indicate whether installer extracts native libraries */
+ private final boolean mExtractNativeLibs;
+ /**
+ * Indicate whether this package wants to run the dex within its APK but not extracted
+ * or locally compiled variants.
+ */
+ private final boolean mUseEmbeddedDex;
+
+ /** Name of the overlay-able set of elements package */
+ private final @Nullable String mTargetPackageName;
+ /** Indicate whether the overlay is static */
+ private final boolean mOverlayIsStatic;
+ /** Indicate the priority of this overlay package */
+ private final int mOverlayPriority;
+
+ /**
+ * Indicate the policy to deal with user data when rollback is committed
+ *
+ * @see {@link android.content.pm.PackageManager.RollbackDataPolicy#RESTORE}
+ * @see {@link android.content.pm.PackageManager.RollbackDataPolicy#WIPE}
+ * @see {@link android.content.pm.PackageManager.RollbackDataPolicy#RETAIN}
+ */
+ private final int mRollbackDataPolicy;
+
+ public ApkLite(String path, String packageName, String splitName, boolean isFeatureSplit,
+ String configForSplit, String usesSplitName, boolean isSplitRequired, int versionCode,
+ int versionCodeMajor, int revisionCode, int installLocation,
+ List<VerifierInfo> verifiers, SigningDetails signingDetails, boolean coreApp,
+ boolean debuggable, boolean profileableByShell, boolean multiArch, boolean use32bitAbi,
+ boolean useEmbeddedDex, boolean extractNativeLibs, boolean isolatedSplits,
+ String targetPackageName, boolean overlayIsStatic, int overlayPriority,
+ int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy) {
+ mPath = path;
+ mPackageName = packageName;
+ mSplitName = splitName;
+ mFeatureSplit = isFeatureSplit;
+ mConfigForSplit = configForSplit;
+ mUsesSplitName = usesSplitName;
+ mSplitRequired = isSplitRequired;
+ mVersionCode = versionCode;
+ mVersionCodeMajor = versionCodeMajor;
+ mRevisionCode = revisionCode;
+ mInstallLocation = installLocation;
+ mVerifiers = verifiers.toArray(new VerifierInfo[verifiers.size()]);
+ mSigningDetails = signingDetails;
+ mCoreApp = coreApp;
+ mDebuggable = debuggable;
+ mProfileableByShell = profileableByShell;
+ mMultiArch = multiArch;
+ mUse32bitAbi = use32bitAbi;
+ mUseEmbeddedDex = useEmbeddedDex;
+ mExtractNativeLibs = extractNativeLibs;
+ mIsolatedSplits = isolatedSplits;
+ mTargetPackageName = targetPackageName;
+ mOverlayIsStatic = overlayIsStatic;
+ mOverlayPriority = overlayPriority;
+ mMinSdkVersion = minSdkVersion;
+ mTargetSdkVersion = targetSdkVersion;
+ mRollbackDataPolicy = rollbackDataPolicy;
+ }
+
+ /**
+ * Return {@link #mVersionCode} and {@link #mVersionCodeMajor} combined together as a
+ * single long value. The {@link #mVersionCodeMajor} is placed in the upper 32 bits.
+ */
+ public long getLongVersionCode() {
+ return PackageInfo.composeLongVersionCode(mVersionCodeMajor, mVersionCode);
+ }
+
+
+
+ // Code below generated by codegen v1.0.22.
+ //
+ // DO NOT MODIFY!
+ // CHECKSTYLE:OFF Generated code
+ //
+ // To regenerate run:
+ // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/content/pm/parsing/ApkLite.java
+ //
+ // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+ // Settings > Editor > Code Style > Formatter Control
+ //@formatter:off
+
+
+ /**
+ * Name of the package as used to identify it in the system
+ */
+ @DataClass.Generated.Member
+ public @NonNull String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * Path where this APK file was found on disk
+ */
+ @DataClass.Generated.Member
+ public @NonNull String getPath() {
+ return mPath;
+ }
+
+ /**
+ * Split name of this APK
+ */
+ @DataClass.Generated.Member
+ public @Nullable String getSplitName() {
+ return mSplitName;
+ }
+
+ /**
+ * Name of the split APK that this APK depends on
+ */
+ @DataClass.Generated.Member
+ public @Nullable String getUsesSplitName() {
+ return mUsesSplitName;
+ }
+
+ /**
+ * Name of the split APK that this APK is a configuration for
+ */
+ @DataClass.Generated.Member
+ public @Nullable String getConfigForSplit() {
+ return mConfigForSplit;
+ }
+
+ /**
+ * Major version number of this package
+ */
+ @DataClass.Generated.Member
+ public int getVersionCodeMajor() {
+ return mVersionCodeMajor;
+ }
+
+ /**
+ * Minor version number of this package
+ */
+ @DataClass.Generated.Member
+ public int getVersionCode() {
+ return mVersionCode;
+ }
+
+ /**
+ * Revision code of this APK
+ */
+ @DataClass.Generated.Member
+ public int getRevisionCode() {
+ return mRevisionCode;
+ }
+
+ /**
+ * Indicate the install location of this package
+ *
+ * @see {@link PackageInfo#INSTALL_LOCATION_AUTO}
+ * @see {@link PackageInfo#INSTALL_LOCATION_INTERNAL_ONLY}
+ * @see {@link PackageInfo#INSTALL_LOCATION_PREFER_EXTERNAL}
+ */
+ @DataClass.Generated.Member
+ public int getInstallLocation() {
+ return mInstallLocation;
+ }
+
+ /**
+ * Indicate the minimum SDK version number that the app requires
+ */
+ @DataClass.Generated.Member
+ public int getMinSdkVersion() {
+ return mMinSdkVersion;
+ }
+
+ /**
+ * Indicate the SDK version number that the application is targeting
+ */
+ @DataClass.Generated.Member
+ public int getTargetSdkVersion() {
+ return mTargetSdkVersion;
+ }
+
+ /**
+ * Information about a package verifiers as used during package verification
+ */
+ @DataClass.Generated.Member
+ public @NonNull VerifierInfo[] getVerifiers() {
+ return mVerifiers;
+ }
+
+ /**
+ * Signing-related data of an application package
+ */
+ @DataClass.Generated.Member
+ public @NonNull SigningDetails getSigningDetails() {
+ return mSigningDetails;
+ }
+
+ /**
+ * Indicate whether this APK is a 'feature' split
+ */
+ @DataClass.Generated.Member
+ public boolean isFeatureSplit() {
+ return mFeatureSplit;
+ }
+
+ /**
+ * Indicate whether each split should be load into their own Context objects
+ */
+ @DataClass.Generated.Member
+ public boolean isIsolatedSplits() {
+ return mIsolatedSplits;
+ }
+
+ /**
+ * Indicate whether this package requires at least one split (either feature or resource)
+ * to be present in order to function
+ */
+ @DataClass.Generated.Member
+ public boolean isSplitRequired() {
+ return mSplitRequired;
+ }
+
+ /**
+ * Indicate whether this app is coreApp
+ */
+ @DataClass.Generated.Member
+ public boolean isCoreApp() {
+ return mCoreApp;
+ }
+
+ /**
+ * Indicate whether this app can be debugged
+ */
+ @DataClass.Generated.Member
+ public boolean isDebuggable() {
+ return mDebuggable;
+ }
+
+ /**
+ * Indicate whether this app is profileable by Shell
+ */
+ @DataClass.Generated.Member
+ public boolean isProfileableByShell() {
+ return mProfileableByShell;
+ }
+
+ /**
+ * Indicate whether this app needs to be loaded into other applications' processes
+ */
+ @DataClass.Generated.Member
+ public boolean isMultiArch() {
+ return mMultiArch;
+ }
+
+ /**
+ * Indicate whether the 32 bit version of the ABI should be used
+ */
+ @DataClass.Generated.Member
+ public boolean isUse32bitAbi() {
+ return mUse32bitAbi;
+ }
+
+ /**
+ * Indicate whether installer extracts native libraries
+ */
+ @DataClass.Generated.Member
+ public boolean isExtractNativeLibs() {
+ return mExtractNativeLibs;
+ }
+
+ /**
+ * Indicate whether this package wants to run the dex within its APK but not extracted
+ * or locally compiled variants.
+ */
+ @DataClass.Generated.Member
+ public boolean isUseEmbeddedDex() {
+ return mUseEmbeddedDex;
+ }
+
+ /**
+ * Name of the overlay-able set of elements package
+ */
+ @DataClass.Generated.Member
+ public @Nullable String getTargetPackageName() {
+ return mTargetPackageName;
+ }
+
+ /**
+ * Indicate whether the overlay is static
+ */
+ @DataClass.Generated.Member
+ public boolean isOverlayIsStatic() {
+ return mOverlayIsStatic;
+ }
+
+ /**
+ * Indicate the priority of this overlay package
+ */
+ @DataClass.Generated.Member
+ public int getOverlayPriority() {
+ return mOverlayPriority;
+ }
+
+ /**
+ * Indicate the policy to deal with user data when rollback is committed
+ *
+ * @see {@link android.content.pm.PackageManager.RollbackDataPolicy#RESTORE}
+ * @see {@link android.content.pm.PackageManager.RollbackDataPolicy#WIPE}
+ * @see {@link android.content.pm.PackageManager.RollbackDataPolicy#RETAIN}
+ */
+ @DataClass.Generated.Member
+ public int getRollbackDataPolicy() {
+ return mRollbackDataPolicy;
+ }
+
+ @DataClass.Generated(
+ time = 1610596637723L,
+ codegenVersion = "1.0.22",
+ sourceFile = "frameworks/base/core/java/android/content/pm/parsing/ApkLite.java",
+ inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mRevisionCode\nprivate final int mInstallLocation\nprivate final int mMinSdkVersion\nprivate final int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.PackageParser.SigningDetails mSigningDetails\nprivate final boolean mFeatureSplit\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mProfileableByShell\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final boolean mOverlayIsStatic\nprivate final int mOverlayPriority\nprivate final int mRollbackDataPolicy\npublic long getLongVersionCode()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
+ @Deprecated
+ private void __metadata() {}
+
+
+ //@formatter:on
+ // End of generated code
+
+}
diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
index f583e2597855..51b81b60a825 100644
--- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
+++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
@@ -18,7 +18,6 @@ package android.content.pm.parsing;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
-import static android.content.pm.PackageParser.APK_FILE_EXTENSION;
import static android.content.pm.parsing.ParsingPackageUtils.validateName;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
@@ -51,6 +50,7 @@ import java.io.IOException;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Comparator;
import java.util.List;
import java.util.Objects;
@@ -66,6 +66,8 @@ public class ApkLiteParseUtils {
private static final int PARSE_DEFAULT_INSTALL_LOCATION =
PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
+ public static final String APK_FILE_EXTENSION = ".apk";
+
/**
* Parse only lightweight details about the package at the given location.
* Automatically detects if the package is a monolithic style (single APK
@@ -606,4 +608,21 @@ public class ApkLiteParseUtils {
return new VerifierInfo(packageName, publicKey);
}
+
+ /**
+ * Used to sort a set of APKs based on their split names, always placing the
+ * base APK (with {@code null} split name) first.
+ */
+ private static class SplitNameComparator implements Comparator<String> {
+ @Override
+ public int compare(String lhs, String rhs) {
+ if (lhs == null) {
+ return -1;
+ } else if (rhs == null) {
+ return 1;
+ } else {
+ return lhs.compareTo(rhs);
+ }
+ }
+ }
}
diff --git a/core/java/android/content/pm/parsing/PackageLite.java b/core/java/android/content/pm/parsing/PackageLite.java
new file mode 100644
index 000000000000..803d643c985c
--- /dev/null
+++ b/core/java/android/content/pm/parsing/PackageLite.java
@@ -0,0 +1,363 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm.parsing;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.pm.PackageInfo;
+import android.content.pm.VerifierInfo;
+
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.DataClass;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Lightweight parsed details about a single package.
+ *
+ * @hide
+ */
+@DataClass(genConstructor = false, genConstDefs = false)
+public class PackageLite {
+ /** Name of the package as used to identify it in the system */
+ private final @NonNull String mPackageName;
+ /**
+ * Path where this package was found on disk. For monolithic packages
+ * this is path to single base APK file; for cluster packages this is
+ * path to the cluster directory.
+ */
+ private final @NonNull String mPath;
+ /** Path of base APK */
+ private final @NonNull String mBaseApkPath;
+ /** Paths of any split APKs, ordered by parsed splitName */
+ private final @Nullable String[] mSplitApkPaths;
+ /** Names of any split APKs, ordered by parsed splitName */
+ private final @Nullable String[] mSplitNames;
+ /** Dependencies of any split APKs, ordered by parsed splitName */
+ private final @Nullable String[] mUsesSplitNames;
+ private final @Nullable String[] mConfigForSplit;
+ /** Major and minor version number of this package */
+ private final int mVersionCodeMajor;
+ private final int mVersionCode;
+ /** Revision code of base APK */
+ private final int mBaseRevisionCode;
+ /** Revision codes of any split APKs, ordered by parsed splitName */
+ private final @Nullable int[] mSplitRevisionCodes;
+ /**
+ * Indicate the install location of this package
+ *
+ * @see {@link PackageInfo#INSTALL_LOCATION_AUTO}
+ * @see {@link PackageInfo#INSTALL_LOCATION_INTERNAL_ONLY}
+ * @see {@link PackageInfo#INSTALL_LOCATION_PREFER_EXTERNAL}
+ */
+ private final int mInstallLocation;
+ /** Information about a package verifiers as used during package verification */
+ private final @NonNull VerifierInfo[] mVerifiers;
+
+ /** Indicate whether any split APKs that are features. Ordered by splitName */
+ private final @Nullable boolean[] mIsFeatureSplits;
+ /** Indicate whether each split should be load into their own Context objects */
+ private final boolean mIsolatedSplits;
+ /**
+ * Indicate whether this package requires at least one split (either feature or resource)
+ * to be present in order to function
+ */
+ private final boolean mSplitRequired;
+ /** Indicate whether this app is coreApp */
+ private final boolean mCoreApp;
+ /** Indicate whether this app can be debugged */
+ private final boolean mDebuggable;
+ /** Indicate whether this app needs to be loaded into other applications' processes */
+ private final boolean mMultiArch;
+ /** Indicate whether the 32 bit version of the ABI should be used */
+ private final boolean mUse32bitAbi;
+ /** Indicate whether installer extracts native libraries */
+ private final boolean mExtractNativeLibs;
+ /** Indicate whether this app is profileable by Shell */
+ private final boolean mProfileableByShell;
+ /**
+ * Indicate whether this package wants to run the dex within its APK but not extracted
+ * or locally compiled variants.
+ */
+ private final boolean mUseEmbeddedDex;
+
+ public PackageLite(String path, String baseApkPath, ApkLite baseApk,
+ String[] splitNames, boolean[] isFeatureSplits, String[] usesSplitNames,
+ String[] configForSplit, String[] splitApkPaths, int[] splitRevisionCodes) {
+ // The following paths may be different from the path in ApkLite because we
+ // move or rename the APK files. Use parameters to indicate the correct paths.
+ mPath = path;
+ mBaseApkPath = baseApkPath;
+ mPackageName = baseApk.getPackageName();
+ mVersionCode = baseApk.getVersionCode();
+ mVersionCodeMajor = baseApk.getVersionCodeMajor();
+ mInstallLocation = baseApk.getInstallLocation();
+ mVerifiers = baseApk.getVerifiers();
+ mBaseRevisionCode = baseApk.getRevisionCode();
+ mCoreApp = baseApk.isCoreApp();
+ mDebuggable = baseApk.isDebuggable();
+ mMultiArch = baseApk.isMultiArch();
+ mUse32bitAbi = baseApk.isUse32bitAbi();
+ mExtractNativeLibs = baseApk.isExtractNativeLibs();
+ mIsolatedSplits = baseApk.isIsolatedSplits();
+ mUseEmbeddedDex = baseApk.isUseEmbeddedDex();
+ mSplitRequired = baseApk.isSplitRequired();
+ mProfileableByShell = baseApk.isProfileableByShell();
+ mSplitNames = splitNames;
+ mIsFeatureSplits = isFeatureSplits;
+ mUsesSplitNames = usesSplitNames;
+ mConfigForSplit = configForSplit;
+ mSplitApkPaths = splitApkPaths;
+ mSplitRevisionCodes = splitRevisionCodes;
+ }
+
+ /**
+ * Return code path to the base APK file, and split APK files if any.
+ */
+ public List<String> getAllApkPaths() {
+ final ArrayList<String> paths = new ArrayList<>();
+ paths.add(mBaseApkPath);
+ if (!ArrayUtils.isEmpty(mSplitApkPaths)) {
+ Collections.addAll(paths, mSplitApkPaths);
+ }
+ return paths;
+ }
+
+ /**
+ * Return {@link #mVersionCode} and {@link #mVersionCodeMajor} combined together as a
+ * single long value. The {@link #mVersionCodeMajor} is placed in the upper 32 bits.
+ */
+ public long getLongVersionCode() {
+ return PackageInfo.composeLongVersionCode(mVersionCodeMajor, mVersionCode);
+ }
+
+
+
+ // Code below generated by codegen v1.0.22.
+ //
+ // DO NOT MODIFY!
+ // CHECKSTYLE:OFF Generated code
+ //
+ // To regenerate run:
+ // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/content/pm/parsing/PackageLite.java
+ //
+ // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+ // Settings > Editor > Code Style > Formatter Control
+ //@formatter:off
+
+
+ /**
+ * Name of the package as used to identify it in the system
+ */
+ @DataClass.Generated.Member
+ public @NonNull String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * Path where this package was found on disk. For monolithic packages
+ * this is path to single base APK file; for cluster packages this is
+ * path to the cluster directory.
+ */
+ @DataClass.Generated.Member
+ public @NonNull String getPath() {
+ return mPath;
+ }
+
+ /**
+ * Path of base APK
+ */
+ @DataClass.Generated.Member
+ public @NonNull String getBaseApkPath() {
+ return mBaseApkPath;
+ }
+
+ /**
+ * Paths of any split APKs, ordered by parsed splitName
+ */
+ @DataClass.Generated.Member
+ public @Nullable String[] getSplitApkPaths() {
+ return mSplitApkPaths;
+ }
+
+ /**
+ * Names of any split APKs, ordered by parsed splitName
+ */
+ @DataClass.Generated.Member
+ public @Nullable String[] getSplitNames() {
+ return mSplitNames;
+ }
+
+ /**
+ * Dependencies of any split APKs, ordered by parsed splitName
+ */
+ @DataClass.Generated.Member
+ public @Nullable String[] getUsesSplitNames() {
+ return mUsesSplitNames;
+ }
+
+ @DataClass.Generated.Member
+ public @Nullable String[] getConfigForSplit() {
+ return mConfigForSplit;
+ }
+
+ /**
+ * Major and minor version number of this package
+ */
+ @DataClass.Generated.Member
+ public int getVersionCodeMajor() {
+ return mVersionCodeMajor;
+ }
+
+ @DataClass.Generated.Member
+ public int getVersionCode() {
+ return mVersionCode;
+ }
+
+ /**
+ * Revision code of base APK
+ */
+ @DataClass.Generated.Member
+ public int getBaseRevisionCode() {
+ return mBaseRevisionCode;
+ }
+
+ /**
+ * Revision codes of any split APKs, ordered by parsed splitName
+ */
+ @DataClass.Generated.Member
+ public @Nullable int[] getSplitRevisionCodes() {
+ return mSplitRevisionCodes;
+ }
+
+ /**
+ * Indicate the install location of this package
+ *
+ * @see {@link PackageInfo#INSTALL_LOCATION_AUTO}
+ * @see {@link PackageInfo#INSTALL_LOCATION_INTERNAL_ONLY}
+ * @see {@link PackageInfo#INSTALL_LOCATION_PREFER_EXTERNAL}
+ */
+ @DataClass.Generated.Member
+ public int getInstallLocation() {
+ return mInstallLocation;
+ }
+
+ /**
+ * Information about a package verifiers as used during package verification
+ */
+ @DataClass.Generated.Member
+ public @NonNull VerifierInfo[] getVerifiers() {
+ return mVerifiers;
+ }
+
+ /**
+ * Indicate whether any split APKs that are features. Ordered by splitName
+ */
+ @DataClass.Generated.Member
+ public @Nullable boolean[] getIsFeatureSplits() {
+ return mIsFeatureSplits;
+ }
+
+ /**
+ * Indicate whether each split should be load into their own Context objects
+ */
+ @DataClass.Generated.Member
+ public boolean isIsolatedSplits() {
+ return mIsolatedSplits;
+ }
+
+ /**
+ * Indicate whether this package requires at least one split (either feature or resource)
+ * to be present in order to function
+ */
+ @DataClass.Generated.Member
+ public boolean isSplitRequired() {
+ return mSplitRequired;
+ }
+
+ /**
+ * Indicate whether this app is coreApp
+ */
+ @DataClass.Generated.Member
+ public boolean isCoreApp() {
+ return mCoreApp;
+ }
+
+ /**
+ * Indicate whether this app can be debugged
+ */
+ @DataClass.Generated.Member
+ public boolean isDebuggable() {
+ return mDebuggable;
+ }
+
+ /**
+ * Indicate whether this app needs to be loaded into other applications' processes
+ */
+ @DataClass.Generated.Member
+ public boolean isMultiArch() {
+ return mMultiArch;
+ }
+
+ /**
+ * Indicate whether the 32 bit version of the ABI should be used
+ */
+ @DataClass.Generated.Member
+ public boolean isUse32bitAbi() {
+ return mUse32bitAbi;
+ }
+
+ /**
+ * Indicate whether installer extracts native libraries
+ */
+ @DataClass.Generated.Member
+ public boolean isExtractNativeLibs() {
+ return mExtractNativeLibs;
+ }
+
+ /**
+ * Indicate whether this app is profileable by Shell
+ */
+ @DataClass.Generated.Member
+ public boolean isProfileableByShell() {
+ return mProfileableByShell;
+ }
+
+ /**
+ * Indicate whether this package wants to run the dex within its APK but not extracted
+ * or locally compiled variants.
+ */
+ @DataClass.Generated.Member
+ public boolean isUseEmbeddedDex() {
+ return mUseEmbeddedDex;
+ }
+
+ @DataClass.Generated(
+ time = 1610596639255L,
+ codegenVersion = "1.0.22",
+ sourceFile = "frameworks/base/core/java/android/content/pm/parsing/PackageLite.java",
+ inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mProfileableByShell\nprivate final boolean mUseEmbeddedDex\npublic java.util.List<java.lang.String> getAllApkPaths()\npublic long getLongVersionCode()\nclass PackageLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
+ @Deprecated
+ private void __metadata() {}
+
+
+ //@formatter:on
+ // End of generated code
+
+}
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 561a9e31b4b0..494b3cc1c28f 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -29,6 +29,7 @@ import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import android.annotation.AnyRes;
import android.annotation.CheckResult;
+import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -112,6 +113,8 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Arrays;
@@ -130,6 +133,82 @@ public class ParsingPackageUtils {
private static final String TAG = ParsingUtils.TAG;
+ public static final boolean DEBUG_JAR = false;
+ public static final boolean DEBUG_BACKUP = false;
+ public static final float DEFAULT_PRE_O_MAX_ASPECT_RATIO = 1.86f;
+
+ /** File name in an APK for the Android manifest. */
+ public static final String ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml";
+
+ /** Path prefix for apps on expanded storage */
+ public static final String MNT_EXPAND = "/mnt/expand/";
+
+ public static final String TAG_ADOPT_PERMISSIONS = "adopt-permissions";
+ public static final String TAG_APPLICATION = "application";
+ public static final String TAG_COMPATIBLE_SCREENS = "compatible-screens";
+ public static final String TAG_EAT_COMMENT = "eat-comment";
+ public static final String TAG_FEATURE_GROUP = "feature-group";
+ public static final String TAG_INSTRUMENTATION = "instrumentation";
+ public static final String TAG_KEY_SETS = "key-sets";
+ public static final String TAG_MANIFEST = "manifest";
+ public static final String TAG_ORIGINAL_PACKAGE = "original-package";
+ public static final String TAG_OVERLAY = "overlay";
+ public static final String TAG_PACKAGE = "package";
+ public static final String TAG_PACKAGE_VERIFIER = "package-verifier";
+ public static final String TAG_ATTRIBUTION = "attribution";
+ public static final String TAG_PERMISSION = "permission";
+ public static final String TAG_PERMISSION_GROUP = "permission-group";
+ public static final String TAG_PERMISSION_TREE = "permission-tree";
+ public static final String TAG_PROTECTED_BROADCAST = "protected-broadcast";
+ public static final String TAG_QUERIES = "queries";
+ public static final String TAG_RESTRICT_UPDATE = "restrict-update";
+ public static final String TAG_SUPPORT_SCREENS = "supports-screens";
+ public static final String TAG_SUPPORTS_INPUT = "supports-input";
+ public static final String TAG_USES_CONFIGURATION = "uses-configuration";
+ public static final String TAG_USES_FEATURE = "uses-feature";
+ public static final String TAG_USES_GL_TEXTURE = "uses-gl-texture";
+ public static final String TAG_USES_PERMISSION = "uses-permission";
+ public static final String TAG_USES_PERMISSION_SDK_23 = "uses-permission-sdk-23";
+ public static final String TAG_USES_PERMISSION_SDK_M = "uses-permission-sdk-m";
+ public static final String TAG_USES_SDK = "uses-sdk";
+ public static final String TAG_USES_SPLIT = "uses-split";
+ public static final String TAG_PROFILEABLE = "profileable";
+
+ public static final String METADATA_MAX_ASPECT_RATIO = "android.max_aspect";
+ public static final String METADATA_SUPPORTS_SIZE_CHANGES = "android.supports_size_changes";
+ public static final String METADATA_ACTIVITY_WINDOW_LAYOUT_AFFINITY =
+ "android.activity_window_layout_affinity";
+
+ public static final int SDK_VERSION = Build.VERSION.SDK_INT;
+ public static final String[] SDK_CODENAMES = Build.VERSION.ACTIVE_CODENAMES;
+
+ public static boolean sCompatibilityModeEnabled = true;
+ public static boolean sUseRoundIcon = false;
+
+ public static final int PARSE_DEFAULT_INSTALL_LOCATION =
+ PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
+ public static final int PARSE_DEFAULT_TARGET_SANDBOX = 1;
+
+ public static final int PARSE_MUST_BE_APK = 1 << 0;
+ public static final int PARSE_IGNORE_PROCESSES = 1 << 1;
+ public static final int PARSE_EXTERNAL_STORAGE = 1 << 3;
+ public static final int PARSE_IS_SYSTEM_DIR = 1 << 4;
+ public static final int PARSE_COLLECT_CERTIFICATES = 1 << 5;
+ public static final int PARSE_ENFORCE_CODE = 1 << 6;
+ public static final int PARSE_CHATTY = 1 << 31;
+
+ @IntDef(flag = true, prefix = { "PARSE_" }, value = {
+ PARSE_CHATTY,
+ PARSE_COLLECT_CERTIFICATES,
+ PARSE_ENFORCE_CODE,
+ PARSE_EXTERNAL_STORAGE,
+ PARSE_IGNORE_PROCESSES,
+ PARSE_IS_SYSTEM_DIR,
+ PARSE_MUST_BE_APK,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ParseFlags {}
+
/**
* For those names would be used as a part of the file name. Limits size to 223 and reserves 32
* for the OS.
diff --git a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
index 0d7198d4aa4a..f96bd5400cd2 100644
--- a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
+++ b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
@@ -21,6 +21,7 @@ import static android.content.pm.parsing.component.ComponentParseUtils.flag;
import android.annotation.NonNull;
import android.app.ActivityTaskManager;
+import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageParser;
import android.content.pm.parsing.ParsingPackage;
@@ -33,6 +34,7 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.os.Build;
+import android.util.ArraySet;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Slog;
@@ -50,12 +52,21 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
/** @hide */
public class ParsedActivityUtils {
private static final String TAG = ParsingUtils.TAG;
+ public static final boolean LOG_UNSAFE_BROADCASTS = false;
+
+ // Set of broadcast actions that are safe for manifest receivers
+ public static final Set<String> SAFE_BROADCASTS = new ArraySet<>();
+ static {
+ SAFE_BROADCASTS.add(Intent.ACTION_BOOT_COMPLETED);
+ }
+
@NonNull
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public static ParseResult<ParsedActivity> parseActivityOrReceiver(String[] separateProcesses,
diff --git a/core/java/android/content/pm/parsing/component/ParsedIntentInfoUtils.java b/core/java/android/content/pm/parsing/component/ParsedIntentInfoUtils.java
index a7a5c245914c..368dcfde3267 100644
--- a/core/java/android/content/pm/parsing/component/ParsedIntentInfoUtils.java
+++ b/core/java/android/content/pm/parsing/component/ParsedIntentInfoUtils.java
@@ -44,6 +44,8 @@ public class ParsedIntentInfoUtils {
private static final String TAG = ParsingUtils.TAG;
+ public static final boolean DEBUG = false;
+
@NonNull
public static ParseResult<ParsedIntentInfo> parseIntentInfo(String className,
ParsingPackage pkg, Resources res, XmlResourceParser parser, boolean allowGlobs,
diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java
index 8497525f85b3..e165ad694fcc 100644
--- a/core/java/android/hardware/SensorPrivacyManager.java
+++ b/core/java/android/hardware/SensorPrivacyManager.java
@@ -20,6 +20,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
@@ -40,14 +41,19 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
+@TestApi
@SystemService(Context.SENSOR_PRIVACY_SERVICE)
public final class SensorPrivacyManager {
- /** Microphone */
+ /** Microphone
+ * @hide */
+ @TestApi
public static final int INDIVIDUAL_SENSOR_MICROPHONE =
SensorPrivacyIndividualEnabledSensorProto.MICROPHONE;
- /** Camera */
+ /** Camera
+ * @hide */
+ @TestApi
public static final int INDIVIDUAL_SENSOR_CAMERA =
SensorPrivacyIndividualEnabledSensorProto.CAMERA;
@@ -66,6 +72,8 @@ public final class SensorPrivacyManager {
* A class implementing this interface can register with the {@link
* android.hardware.SensorPrivacyManager} to receive notification when the sensor privacy
* state changes.
+ *
+ * @hide
*/
public interface OnSensorPrivacyChangedListener {
/**
@@ -101,6 +109,8 @@ public final class SensorPrivacyManager {
/**
* Returns the single instance of the SensorPrivacyManager.
+ *
+ * @hide
*/
public static SensorPrivacyManager getInstance(Context context) {
synchronized (sInstanceLock) {
@@ -121,6 +131,8 @@ public final class SensorPrivacyManager {
* Sets sensor privacy to the specified state.
*
* @param enable the state to which sensor privacy should be set.
+ *
+ * @hide
*/
@RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
public void setSensorPrivacy(boolean enable) {
@@ -137,6 +149,8 @@ public final class SensorPrivacyManager {
*
* @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor
* privacy changes.
+ *
+ * @hide
*/
public void addSensorPrivacyListener(final OnSensorPrivacyChangedListener listener) {
synchronized (mListeners) {
@@ -166,6 +180,8 @@ public final class SensorPrivacyManager {
* @param sensor the sensor to listen to changes to
* @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor
* privacy changes.
+ *
+ * @hide
*/
public void addSensorPrivacyListener(@IndividualSensor int sensor,
final OnSensorPrivacyChangedListener listener) {
@@ -196,6 +212,8 @@ public final class SensorPrivacyManager {
*
* @param listener the OnSensorPrivacyChangedListener to be unregistered from notifications when
* sensor privacy changes.
+ *
+ * @hide
*/
public void removeSensorPrivacyListener(OnSensorPrivacyChangedListener listener) {
synchronized (mListeners) {
@@ -215,6 +233,8 @@ public final class SensorPrivacyManager {
* Returns whether sensor privacy is currently enabled.
*
* @return true if sensor privacy is currently enabled, false otherwise.
+ *
+ * @hide
*/
public boolean isSensorPrivacyEnabled() {
try {
@@ -228,7 +248,10 @@ public final class SensorPrivacyManager {
* Returns whether sensor privacy is currently enabled for a specific sensor.
*
* @return true if sensor privacy is currently enabled, false otherwise.
+ *
+ * @hide
*/
+ @TestApi
public boolean isIndividualSensorPrivacyEnabled(@IndividualSensor int sensor) {
try {
return mService.isIndividualSensorPrivacyEnabled(mContext.getUserId(), sensor);
@@ -242,7 +265,10 @@ public final class SensorPrivacyManager {
*
* @param sensor the sensor which to change the state for
* @param enable the state to which sensor privacy should be set.
+ *
+ * @hide
*/
+ @TestApi
@RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
public void setIndividualSensorPrivacy(@IndividualSensor int sensor,
boolean enable) {
@@ -259,7 +285,10 @@ public final class SensorPrivacyManager {
*
* @param sensor the sensor which to change the state for
* @param enable the state to which sensor privacy should be set.
+ *
+ * @hide
*/
+ @TestApi
@RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
public void setIndividualSensorPrivacyForProfileGroup(@IndividualSensor int sensor,
boolean enable) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 9db7ca0cad6b..9b570b7cdef9 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -8440,14 +8440,6 @@ public final class Settings {
"emergency_gesture_sound_enabled";
/**
- * The default number to call in emergency gesture
- *
- * @hide
- */
- public static final String EMERGENCY_GESTURE_CALL_NUMBER =
- "emergency_gesture_call_number";
-
- /**
* Whether the camera launch gesture to double tap the power button when the screen is off
* should be disabled.
*
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 4842aae1af73..25967b3ebcff 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -17914,6 +17914,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #setOutlineProvider(ViewOutlineProvider)
* @see #getClipToOutline()
*/
+ @RemotableViewMethod
public void setClipToOutline(boolean clipToOutline) {
damageInParent();
if (getClipToOutline() != clipToOutline) {
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 34e03af4c666..c235c82de720 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -218,6 +218,7 @@ public class ChooserActivity extends ResolverActivity implements
public static final int SELECTION_TYPE_STANDARD = 3;
public static final int SELECTION_TYPE_COPY = 4;
public static final int SELECTION_TYPE_NEARBY = 5;
+ public static final int SELECTION_TYPE_EDIT = 6;
private static final int SCROLL_STATUS_IDLE = 0;
private static final int SCROLL_STATUS_SCROLLING_VERTICAL = 1;
@@ -1197,6 +1198,37 @@ public class ChooserActivity extends ResolverActivity implements
}
@VisibleForTesting
+ protected @Nullable ComponentName getEditSharingComponent() {
+ String editorPackage = getApplicationContext().getString(R.string.config_systemImageEditor);
+ if (editorPackage == null || TextUtils.isEmpty(editorPackage)) {
+ return null;
+ }
+ return ComponentName.unflattenFromString(editorPackage);
+ }
+
+ @VisibleForTesting
+ protected TargetInfo getEditSharingTarget(Intent originalIntent) {
+ final ComponentName cn = getEditSharingComponent();
+
+ final Intent resolveIntent = new Intent(originalIntent);
+ resolveIntent.setComponent(cn);
+ resolveIntent.setAction(Intent.ACTION_EDIT);
+ final ResolveInfo ri = getPackageManager().resolveActivity(
+ resolveIntent, PackageManager.GET_META_DATA);
+ if (ri == null || ri.activityInfo == null) {
+ Log.e(TAG, "Device-specified image edit component (" + cn
+ + ") not available");
+ return null;
+ }
+
+ final DisplayResolveInfo dri = new DisplayResolveInfo(
+ originalIntent, ri, getString(R.string.screenshot_edit), "", resolveIntent, null);
+ dri.setDisplayIcon(getDrawable(R.drawable.ic_menu_edit));
+ return dri;
+ }
+
+
+ @VisibleForTesting
protected TargetInfo getNearbySharingTarget(Intent originalIntent) {
final ComponentName cn = getNearbySharingComponent();
if (cn == null) return null;
@@ -1282,6 +1314,27 @@ public class ChooserActivity extends ResolverActivity implements
return b;
}
+ private @Nullable Button createEditButton(Intent originalIntent) {
+ final TargetInfo ti = getEditSharingTarget(originalIntent);
+ if (ti == null) return null;
+
+ final Button b = createActionButton(
+ ti.getDisplayIcon(this),
+ ti.getDisplayLabel(),
+ (View unused) -> {
+ // Log share completion via edit
+ getChooserActivityLogger().logShareTargetSelected(
+ SELECTION_TYPE_EDIT,
+ "",
+ -1);
+ safelyStartActivity(ti);
+ finish();
+ }
+ );
+ b.setId(R.id.chooser_edit_button);
+ return b;
+ }
+
private void addActionButton(ViewGroup parent, Button b) {
if (b == null) return;
final ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
@@ -1378,6 +1431,7 @@ public class ChooserActivity extends ResolverActivity implements
(ViewGroup) contentPreviewLayout.findViewById(R.id.chooser_action_row);
//TODO: addActionButton(actionRow, createCopyButton());
addActionButton(actionRow, createNearbyButton(targetIntent));
+ addActionButton(actionRow, createEditButton(targetIntent));
mPreviewCoord = new ContentPreviewCoordinator(contentPreviewLayout, false);
diff --git a/core/java/com/android/internal/app/ChooserActivityLogger.java b/core/java/com/android/internal/app/ChooserActivityLogger.java
index 426859e1d527..c0cc483648fa 100644
--- a/core/java/com/android/internal/app/ChooserActivityLogger.java
+++ b/core/java/com/android/internal/app/ChooserActivityLogger.java
@@ -118,7 +118,9 @@ public interface ChooserActivityLogger {
@UiEvent(doc = "User selected the copy target.")
SHARESHEET_COPY_TARGET_SELECTED(235),
@UiEvent(doc = "User selected the nearby target.")
- SHARESHEET_NEARBY_TARGET_SELECTED(626);
+ SHARESHEET_NEARBY_TARGET_SELECTED(626),
+ @UiEvent(doc = "User selected the edit target.")
+ SHARESHEET_EDIT_TARGET_SELECTED(627);
private final int mId;
SharesheetTargetSelectedEvent(int id) {
@@ -140,6 +142,8 @@ public interface ChooserActivityLogger {
return SHARESHEET_COPY_TARGET_SELECTED;
case ChooserActivity.SELECTION_TYPE_NEARBY:
return SHARESHEET_NEARBY_TARGET_SELECTED;
+ case ChooserActivity.SELECTION_TYPE_EDIT:
+ return SHARESHEET_EDIT_TARGET_SELECTED;
default:
return INVALID;
}
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index cef5e1c91701..4828f3f3e7be 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Bel oor Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Bel oor mobiele netwerk"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Net Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nie aangestuur nie"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> na <xliff:g id="TIME_DELAY">{2}</xliff:g> sekondes"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 0d3939b1f996..9d87ddc0649e 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"በ Wi-Fi በኩል ደውል"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ከተንቀሳቃሽ ስልክ አውታረ መረብ በኩል ደውል"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi ብቻ"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>፡አልተላለፈም"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>፡<xliff:g id="DIALING_NUMBER">{1}</xliff:g> ከ<xliff:g id="TIME_DELAY">{2}</xliff:g> ሰከንዶች በኋላ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 3a4518e974a8..2a6d37956b9a 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -150,6 +150,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"‏الاتصال عبر Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"الاتصال عبر شبكة الجوّال"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"‏Wi-Fi فقط"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: لم تتم إعادة التوجيه"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> بعد <xliff:g id="TIME_DELAY">{2}</xliff:g> ثانية"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 3adb318dd8b0..aab590667b7b 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ৱাই-ফাইৰ জৰিয়তে কল কৰক"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ম’বাইল নেটৱৰ্কৰ জৰিয়তে কল কৰক"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"কোৱল ৱাই-ফাই"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ফৰৱাৰ্ড কৰা নহ\'ল"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> ছেকেণ্ডৰ পাছত"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index a223715f9d04..bcc9fe2882fc 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi ilə zəng edin"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Mobil şəbəkə ilə zəng edin"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Yalnız Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> saniyə sonra"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index aa7f6582aff4..753107737363 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -147,6 +147,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Pozivanje preko WiFi-a"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Poziv preko mobilne mreže"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Samo WiFi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije prosleđeno"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> nakon <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunde/i"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 8cc58a1a815d..93e0802b498c 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -148,6 +148,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Выклікаць праз Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Выклікаць праз мабільную сетку"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Толькі Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не пераадрасоўваецца"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> праз <xliff:g id="TIME_DELAY">{2}</xliff:g> с."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index ec29f3ed6125..08cab8d3b044 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Обаждане през Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Обаждане през мобилна мрежа"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Само Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Не е пренасочено"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> след <xliff:g id="TIME_DELAY">{2}</xliff:g> секунди"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 8dced4b23a6f..f3ad8daf6cfc 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ওয়াই-ফাইয়ের মাধ্যমে কল করুন"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"মোবাইল নেটওয়ার্কের মাধ্যমে কল করুন"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"শুধুমাত্র ওয়াই-ফাই"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ফরওয়ার্ড করা হয়নি"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> সেকেন্ড পরে"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 64b785a10b4b..d080d05f0464 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -147,6 +147,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Poziv putem WiFi-ja"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Poziv putem mobilne mreže"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Samo WiFi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije proslijeđen"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> za <xliff:g id="TIME_DELAY">{2}</xliff:g> sekundi"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 17a5039eb1c0..f7c27bcd20c8 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Trucades per Wi‑Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Trucades per la xarxa mòbil"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Només Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no s\'ha desviat"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> després de <xliff:g id="TIME_DELAY">{2}</xliff:g> segons"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index e51ec2247c74..16397185f8bb 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -148,6 +148,9 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Volání přes Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Volání přes mobilní síť"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Pouze Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <string name="crossSimFormat_spn_cross_sim_calling" msgid="779976494687695991">"<xliff:g id="SPN">%s</xliff:g> – volání napříč SIM kartami"</string>
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepřesměrováno"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> sek."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 19add07a2a83..7fb204251945 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Ring via Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Ring via mobilnetværk"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Kun Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderestillet"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> efter <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunder"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 410b597e4c6f..2e443e87ae41 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Anruf über WLAN"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Über Mobilfunknetz anrufen"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Nur WLAN"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nicht weitergeleitet"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g><xliff:g id="DIALING_NUMBER">{1}</xliff:g> nach <xliff:g id="TIME_DELAY">{2}</xliff:g> Sekunden."</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 7427216de3bf..e056b981e78d 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Κλήση μέσω Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Κλήση μέσω δικτύου κινητής τηλεφωνίας"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Μόνο Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Δεν προωθήθηκε"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> μετά από <xliff:g id="TIME_DELAY">{2}</xliff:g> δευτερόλεπτα"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index ae324be76520..88519df24e96 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Call over Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Call over mobile network"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi only"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> after <xliff:g id="TIME_DELAY">{2}</xliff:g> seconds"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 630a243df6a3..1baa7f9e805f 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Call over Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Call over mobile network"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi only"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> after <xliff:g id="TIME_DELAY">{2}</xliff:g> seconds"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 1a8f5c0fdffe..687afaedfb6e 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Call over Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Call over mobile network"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi only"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> after <xliff:g id="TIME_DELAY">{2}</xliff:g> seconds"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 65032676225d..db34264011ea 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Call over Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Call over mobile network"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi only"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> after <xliff:g id="TIME_DELAY">{2}</xliff:g> seconds"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 0d0b20463d2b..7d1d04d9f3d5 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -146,6 +146,9 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎Call over Wi-Fi‎‏‎‎‏‎"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎Call over mobile network‎‏‎‎‏‎"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎Wi-Fi only‎‏‎‎‏‎"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <string name="crossSimFormat_spn_cross_sim_calling" msgid="779976494687695991">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="SPN">%s</xliff:g>‎‏‎‎‏‏‏‎ Cross-SIM Calling‎‏‎‎‏‎"</string>
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>‎‏‎‎‏‏‏‎: Not forwarded‎‏‎‎‏‎"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>‎‏‎‎‏‏‏‎: ‎‏‎‎‏‏‎<xliff:g id="DIALING_NUMBER">{1}</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>‎‏‎‎‏‏‏‎: ‎‏‎‎‏‏‎<xliff:g id="DIALING_NUMBER">{1}</xliff:g>‎‏‎‎‏‏‏‎ after ‎‏‎‎‏‏‎<xliff:g id="TIME_DELAY">{2}</xliff:g>‎‏‎‎‏‏‏‎ seconds‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 1128479dad9c..528f7b966eac 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Llamar mediante Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Llamar mediante red móvil"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Solo Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no se ha remitido"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> después de <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 366c50657257..9c0ab18fe4d5 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Llamar a través de la red Wi‑Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Llamar a través de la red móvil"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Solo Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> transcurridos <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index d585452e2e00..8de5734d25a5 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Helista WiFi kaudu"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Helista mobiilsidevõrgu kaudu"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Ainult WiFi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: pole suunatud"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> sekundi pärast"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 4ba95bb81c27..5a944f3ce5c2 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Deitu wifi bidez"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Deitu sare mugikorraren bidez"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wifi-sarea soilik"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ez da desbideratu"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> zenbakira <xliff:g id="TIME_DELAY">{2}</xliff:g> segundotan"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 4c75ac522169..be27d7061ff4 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"‏تماس ازطریق Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"تماس ازطریق شبکه تلفن همراه"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"‏فقط Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: هدایت نشده"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> پس از <xliff:g id="TIME_DELAY">{2}</xliff:g> ثانیه"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 93b5ff1f8f44..dc2af5af505c 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Soita Wi-Fin kautta"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Soita mobiiliverkon kautta"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Vain Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ei siirretty"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunnin päästä"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index d3329d3123e8..c4bf3f7f23a9 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Appels par Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Appels sur réseau cellulaire"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi seulement"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g> au bout de <xliff:g id="TIME_DELAY">{2}</xliff:g> secondes"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 6c07066f380f..998845f88a65 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Appel via le Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Appel via le réseau mobile"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi uniquement"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g> au bout de <xliff:g id="TIME_DELAY">{2}</xliff:g> secondes"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index cab106acf713..8548506512ed 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Chama por wifi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Chama pola rede de telefonía móbil"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Só por wifi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: non desviada"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> tras <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 016e77b5970f..4f27856a2ad2 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"વાઇ-ફાઇ પરથી કૉલ કરો"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"મોબાઇલ નેટવર્ક પરથી કૉલ કરો"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"ફક્ત વાઇ-ફાઇ"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ફોરવર્ડ કર્યો નથી"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="TIME_DELAY">{2}</xliff:g> સેકન્ડ પછી <xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index a8afbbecf0c2..f374b9610fc1 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"वाई-फ़ाई के ज़रिए कॉल करें"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"मोबाइल नेटवर्क के ज़रिए कॉल"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"केवल वाई-फ़ाई"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अग्रेषित नहीं किया गया"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> सेकंड के बाद"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 625b3eda77b3..981fff4974ca 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -147,6 +147,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Pozivi putem Wi-Fija"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Pozivi putem mobilne mreže"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Samo Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije proslijeđeno"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> nakon <xliff:g id="TIME_DELAY">{2}</xliff:g> s"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 551043e7cb07..09ee61aa9007 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Hívás Wi-Fi-hálózaton"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Hívás mobilhálózaton"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Csak Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nincs átirányítva"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> másodperc után"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index f08c7f92e79e..0539da1f253f 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Զանգ Wi-Fi-ի միջոցով"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Զանգ բջջային ցանցի միջոցով"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Միայն Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>. Չի վերահասցեավորվել"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>. <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>. <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> վայրկյանից"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index a7a7cb859784..969145f5bb26 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Panggilan telepon melalui Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Panggilan telepon melalui jaringan seluler"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Khusus Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Tidak diteruskan"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> setelah <xliff:g id="TIME_DELAY">{2}</xliff:g> detik"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 2ca613c77297..7c7c4eb15ac6 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Hringja í gegnum Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Hringja í gegnum farsímakerfi"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi eingöngu"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ekki áframsent"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> eftir <xliff:g id="TIME_DELAY">{2}</xliff:g> sekúndur"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 4f7eea87ad95..170349351233 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Chiamata tramite Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Chiamata su rete mobile"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Solo Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: inoltro non effettuato"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g><xliff:g id="DIALING_NUMBER">{1}</xliff:g> dopo <xliff:g id="TIME_DELAY">{2}</xliff:g> secondi"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index be3e3c75d958..8a73d70112ab 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -148,6 +148,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"‏שיחה בחיבור Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"שיחה ברשת סלולרית"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"‏Wi-Fi בלבד"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ללא העברה"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> כעבור <xliff:g id="TIME_DELAY">{2}</xliff:g> שניות"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 658237d8dcb6..263c87e77d36 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi 経由で通話"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"モバイル ネットワーク経由で通話"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fiのみ"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:転送できません"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g> (<xliff:g id="TIME_DELAY">{2}</xliff:g>秒後)"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 6d9c12ba68db..7b616b4130ea 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"დარეკვა Wi-Fi-ის მეშვეობით"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"დარეკვა მობილური ქსელის მეშვეობით"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"მხოლოდ Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: არ არის გადამისამართებული"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> წამის შემდეგ"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index d57aca5de269..96cf9025551a 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi арқылы қоңырау шалу"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Мобильдік желі арқылы қоңырау шалу"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Тек Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Басқа нөмірге бағытталмады"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> секундтан кейін"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 362b7c01a223..8db1191b8db4 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ហៅទូរសព្ទ​តាមរយៈ Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ហៅទូរសព្ទ​តាមរយៈបណ្តាញ​ទូរសព្ទ​ចល័ត"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi តែប៉ុណ្ណោះ"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> ៖ មិន​បាន​បញ្ជូន​បន្ត"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> បន្ទាប់​ពី <xliff:g id="TIME_DELAY">{2}</xliff:g> វិនាទី"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index b7356e175c6b..8bd2f49a988d 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ವೈ-ಫೈ ಬಳಸಿ ಕರೆ ಮಾಡಿ"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ಮೊಬೈಲ್‌ ನೆಟ್‌ವರ್ಕ್ ಬಳಸಿ ಕರೆ ಮಾಡಿ"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"ವೈ-ಫೈ ಮಾತ್ರ"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ಫಾರ್ವರ್ಡ್ ಮಾಡಲಾಗಿಲ್ಲ"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g> ಸೆಕೆಂಡುಗಳ ನಂತರ <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 31837a3efdcf..d812de901d25 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi를 통해 통화"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"모바일 네트워크를 통해 통화"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi에서만"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: 착신전환 안됨"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g><xliff:g id="TIME_DELAY">{2}</xliff:g>초 후"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 4211beded4aa..acd46cedcf3f 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi аркылуу чалуу"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Мобилдик тармак аркылуу чалуу"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi гана"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Багытталган эмес"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> секунддан кийин"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 0646254ef229..ceee938315b0 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ໂທຜ່ານ Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ໂທຜ່ານເຄືອຂ່າຍມືຖື"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi​-Fi ເທົ່າ​ນັ້ນ"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ບໍ່ຖືກສົ່ງຕໍ່"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> ຫຼັງຈາກ <xliff:g id="TIME_DELAY">{2}</xliff:g> ວິນາທີ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index d83506e09cb8..f260ebe47b23 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -148,6 +148,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Skambinimas naudojant „Wi-Fi“"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Skambinimas naudojant mobiliojo ryšio tinklą"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Tik „Wi-Fi“"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: neperadresuota"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> sek."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 68609cec9fba..5fe3733a9064 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -147,6 +147,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Zvani Wi-Fi tīklā"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Zvani mobilajā tīklā"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Tikai Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nav pāradresēts"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> pēc <xliff:g id="TIME_DELAY">{2}</xliff:g> sekundes(-ēm)"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index c41b56c5651e..b7536b427ed8 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Повикувај преку Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Повикувај преку мобилна мрежа"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Само Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не е препратено"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> по <xliff:g id="TIME_DELAY">{2}</xliff:g> секунди"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 30c0d03350fd..5d18f8213cc7 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"വൈഫൈ മുഖേനയുള്ള കോൾ"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"മൊബൈൽ നെറ്റ്‌വർക്ക് മുഖേനയുള്ള കോൾ"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"വൈഫൈ മാത്രം"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: കൈമാറിയില്ല"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g> നിമിഷത്തിനുശേഷം <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 2966035433be..4b1b1b8b2569 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -49,10 +49,10 @@
<string name="invalidPuk" msgid="8831151490931907083">"8-с цөөнгүй тооноос бүтэх PUK-г бичнэ үү."</string>
<string name="needPuk" msgid="7321876090152422918">"SIM картны PUK-түгжигдсэн. Тайлах бол PUK кодыг бичнэ үү."</string>
<string name="needPuk2" msgid="7032612093451537186">"SIM картыг блокоос гаргах бол PUK2-г бичнэ үү."</string>
- <string name="enablePin" msgid="2543771964137091212">"Амжилтгүй боллоо, СИМ/РҮИМ түгжээг идэвхжүүлнэ үү."</string>
+ <string name="enablePin" msgid="2543771964137091212">"Амжилтгүй боллоо, SIM/РҮИМ түгжээг идэвхжүүлнэ үү."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
- <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="other">Таны SIM түгжигдэхээс өмнө танд <xliff:g id="NUMBER_1">%d</xliff:g> оролдлого хийх боломж үлдлээ. </item>
+ <item quantity="one">Таны SIM түгжигдэхээс өмнө танд <xliff:g id="NUMBER_0">%d</xliff:g> оролдлого хийх боломж үлдлээ. </item>
</plurals>
<string name="imei" msgid="2157082351232630390">"IMEI"</string>
<string name="meid" msgid="3291227361605924674">"MEID"</string>
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi-р залгах"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Мобайл сүлжээгээр дуудлага хийх"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Зөвхөн Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: дамжуулагдаагүй"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> секундын дараа"</string>
@@ -809,7 +813,7 @@
<string name="relationTypeAssistant" msgid="4057605157116589315">"Туслагч"</string>
<string name="relationTypeBrother" msgid="7141662427379247820">"Ах"</string>
<string name="relationTypeChild" msgid="9076258911292693601">"Хүүхэд"</string>
- <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"Дотоод Түнш"</string>
+ <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"Хамтран амьдрагч"</string>
<string name="relationTypeFather" msgid="3856225062864790596">"Эцэг"</string>
<string name="relationTypeFriend" msgid="3192092625893980574">"Найз"</string>
<string name="relationTypeManager" msgid="2272860813153171857">"Менежер"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index b65a31667ce0..a5577c8aaa70 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"वाय-फायवरून कॉल करा"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"मोबाइल नेटवर्कवरून कॉल करा"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"केवळ वाय-फाय"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अग्रेषित केला नाही"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g> सेकंदांनंतर <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -394,9 +398,9 @@
<string name="permlab_writeSettings" msgid="8057285063719277394">"सिस्टम सेटिंग्ज सुधारित करा"</string>
<string name="permdesc_writeSettings" msgid="8293047411196067188">"सिस्टीमचा सेटिंग्ज डेटा सुधारित करण्यासाठी अ‍ॅप ला अनुमती देते. दुर्भावनापूर्ण अ‍ॅप्स आपल्या सिस्टीमचे कॉंफिगरेशन दूषित करू शकतात."</string>
<string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"सुरूवातीस चालवा"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"जसे सिस्टम बूट करणे समाप्त करते तसे अ‍ॅप ला स्वतः प्रारंभ करण्यास अनुमती देते. यामुळे टॅबलेट प्रारंभ करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर टॅबलेटला धीमे करण्यास अ‍ॅप ला अनुमती देते."</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"जसे सिस्टम बूट करणे समाप्त करते तसे अ‍ॅप ला स्वतः सुरू करण्यास अनुमती देते. यामुळे टॅबलेट सुरू करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर टॅबलेटला धीमे करण्यास अ‍ॅप ला अनुमती देते."</string>
<string name="permdesc_receiveBootCompleted" product="tv" msgid="4900842256047614307">"सिस्टम बूट होणे संपल्यावर ॲपला स्वतः सुरू होण्याची अनुमती देते. यामुळे तुमच्या Android TV डिव्हाइसला सुरू होण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर डिव्हाइसलाच धीमे करण्याची अनुमती ॲपला देते."</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"जसे सिस्टम बूट करणे समाप्त करते तसे अ‍ॅप ला स्वतः प्रारंभ करण्यास अनुमती देते. यामुळे फोन प्रारंभ करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर फोनला धीमे करण्यास अ‍ॅप ला अनुमती देते."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"जसे सिस्टम बूट करणे समाप्त करते तसे अ‍ॅप ला स्वतः सुरू करण्यास अनुमती देते. यामुळे फोन सुरू करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर फोनला धीमे करण्यास अ‍ॅप ला अनुमती देते."</string>
<string name="permlab_broadcastSticky" msgid="4552241916400572230">"रोचक प्रसारण पाठवा"</string>
<string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"रोचक प्रसारणे पाठविण्यासाठी अ‍ॅप ला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो टॅब्लेटला धीमा किंवा अस्थिर करू शकतो."</string>
<string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"चिकट प्रसारणे पाठविण्यासाठी ॲपला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो तुमच्या Android TV डिव्हाइसला धीमा किंवा अस्थिर करू शकतो."</string>
@@ -910,7 +914,7 @@
<string name="keyguard_accessibility_status" msgid="6792745049712397237">"स्थिती"</string>
<string name="keyguard_accessibility_camera" msgid="7862557559464986528">"कॅमेरा"</string>
<string name="keygaurd_accessibility_media_controls" msgid="2267379779900620614">"मीडिया नियंत्रणे"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="7066213328912939191">"विजेट पुनर्क्रमित करणे प्रारंभ झाले."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="7066213328912939191">"विजेट पुनर्क्रमित करणे सुरू झाले."</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="1083806817600593490">"विजेट पुनर्क्रमित करणे समाप्त झाले."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="1509738950119878705">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> हटविले."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"अनलॉक क्षेत्र विस्तृत करा."</string>
@@ -1203,7 +1207,7 @@
<string name="android_upgrading_title" product="tablet" msgid="4268417249079938805">"टॅबलेट अपडेट होत आहे…"</string>
<string name="android_upgrading_title" product="device" msgid="6774767702998149762">"डिव्‍हाइस अपडेट होत आहे…"</string>
<string name="android_start_title" product="default" msgid="4036708252778757652">"फोन सुरू होत आहे…"</string>
- <string name="android_start_title" product="automotive" msgid="7917984412828168079">"Android प्रारंभ करत आहे…"</string>
+ <string name="android_start_title" product="automotive" msgid="7917984412828168079">"Android सुरू करत आहे…"</string>
<string name="android_start_title" product="tablet" msgid="4429767260263190344">"टॅबलेट सुरू होत आहे…"</string>
<string name="android_start_title" product="device" msgid="6967413819673299309">"डिव्‍हाइस सुरू होत आहे…"</string>
<string name="android_upgrading_fstrim" msgid="3259087575528515329">"संचयन ऑप्टिमाइझ करत आहे."</string>
@@ -1211,7 +1215,7 @@
<string name="app_upgrading_toast" msgid="1016267296049455585">"<xliff:g id="APPLICATION">%1$s</xliff:g> श्रेणीसुधारित करत आहे…"</string>
<string name="android_upgrading_apk" msgid="1339564803894466737">"<xliff:g id="NUMBER_1">%2$d</xliff:g> पैकी <xliff:g id="NUMBER_0">%1$d</xliff:g> अ‍ॅप ऑप्टिमाइझ करत आहे."</string>
<string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> तयार करत आहे."</string>
- <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"अ‍ॅप्स प्रारंभ करत आहे."</string>
+ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"अ‍ॅप्स सुरू करत आहे."</string>
<string name="android_upgrading_complete" msgid="409800058018374746">"बूट समाप्त होत आहे."</string>
<string name="heavy_weight_notification" msgid="8382784283600329576">"रन होणारे <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="heavy_weight_notification_detail" msgid="6802247239468404078">"गेमवर परत जाण्यासाठी टॅप करा"</string>
@@ -1288,7 +1292,7 @@
<string name="sms_short_code_confirm_always_allow" msgid="2223014893129755950">"नेहमी अनुमती द्या"</string>
<string name="sms_short_code_confirm_never_allow" msgid="2688828813521652079">"कधीही अनुमती देऊ नका"</string>
<string name="sim_removed_title" msgid="5387212933992546283">"सिम कार्ड काढले"</string>
- <string name="sim_removed_message" msgid="9051174064474904617">"तुम्ही एक वैध सिम कार्ड घालून प्रारंभ करेपर्यंत मोबाइल नेटवर्क अनुपलब्ध असेल."</string>
+ <string name="sim_removed_message" msgid="9051174064474904617">"तुम्ही एक वैध सिम कार्ड घालून सुरू करेपर्यंत मोबाइल नेटवर्क अनुपलब्ध असेल."</string>
<string name="sim_done_button" msgid="6464250841528410598">"पूर्ण झाले"</string>
<string name="sim_added_title" msgid="7930779986759414595">"सिम कार्ड जोडले"</string>
<string name="sim_added_message" msgid="6602906609509958680">"मोबाइल नेटवर्कवर अ‍ॅक्सेस करण्यासाठी तुमचे डिव्हाइस रीस्टार्ट करा."</string>
@@ -1917,7 +1921,7 @@
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ला अनपिन करा"</string>
<string name="app_info" msgid="6113278084877079851">"अ‍ॅप माहिती"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="demo_starting_message" msgid="6577581216125805905">"डेमो प्रारंभ करत आहे..."</string>
+ <string name="demo_starting_message" msgid="6577581216125805905">"डेमो सुरू करत आहे..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"डिव्हाइस रीसेट करत आहे..."</string>
<string name="suspended_widget_accessibility" msgid="6331451091851326101">"<xliff:g id="LABEL">%1$s</xliff:g> अक्षम केले"</string>
<string name="conference_call" msgid="5731633152336490471">"कॉंफरन्स कॉल"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f45f32e25f43..afd49eece2e5 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Panggil melalui Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Panggil melalui rangkaian mudah alih"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi sahaja"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Tidak dimajukan"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> selepas <xliff:g id="TIME_DELAY">{2}</xliff:g> saat"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 0cc4d8eee2b3..657a1d31c65a 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi သုံး၍ ခေါ်ဆိုသည်"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"မိုဘိုင်းကွန်ရက်သုံး၍ ခေါ်ဆိုသည်"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"ကြိုးမဲ့အင်တာနက် သာလျှင်"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> နောက် <xliff:g id="TIME_DELAY">{2}</xliff:g> စက္ကန့်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 601c6fb9f0d9..8eed7f5e7183 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Ring via Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Ring over mobilnettverk"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Bare Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderekoblet"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> etter <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunder"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index e53a519cc2a1..b813d9e516b2 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi मार्फत कल गर्नुहोस्"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"मोबाइल नेटवर्कमार्फत कल गर्नुहोस्"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi मात्र"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अगाडि पठाइएको छैन"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> पछि <xliff:g id="TIME_DELAY">{2}</xliff:g> सेकेन्ड"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 37eb0254580e..9ef66df0064d 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Bellen via wifi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Bellen via mobiel netwerk"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Alleen wifi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: niet doorgeschakeld"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> na <xliff:g id="TIME_DELAY">{2}</xliff:g> seconden"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 2124d49474b4..a2c375973057 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ୱାଇ-ଫାଇ ମାଧ୍ୟମରେ କଲ୍ କରନ୍ତୁ"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ମୋବାଇଲ ନେଟ୍‌ୱର୍କ ମାଧ୍ୟମରେ କଲ୍ କରନ୍ତୁ"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"କେବଳ ୱାଇ-ଫାଇ"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ଫରୱାର୍ଡ କରାଯାଇନାହିଁ"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> ସେକେଣ୍ଡ ପରେ"</string>
@@ -1124,9 +1128,9 @@
<string name="app_running_notification_title" msgid="8985999749231486569">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଚାଲୁଛି"</string>
<string name="app_running_notification_text" msgid="5120815883400228566">"ଅଧିକ ସୂଚନା ପାଇଁ କିମ୍ବା ଆପ୍‍ ବନ୍ଦ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ।"</string>
<string name="ok" msgid="2646370155170753815">"ଠିକ୍‍ ଅଛି"</string>
- <string name="cancel" msgid="6908697720451760115">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
+ <string name="cancel" msgid="6908697720451760115">"ବାତିଲ୍‍ କରନ୍ତୁ"</string>
<string name="yes" msgid="9069828999585032361">"ଠିକ୍‍ ଅଛି"</string>
- <string name="no" msgid="5122037903299899715">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
+ <string name="no" msgid="5122037903299899715">"ବାତିଲ୍‍ କରନ୍ତୁ"</string>
<string name="dialog_alert_title" msgid="651856561974090712">"ଧ୍ୟାନଦିଅନ୍ତୁ"</string>
<string name="loading" msgid="3138021523725055037">"ଲୋଡ୍ କରାଯାଉଛି…"</string>
<string name="capital_on" msgid="2770685323900821829">"ଚାଲୁ"</string>
@@ -1282,7 +1286,7 @@
<string name="sms_short_code_details" msgid="2723725738333388351">"ଏହା ଦ୍ୱାରା "<b>" ଆପଣଙ୍କ ମୋବାଇଲ୍ ଆକାଉଣ୍ଟରୁ ପଇସା କଟିପାରେ। "</b></string>
<string name="sms_premium_short_code_details" msgid="1400296309866638111"><b>" ଆପଣଙ୍କ ମୋବାଇଲ୍ ଆକାଉଣ୍ଟରୁ ପଇସା କଟିପାରେ। "</b></string>
<string name="sms_short_code_confirm_allow" msgid="920477594325526691">"ପଠାନ୍ତୁ"</string>
- <string name="sms_short_code_confirm_deny" msgid="1356917469323768230">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
+ <string name="sms_short_code_confirm_deny" msgid="1356917469323768230">"ବାତିଲ୍‍ କରନ୍ତୁ"</string>
<string name="sms_short_code_remember_choice" msgid="1374526438647744862">"ମୋ ପସନ୍ଦ ମନେରଖନ୍ତୁ"</string>
<string name="sms_short_code_remember_undo_instruction" msgid="2620984439143080410">"ଏହାକୁ ଆପଣ ସେଟିଙ୍ଗ ଓ ଆପ୍‍ରେ ପରବର୍ତ୍ତୀ ସମୟରେ ବଦଳାଇପାରିବେ"</string>
<string name="sms_short_code_confirm_always_allow" msgid="2223014893129755950">"ସର୍ବଦା ଅନୁମତି ଦିଅନ୍ତୁ"</string>
@@ -1500,7 +1504,7 @@
<string name="date_picker_prev_month_button" msgid="3418694374017868369">"ପୂର୍ବ ମାସ"</string>
<string name="date_picker_next_month_button" msgid="4858207337779144840">"ପରବର୍ତ୍ତୀ ମାସ"</string>
<string name="keyboardview_keycode_alt" msgid="8997420058584292385">"ALT"</string>
- <string name="keyboardview_keycode_cancel" msgid="2134624484115716975">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
+ <string name="keyboardview_keycode_cancel" msgid="2134624484115716975">"ବାତିଲ୍‍ କରନ୍ତୁ"</string>
<string name="keyboardview_keycode_delete" msgid="2661117313730098650">"ଡିଲିଟ୍‍ କରନ୍ତୁ"</string>
<string name="keyboardview_keycode_done" msgid="2524518019001653851">"ହୋଇଗଲା"</string>
<string name="keyboardview_keycode_mode_change" msgid="2743735349997999020">"ମୋଡ୍‍ ପରିବର୍ତ୍ତନ"</string>
@@ -1761,7 +1765,7 @@
<string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
<string name="mediasize_unknown_portrait" msgid="3817016220446495613">"ଅଜଣା ପୋର୍ଟ୍ରେଟ୍‍"</string>
<string name="mediasize_unknown_landscape" msgid="1584741567225095325">"ଅଜଣା ଲ୍ୟାଣ୍ଡସ୍କେପ୍‌"</string>
- <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"କ୍ୟାନ୍ସଲ୍‍ କରାଗଲା"</string>
+ <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ବାତିଲ୍‍ କରାଗଲା"</string>
<string name="write_fail_reason_cannot_write" msgid="432118118378451508">"କଣ୍ଟେଣ୍ଟ ଲେଖିବାବେଳେ ତ୍ରୁଟି"</string>
<string name="reason_unknown" msgid="5599739807581133337">"ଅଜଣା"</string>
<string name="reason_service_unavailable" msgid="5288405248063804713">"ପ୍ରିଣ୍ଟ ସେବାକୁ ସକ୍ଷମ କରାଯାଇନାହିଁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 4518a3bfe535..3ceb626a52b4 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ਵਾਈ-ਫਾਈ \'ਤੇ ਕਾਲ ਕਰੋ"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੋਂ ਕਾਲ ਕਰੋ"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"ਸਿਰਫ਼ ਵਾਈ-ਫਾਈ"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ਅੱਗੇ ਨਹੀਂ ਭੇਜਿਆ ਗਿਆ"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> ਸਕਿੰਟਾਂ ਬਾਅਦ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index cfcc2d529e7b..6849333bd894 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -148,6 +148,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Rozmowa przez Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Połączenia przez sieć komórkową"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Tylko Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> sekundach"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index e4092fdf512b..84e5a738aa90 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Chamar via Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Chamar via rede móvel"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Somente Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não encaminhado"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> após <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index d5c3c026514e..507d759140bd 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -146,6 +146,9 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Chamada por Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Chamada por rede móvel"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Apenas Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <string name="crossSimFormat_spn_cross_sim_calling" msgid="779976494687695991">"<xliff:g id="SPN">%s</xliff:g> Chamadas com vários cartões SIM"</string>
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não reencaminhado"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> após <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index e4092fdf512b..84e5a738aa90 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Chamar via Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Chamar via rede móvel"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Somente Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não encaminhado"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> após <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index b2d2d24002b4..4b1d3ac4e779 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -147,6 +147,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Apelați prin Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Apelați prin rețeaua mobilă"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Numai Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: neredirecționată"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> după <xliff:g id="TIME_DELAY">{2}</xliff:g> secunde"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index a4d249a63810..1588c2b82e0b 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -148,6 +148,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Звонить по Wi‑Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Звонить по мобильной сети"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Только Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не переадресовано"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> через <xliff:g id="TIME_DELAY">{2}</xliff:g> с."</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 4277a0decfa4..db0d5add1e78 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi ඔස්සේ ඇමතුම"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ජංගම ජාලය ඔස්සේ ඇමතුම"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi පමණයි"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ඉදිරියට නොයවන ලදි"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: තත්පර <xliff:g id="TIME_DELAY">{2}</xliff:g> ට පසුව <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 5f6d557bcf23..546a64b13b5a 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -148,6 +148,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Volanie cez Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Volanie cez mobilnú sieť"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Len Wi‑Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepresmerované"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> s"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 0d77c61f4c21..a15676d1b9cd 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -148,6 +148,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Klic prek omrežja Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Klic prek mobilnega omrežja"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Samo Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ni posredovano"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po toliko sekundah: <xliff:g id="TIME_DELAY">{2}</xliff:g>"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 218412bed05c..cc694fa87095 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Telefono nëpërmjet Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Telefono nëpërmjet rrjetit celular"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Vetëm Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nuk u transferua"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> pas <xliff:g id="TIME_DELAY">{2}</xliff:g> sekondash"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index e944e8b57846..5cadfd5fed45 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -147,6 +147,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Позивање преко WiFi-а"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Позив преко мобилне мреже"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Само WiFi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Није прослеђено"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> након <xliff:g id="TIME_DELAY">{2}</xliff:g> секунде/и"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 2acc051a1712..bba8700c614b 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Ring via Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Ring via mobilnätverk"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Endast Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Vidarebefordras inte"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g><xliff:g id="DIALING_NUMBER">{1}</xliff:g> efter <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunder"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 079d71c86e3a..3525ceb1db8e 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Piga simu ukitumia WI-FI"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Piga ukitumia mtandao wa simu"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi pekee"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Haijatumiwa mwingine"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> baada ya sekunde <xliff:g id="TIME_DELAY">{2}</xliff:g>"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index ec9c0a73ec88..61eac8197edf 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"வைஃபை மூலம் அழை"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"மொபைல் நெட்வொர்க் மூலமாக அழை"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"வைஃபை மட்டும்"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: பகிரப்படவில்லை"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g> வினாடிகளுக்குப் பிறகு <xliff:g id="DIALING_NUMBER">{1}</xliff:g> ஐப் பகிர்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 6483db1ea8cb..666e9801b27a 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi ద్వారా కాల్"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"మొబైల్ నెట్‌వర్క్ ద్వారా కాల్"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi మాత్రమే"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ఫార్వార్డ్ చేయబడలేదు"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g> సెకన్ల తర్వాత <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 094b6c8cbbe4..5c6b7df6e9e3 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"โทรผ่าน Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"โทรผ่านเครือข่ายมือถือ"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi เท่านั้น"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ไม่ได้โอนสาย"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> หลังผ่านไป <xliff:g id="TIME_DELAY">{2}</xliff:g> วินาที"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 09ace932ad42..d27757cdad1c 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Tumawag gamit ang Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Tumawag gamit ang mobile network"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi lang"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Hindi naipasa"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> pagkatapos ng <xliff:g id="TIME_DELAY">{2}</xliff:g> (na) segundo"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index af10694a729e..6c5ea97a5fbc 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Kablosuz ağ üzerinden arama"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Mobil ağ üzerinden arama"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Yalnızca kablosuz"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönlendirilmedi"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g> saniye sonra <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index f264fbb17bd6..6ae2e8e318ee 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -148,6 +148,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Телефонувати через Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Телефонувати через мобільну мережу"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Лише Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не переслано"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> після <xliff:g id="TIME_DELAY">{2}</xliff:g> сек."</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 37cb12a7d817..ae7f801a4e00 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"‏Wi-Fi پر کال کریں"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"موبائل نیٹ ورک پر کال کریں"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"‏صرف Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : فارورڈ نہیں کی گئی"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> بعد از <xliff:g id="TIME_DELAY">{2}</xliff:g> سیکنڈ"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 23fd462be7b0..9bfb68f0cc6e 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi orqali chaqiruv"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Mobil tarmoq orqali chaqiruv"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Faqat Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yo‘naltirilmadi"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> soniyadan so‘ng"</string>
@@ -1278,15 +1282,15 @@
<string name="sms_control_message" msgid="6574313876316388239">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; katta miqdordagi SMS xabarlarini jo‘natmoqda. Ushbu ilovaga xabarlar jo‘natishni davom ettirishga ruxsat berasizmi?"</string>
<string name="sms_control_yes" msgid="4858845109269524622">"Ruxsat berish"</string>
<string name="sms_control_no" msgid="4845717880040355570">"Rad etish"</string>
- <string name="sms_short_code_confirm_message" msgid="1385416688897538724">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;ga xabar jo‘natishni xohlaydi."</string>
- <string name="sms_short_code_details" msgid="2723725738333388351">"Bunda, mobil hisobingizdan "<b>"to‘lov olinishi mumkin"</b>"."</string>
- <string name="sms_premium_short_code_details" msgid="1400296309866638111"><b>"Bunda, mobil hisobingizdan to‘lov olinishi mumkin."</b></string>
+ <string name="sms_short_code_confirm_message" msgid="1385416688897538724">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ilovasi &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; raqamiga xabar yubormoqchi."</string>
+ <string name="sms_short_code_details" msgid="2723725738333388351">"Mobil aloqa hisobingizdan "<b>"pul olinishi mumkin"</b>"."</string>
+ <string name="sms_premium_short_code_details" msgid="1400296309866638111"><b>"Mobil aloqa hisobingizdan pul olinishi mumkin."</b></string>
<string name="sms_short_code_confirm_allow" msgid="920477594325526691">"Yuborish"</string>
<string name="sms_short_code_confirm_deny" msgid="1356917469323768230">"Bekor qilish"</string>
<string name="sms_short_code_remember_choice" msgid="1374526438647744862">"Tanlovim eslab qolinsin"</string>
- <string name="sms_short_code_remember_undo_instruction" msgid="2620984439143080410">"Siz buni keyinroq sozlamalar &gt; ilovalar menusidan o‘zgartirishingiz mumkin"</string>
- <string name="sms_short_code_confirm_always_allow" msgid="2223014893129755950">"Doimo ruxsat berilsin"</string>
- <string name="sms_short_code_confirm_never_allow" msgid="2688828813521652079">"Hech qachon ruxsat berilmasin"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="2620984439143080410">"Buni keyinroq Sozlamalar &gt; Ilovalar menyusidan o‘zgartirishingiz mumkin"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="2223014893129755950">"Doim ruxsat"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="2688828813521652079">"Ruxsat berilmasin"</string>
<string name="sim_removed_title" msgid="5387212933992546283">"SIM karta olib tashlandi"</string>
<string name="sim_removed_message" msgid="9051174064474904617">"Ishlaydigan SIM kartani qo‘yib, qurilmangizni qaytadan ishga tushirmasangiz, mobayl tarmoq mavjud bo‘lmaydi."</string>
<string name="sim_done_button" msgid="6464250841528410598">"Tayyor"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index bfc509ad2a0c..e11291c03ae0 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Gọi qua Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Gọi qua mạng di động"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Chỉ Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Không được chuyển tiếp"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> sau <xliff:g id="TIME_DELAY">{2}</xliff:g> giây"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 85a7dae19de4..694014082b3c 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"通过 WLAN 进行通话"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"通过移动网络进行通话"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"仅限 WLAN"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:无法转接"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="TIME_DELAY">{2}</xliff:g>秒后<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 6d06e68c92a4..1955b315f7d6 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"使用 Wi-Fi 通話"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"使用流動網絡通話"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"只限 Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:尚未轉接"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> 於 <xliff:g id="TIME_DELAY">{2}</xliff:g> 秒後轉接"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 5ba35c7ae4d7..b95974da0443 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"透過 Wi-Fi 進行通話"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"透過行動網路進行通話"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"只限 Wi-Fi"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未轉接"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="TIME_DELAY">{2}</xliff:g> 秒後 <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index b391b4d8239f..58607f02acc2 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -146,6 +146,10 @@
<string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Ikholi esebenza nge-Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Shaya ngenethiwekhi yeselula"</string>
<string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"I-Wi-Fi kuphela"</string>
+ <!-- no translation found for crossSimFormat_spn (9125246077491634262) -->
+ <skip />
+ <!-- no translation found for crossSimFormat_spn_cross_sim_calling (779976494687695991) -->
+ <skip />
<string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Akudlulisiwe"</string>
<string name="cfTemplateForwarded" msgid="9132506315842157860">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="735042369233323609">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> emuva kwamasekhondi angu-<xliff:g id="TIME_DELAY">{2}</xliff:g>"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index ef54db1a422c..be7ecfc00f01 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -9013,6 +9013,11 @@
changed at runtime by calling
{@link android.media.tv.TvInputManager#updateTvInputInfo(android.media.tv.TvInputInfo)}. -->
<attr name="tunerCount" format="integer" />
+ <!-- Attribute whether the TV input service can pause recording programs.
+ This value can be changed at runtime by calling
+ {@link android.media.tv.TvInputManager#updateTvInputInfo(android.media.tv.TvInputInfo)}
+ . -->
+ <attr name="canPauseRecording" format="boolean" />
</declare-styleable>
<!-- Attributes that can be used with <code>rating-system-definition</code> tags inside of the
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 110e77a8aa05..89407763a9b6 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -234,4 +234,78 @@
<color name="personal_apps_suspension_notification_color">#1A73E8</color>
<color name="conversation_important_highlight">#F9AB00</color>
+
+ <!-- Lightest shade of the main color used by the system. White.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_0">#ffffff</color>
+ <!-- Shade of the main system color at 95% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_50">#ebf1f8</color>
+ <!-- Shade of the main system color at 90% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_100">#dde3ea</color>
+ <!-- Shade of the main system color at 80% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_200">#c1c7cd</color>
+ <!-- Shade of the main system color at 70% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_300">#a6acb2</color>
+ <!-- Shade of the main system color at 60% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_400">#8b9197</color>
+ <!-- Shade of the main system color at 50% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_500">#72787d</color>
+ <!-- Shade of the main system color at 40% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_600">#595f64</color>
+ <!-- Shade of the main system color at 30% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_700">#42474d</color>
+ <!-- Shade of the main system color at 20% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_800">#2c3136</color>
+ <!-- Shade of the main system color at 10% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_900">#171c21</color>
+ <!-- Darkest shade of the main color used by the system. Black.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_main_1000">#000000</color>
+
+ <!-- Lightest shade of the accent color used by the system. White.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_0">#ffffff</color>
+ <!-- Shade of the accent system color at 95% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_50">#91fff4</color>
+ <!-- Shade of the accent system color at 90% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_100">#83f6e5</color>
+ <!-- Shade of the accent system color at 80% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_200">#65d9c9</color>
+ <!-- Shade of the accent system color at 70% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_300">#45bdae</color>
+ <!-- Shade of the accent system color at 60% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_400">#1fa293</color>
+ <!-- Shade of the accent system color at 50% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_500">#00877a</color>
+ <!-- Shade of the accent system color at 40% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_600">#006d61</color>
+ <!-- Shade of the accent system color at 30% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_700">#005449</color>
+ <!-- Shade of the accent system color at 20% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_800">#003c33</color>
+ <!-- Shade of the accent system color at 10% lightness.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_900">#00271e</color>
+ <!-- Darkest shade of the accent color used by the system. Black.
+ This value can be overlaid at runtime by OverlayManager RROs. -->
+ <color name="system_accent_1000">#000000</color>
</resources>
diff --git a/core/res/res/values/colors_device_defaults.xml b/core/res/res/values/colors_device_defaults.xml
index 310ca893ac39..b5580879d328 100644
--- a/core/res/res/values/colors_device_defaults.xml
+++ b/core/res/res/values/colors_device_defaults.xml
@@ -33,14 +33,14 @@
<color name="tertiary_device_default_settings">@color/tertiary_material_settings</color>
<color name="quaternary_device_default_settings">@color/quaternary_material_settings</color>
- <color name="accent_device_default_light">@color/accent_material_light</color>
- <color name="accent_device_default_dark">@color/accent_material_dark</color>
+ <color name="accent_device_default_light">@color/system_accent_500</color>
+ <color name="accent_device_default_dark">@color/system_accent_200</color>
<color name="accent_device_default">@color/accent_device_default_light</color>
- <color name="background_device_default_dark">#1A1A1A</color>
- <color name="background_device_default_light">#F2F2F2</color>
- <color name="background_floating_device_default_dark">#0D0D0D</color>
- <color name="background_floating_device_default_light">#CCCCCC</color>
+ <color name="background_device_default_dark">@color/system_main_900</color>
+ <color name="background_device_default_light">@color/system_main_100</color>
+ <color name="background_floating_device_default_dark">@color/system_main_800</color>
+ <color name="background_floating_device_default_light">@color/system_main_200</color>
<!-- Error color -->
<color name="error_color_device_default_dark">@color/error_color_material_dark</color>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index d8da60019130..1845faacc891 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -4605,4 +4605,9 @@
happens that doesn't result in bringing the home task to the front.
This is currently only used on TV. -->
<bool name="config_enableBackSound">false</bool>
+
+ <!-- Chooser image editing activity. Must handle ACTION_EDIT image/png intents.
+ If omitted, image editing will not be offered via Chooser.
+ This name is in the ComponentName flattened format (package/class) [DO NOT TRANSLATE] -->
+ <string name="config_systemImageEditor" translatable="false"></string>
</resources>
diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml
index a12d2a951460..a4c7293e48b6 100644
--- a/core/res/res/values/ids.xml
+++ b/core/res/res/values/ids.xml
@@ -206,6 +206,9 @@
<!-- Marks the "nearby" button in the ChooserActivity -->
<item type="id" name="chooser_nearby_button" />
+ <!-- Marks the "edit" button in the ChooserActivity -->
+ <item type="id" name="chooser_edit_button" />
+
<!-- Accessibility action identifier for {@link android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_BACK}. -->
<item type="id" name="accessibilitySystemActionBack" />
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index b3b241f3f062..bac50f1b2c07 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3047,6 +3047,7 @@
<public name="rollbackDataPolicy" />
<public name="allowClickWhenDisabled" />
<public name="windowLayoutAffinity" />
+ <public name="canPauseRecording" />
<!-- @hide -->
<public name="windowBackgroundBlurRadius"/>
<public name="requireDeviceScreenOn" />
@@ -3062,6 +3063,34 @@
<public-group type="color" first-id="0x0106001d">
<!-- color definitions go here -->
+
+ <!-- Material design dynamic system palette:-->
+ <!-- Dominant color -->
+ <public name="system_main_0" />
+ <public name="system_main_50" />
+ <public name="system_main_100" />
+ <public name="system_main_200" />
+ <public name="system_main_300" />
+ <public name="system_main_400" />
+ <public name="system_main_500" />
+ <public name="system_main_600" />
+ <public name="system_main_700" />
+ <public name="system_main_800" />
+ <public name="system_main_900" />
+ <public name="system_main_1000" />
+ <!-- Accent color -->
+ <public name="system_accent_0" />
+ <public name="system_accent_50" />
+ <public name="system_accent_100" />
+ <public name="system_accent_200" />
+ <public name="system_accent_300" />
+ <public name="system_accent_400" />
+ <public name="system_accent_500" />
+ <public name="system_accent_600" />
+ <public name="system_accent_700" />
+ <public name="system_accent_800" />
+ <public name="system_accent_900" />
+ <public name="system_accent_1000" />
</public-group>
<public-group type="dimen" first-id="0x01050008">
diff --git a/core/res/res/values/required_apps_managed_device.xml b/core/res/res/values/required_apps_managed_device.xml
index e17d2147c8f0..c455bd86bcd0 100644
--- a/core/res/res/values/required_apps_managed_device.xml
+++ b/core/res/res/values/required_apps_managed_device.xml
@@ -28,5 +28,6 @@
<item>com.android.providers.downloads</item>
<item>com.android.providers.downloads.ui</item>
<item>com.android.documentsui</item>
+ <item>com.android.cellbroadcastreceiver</item>
</string-array>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 236f7cb45a81..c72a0cd63b36 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2045,6 +2045,7 @@
<java-symbol type="string" name="car_mode_disable_notification_message" />
<java-symbol type="string" name="car_mode_disable_notification_title" />
<java-symbol type="string" name="chooser_wallpaper" />
+ <java-symbol type="string" name="config_systemImageEditor" />
<java-symbol type="string" name="config_datause_iface" />
<java-symbol type="string" name="config_activityRecognitionHardwarePackageName" />
<java-symbol type="string" name="config_fusedLocationProviderPackageName" />
@@ -3895,6 +3896,7 @@
<java-symbol type="drawable" name="chooser_dialog_background" />
<java-symbol type="id" name="chooser_copy_button" />
<java-symbol type="id" name="chooser_nearby_button" />
+ <java-symbol type="id" name="chooser_edit_button" />
<java-symbol type="layout" name="chooser_action_button" />
<java-symbol type="dimen" name="chooser_action_button_icon_size" />
<java-symbol type="string" name="config_defaultNearbySharingComponent" />
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/PutDocumentsRequestTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/PutDocumentsRequestTest.java
new file mode 100644
index 000000000000..986079f80da6
--- /dev/null
+++ b/core/tests/coretests/src/android/app/appsearch/external/app/PutDocumentsRequestTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+package android.app.appsearch;
+
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+
+import org.junit.Test;
+
+import java.util.Set;
+
+public class PutDocumentsRequestTest {
+
+ @Test
+ public void addGenericDocument_byCollection() {
+ Set<AppSearchEmail> emails =
+ ImmutableSet.of(
+ new AppSearchEmail.Builder("test1").build(),
+ new AppSearchEmail.Builder("test2").build());
+ PutDocumentsRequest request =
+ new PutDocumentsRequest.Builder().addGenericDocument(emails).build();
+
+ assertThat(request.getDocuments().get(0).getUri()).isEqualTo("test1");
+ assertThat(request.getDocuments().get(1).getUri()).isEqualTo("test2");
+ }
+}
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/SearchSpecTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/SearchSpecTest.java
index b3caecc88a9a..c8cee853acd4 100644
--- a/core/tests/coretests/src/android/app/appsearch/external/app/SearchSpecTest.java
+++ b/core/tests/coretests/src/android/app/appsearch/external/app/SearchSpecTest.java
@@ -16,6 +16,7 @@
package android.app.appsearch;
+
import static com.google.common.truth.Truth.assertThat;
import android.os.Bundle;
@@ -26,6 +27,7 @@ import java.util.List;
import java.util.Map;
public class SearchSpecTest {
+
@Test
public void testGetBundle() {
SearchSpec searchSpec =
@@ -33,6 +35,7 @@ public class SearchSpecTest {
.setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
.addNamespace("namespace1", "namespace2")
.addSchemaType("schemaTypes1", "schemaTypes2")
+ .addFilterPackageNames("package1", "package2")
.setSnippetCount(5)
.setSnippetCountPerProperty(10)
.setMaxSnippetSize(15)
@@ -48,6 +51,8 @@ public class SearchSpecTest {
.containsExactly("namespace1", "namespace2");
assertThat(bundle.getStringArrayList(SearchSpec.SCHEMA_TYPE_FIELD))
.containsExactly("schemaTypes1", "schemaTypes2");
+ assertThat(bundle.getStringArrayList(SearchSpec.PACKAGE_NAME_FIELD))
+ .containsExactly("package1", "package2");
assertThat(bundle.getInt(SearchSpec.SNIPPET_COUNT_FIELD)).isEqualTo(5);
assertThat(bundle.getInt(SearchSpec.SNIPPET_COUNT_PER_PROPERTY_FIELD)).isEqualTo(10);
assertThat(bundle.getInt(SearchSpec.MAX_SNIPPET_FIELD)).isEqualTo(15);
@@ -62,15 +67,26 @@ public class SearchSpecTest {
SearchSpec searchSpec =
new SearchSpec.Builder()
.setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
- .addProjectionTypePropertyPaths("TypeA", "field1", "field2.subfield2")
- .addProjectionTypePropertyPaths("TypeB", "field7")
- .addProjectionTypePropertyPaths("TypeC")
+ .addProjection("TypeA", "field1", "field2.subfield2")
+ .addProjection("TypeB", "field7")
+ .addProjection("TypeC")
.build();
- Map<String, List<String>> typePropertyPathMap = searchSpec.getProjectionTypePropertyPaths();
+ Map<String, List<String>> typePropertyPathMap = searchSpec.getProjections();
assertThat(typePropertyPathMap.keySet()).containsExactly("TypeA", "TypeB", "TypeC");
assertThat(typePropertyPathMap.get("TypeA")).containsExactly("field1", "field2.subfield2");
assertThat(typePropertyPathMap.get("TypeB")).containsExactly("field7");
assertThat(typePropertyPathMap.get("TypeC")).isEmpty();
}
+
+ @Test
+ public void testGetRankingStrategy() {
+ SearchSpec searchSpec =
+ new SearchSpec.Builder()
+ .setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
+ .setRankingStrategy(SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE)
+ .build();
+ assertThat(searchSpec.getRankingStrategy())
+ .isEqualTo(SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE);
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
index 787879a6a144..d9012f649dd3 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
@@ -638,6 +638,59 @@ public class ChooserActivityTest {
}
+
+ @Test
+ public void testEditImageLogs() throws Exception {
+ Intent sendIntent = createSendImageIntent(
+ Uri.parse("android.resource://com.android.frameworks.coretests/"
+ + com.android.frameworks.coretests.R.drawable.test320x240));
+
+ sOverrides.previewThumbnail = createBitmap();
+ sOverrides.isImageType = true;
+
+ List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+ when(ChooserWrapperActivity.sOverrides.resolverListController.getResolversForIntent(
+ Mockito.anyBoolean(),
+ Mockito.anyBoolean(),
+ Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+
+ final ChooserWrapperActivity activity = mActivityRule
+ .launchActivity(Intent.createChooser(sendIntent, null));
+ waitForIdle();
+
+ onView(withId(R.id.chooser_edit_button)).check(matches(isDisplayed()));
+ onView(withId(R.id.chooser_edit_button)).perform(click());
+
+ ChooserActivityLoggerFake logger =
+ (ChooserActivityLoggerFake) activity.getChooserActivityLogger();
+ // first one should be SHARESHEET_TRIGGERED uievent
+ assertThat(logger.get(0).atomId, is(FrameworkStatsLog.UI_EVENT_REPORTED));
+ assertThat(logger.get(0).event.getId(),
+ is(ChooserActivityLogger.SharesheetStandardEvent.SHARESHEET_TRIGGERED.getId()));
+ // second one should be SHARESHEET_STARTED event
+ assertThat(logger.get(1).atomId, is(FrameworkStatsLog.SHARESHEET_STARTED));
+ assertThat(logger.get(1).intent, is(Intent.ACTION_SEND));
+ assertThat(logger.get(1).mimeType, is("image/png"));
+ assertThat(logger.get(1).packageName, is("com.android.frameworks.coretests"));
+ assertThat(logger.get(1).appProvidedApp, is(0));
+ assertThat(logger.get(1).appProvidedDirect, is(0));
+ assertThat(logger.get(1).isWorkprofile, is(false));
+ assertThat(logger.get(1).previewType, is(1));
+ // third one should be SHARESHEET_APP_LOAD_COMPLETE uievent
+ assertThat(logger.get(2).atomId, is(FrameworkStatsLog.UI_EVENT_REPORTED));
+ assertThat(logger.get(2).event.getId(),
+ is(ChooserActivityLogger
+ .SharesheetStandardEvent.SHARESHEET_APP_LOAD_COMPLETE.getId()));
+ // fourth and fifth are just artifacts of test set-up
+ // sixth one should be ranking atom with SHARESHEET_EDIT_TARGET_SELECTED event
+ assertThat(logger.get(5).atomId, is(FrameworkStatsLog.RANKING_SELECTED));
+ assertThat(logger.get(5).targetType,
+ is(ChooserActivityLogger
+ .SharesheetTargetSelectedEvent.SHARESHEET_EDIT_TARGET_SELECTED.getId()));
+ }
+
+
@Test
public void oneVisibleImagePreview() throws InterruptedException {
Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/"
@@ -2202,6 +2255,19 @@ public class ChooserActivityTest {
return sendIntent;
}
+ private Intent createSendImageIntent(Uri imageThumbnail) {
+ Intent sendIntent = new Intent();
+ sendIntent.setAction(Intent.ACTION_SEND);
+ sendIntent.putExtra(Intent.EXTRA_STREAM, imageThumbnail);
+ sendIntent.setType("image/png");
+ if (imageThumbnail != null) {
+ ClipData.Item clipItem = new ClipData.Item(imageThumbnail);
+ sendIntent.setClipData(new ClipData("Clip Label", new String[]{"image/png"}, clipItem));
+ }
+
+ return sendIntent;
+ }
+
private Intent createSendTextIntentWithPreview(String title, Uri imageThumbnail) {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
diff --git a/graphics/java/android/graphics/RecordingCanvas.java b/graphics/java/android/graphics/RecordingCanvas.java
index 49888fd5f977..2d626b9a622f 100644
--- a/graphics/java/android/graphics/RecordingCanvas.java
+++ b/graphics/java/android/graphics/RecordingCanvas.java
@@ -71,8 +71,8 @@ public final class RecordingCanvas extends BaseRecordingCanvas {
}
/*package*/
- long finishRecording() {
- return nFinishRecording(mNativeCanvasWrapper);
+ void finishRecording(RenderNode node) {
+ nFinishRecording(mNativeCanvasWrapper, node.mNativeRenderNode);
}
///////////////////////////////////////////////////////////////////////////
@@ -271,7 +271,7 @@ public final class RecordingCanvas extends BaseRecordingCanvas {
@CriticalNative
private static native void nEnableZ(long renderer, boolean enableZ);
@CriticalNative
- private static native long nFinishRecording(long renderer);
+ private static native void nFinishRecording(long renderer, long renderNode);
@CriticalNative
private static native void nDrawRenderNode(long renderer, long renderNode);
@CriticalNative
diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java
index 117828dd23db..c1310a9214e0 100644
--- a/graphics/java/android/graphics/RenderNode.java
+++ b/graphics/java/android/graphics/RenderNode.java
@@ -30,7 +30,6 @@ import android.view.View;
import com.android.internal.util.ArrayUtils;
import dalvik.annotation.optimization.CriticalNative;
-import dalvik.annotation.optimization.FastNative;
import libcore.util.NativeAllocationRegistry;
@@ -406,8 +405,7 @@ public final class RenderNode {
}
RecordingCanvas canvas = mCurrentRecordingCanvas;
mCurrentRecordingCanvas = null;
- long displayList = canvas.finishRecording();
- nSetDisplayList(mNativeRenderNode, displayList);
+ canvas.finishRecording(this);
canvas.recycle();
}
@@ -438,7 +436,7 @@ public final class RenderNode {
* obsolete resources after related resources are gone.
*/
public void discardDisplayList() {
- nSetDisplayList(mNativeRenderNode, 0);
+ nDiscardDisplayList(mNativeRenderNode);
}
/**
@@ -1528,20 +1526,14 @@ public final class RenderNode {
private static native void nEndAllAnimators(long renderNode);
-
- ///////////////////////////////////////////////////////////////////////////
- // @FastNative methods
- ///////////////////////////////////////////////////////////////////////////
-
- @FastNative
- private static native void nSetDisplayList(long renderNode, long newData);
-
-
///////////////////////////////////////////////////////////////////////////
// @CriticalNative methods
///////////////////////////////////////////////////////////////////////////
@CriticalNative
+ private static native void nDiscardDisplayList(long renderNode);
+
+ @CriticalNative
private static native boolean nIsValid(long renderNode);
// Matrix
diff --git a/graphics/java/android/graphics/fonts/FontFileUtil.java b/graphics/java/android/graphics/fonts/FontFileUtil.java
index f8b456b982c5..2896c46b119c 100644
--- a/graphics/java/android/graphics/fonts/FontFileUtil.java
+++ b/graphics/java/android/graphics/fonts/FontFileUtil.java
@@ -20,6 +20,8 @@ import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import dalvik.annotation.optimization.FastNative;
+
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@@ -131,4 +133,44 @@ public class FontFileUtil {
buffer.order(originalOrder);
}
}
+
+ /**
+ * Analyze head OpenType table and return fontRevision value as 32bit integer.
+ *
+ * The font revision is stored in 16.16 bit fixed point value. This function returns this fixed
+ * point value as 32 bit integer, i.e. the value multiplied with 65536.
+ *
+ * IllegalArgumentException will be thrown for invalid font data.
+ * If the font file is invalid, returns -1L.
+ *
+ * @param buffer a buffer of OpenType font
+ * @param index a font index
+ * @return font revision that shifted 16 bits left.
+ */
+ public static long getRevision(@NonNull ByteBuffer buffer, @IntRange(from = 0) int index) {
+ return nGetFontRevision(buffer, index);
+ }
+
+ /**
+ * Analyze name OpenType table and return PostScript name.
+ *
+ * IllegalArgumentException will be thrown for invalid font data.
+ * null will be returned if not found or the PostScript name is invalid.
+ *
+ * @param buffer a buffer of OpenType font
+ * @param index a font index
+ * @return a post script name or null if it is invalid or not found.
+ */
+ public static String getPostScriptName(@NonNull ByteBuffer buffer,
+ @IntRange(from = 0) int index) {
+ return nGetFontPostScriptName(buffer, index);
+ }
+
+ @FastNative
+ private static native long nGetFontRevision(@NonNull ByteBuffer buffer,
+ @IntRange(from = 0) int index);
+
+ @FastNative
+ private static native String nGetFontPostScriptName(@NonNull ByteBuffer buffer,
+ @IntRange(from = 0) int index);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
index c9b38d00c0ae..faa4a0ed2294 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
@@ -262,6 +262,12 @@ public class ShellTaskOrganizer extends TaskOrganizer {
synchronized (mLock) {
ProtoLog.v(WM_SHELL_TASK_ORG, "Task info changed taskId=%d", taskInfo.taskId);
final TaskAppearedInfo data = mTasks.get(taskInfo.taskId);
+ if (data == null) {
+ // TODO(b/171749427): It means onTaskInfoChanged send before onTaskAppeared or
+ // after onTaskVanished, it should be fixed in controller side.
+ return;
+ }
+
final TaskListener oldListener = getTaskListener(data.getTaskInfo());
final TaskListener newListener = getTaskListener(taskInfo);
mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash()));
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
index 707747b3889b..e17a943b5cb0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
@@ -21,6 +21,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
import android.content.Context;
import android.util.AttributeSet;
+import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.SurfaceControlViewHost;
import android.view.VelocityTracker;
@@ -54,6 +55,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
private VelocityTracker mVelocityTracker;
private boolean mMoving;
private int mStartPos;
+ private GestureDetector mDoubleTapDetector;
public DividerView(@NonNull Context context) {
super(context);
@@ -88,6 +90,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
mBackground = findViewById(R.id.docked_divider_background);
mTouchElevation = getResources().getDimensionPixelSize(
R.dimen.docked_stack_divider_lift_elevation);
+ mDoubleTapDetector = new GestureDetector(getContext(), new DoubleTapListener());
setOnTouchListener(this);
}
@@ -136,6 +139,8 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
mSplitLayout.snapToTarget(position, snapTarget);
break;
}
+
+ mDoubleTapDetector.onTouchEvent(event);
return true;
}
@@ -200,4 +205,14 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
private boolean isLandscape() {
return getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE;
}
+
+ private class DoubleTapListener extends GestureDetector.SimpleOnGestureListener {
+ @Override
+ public boolean onDoubleTap(MotionEvent e) {
+ if (mSplitLayout != null) {
+ mSplitLayout.onDoubleTappedDivider();
+ }
+ return false;
+ }
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index 9721d302a98a..d77def54c87e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -201,6 +201,10 @@ public class SplitLayout {
}
}
+ void onDoubleTappedDivider() {
+ mLayoutChangeListener.onDoubleTappedDivider();
+ }
+
/**
* Returns {@link DividerSnapAlgorithm.SnapTarget} which matches passing position and velocity.
*/
@@ -249,9 +253,15 @@ public class SplitLayout {
public interface LayoutChangeListener {
/** Calls when dismissing split. */
void onSnappedToDismiss(boolean snappedToEnd);
+
/** Calls when the bounds is changing due to animation or dragging divider bar. */
void onBoundsChanging(SplitLayout layout);
+
/** Calls when the target bounds changed. */
void onBoundsChanged(SplitLayout layout);
+
+ /** Calls when user double tapped on the divider bar. */
+ default void onDoubleTappedDivider() {
+ }
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java
index f8b4dd9bc621..de3bb2950c0a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java
@@ -41,12 +41,12 @@ public class PipUiEventLogger {
}
public void setTaskInfo(TaskInfo taskInfo) {
- if (taskInfo != null && taskInfo.topActivity != null) {
- mPackageName = taskInfo.topActivity.getPackageName();
- mPackageUid = getUid(mPackageName, taskInfo.userId);
- } else {
+ if (taskInfo == null) {
mPackageName = null;
mPackageUid = INVALID_PACKAGE_UID;
+ } else {
+ mPackageName = taskInfo.topActivity.getPackageName();
+ mPackageUid = getUid(mPackageName, taskInfo.userId);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index 0c6edf10ba94..bdac37ab737e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -271,6 +271,12 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
}
@Override
+ public void onDoubleTappedDivider() {
+ setSideStagePosition(mSideStagePosition == SIDE_STAGE_POSITION_TOP_OR_LEFT
+ ? SIDE_STAGE_POSITION_BOTTOM_OR_RIGHT : SIDE_STAGE_POSITION_TOP_OR_LEFT);
+ }
+
+ @Override
public void onBoundsChanged(SplitLayout layout) {
final SurfaceControl dividerLeash = mSplitLayout.getDividerLeash();
if (dividerLeash == null) return;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
index 0d1c6f93d8e3..5821eed6f611 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
@@ -83,6 +83,12 @@ public class SplitLayoutTests extends ShellTestCase {
}
@Test
+ public void testOnDoubleTappedDivider() {
+ mSplitLayout.onDoubleTappedDivider();
+ verify(mLayoutChangeListener).onDoubleTappedDivider();
+ }
+
+ @Test
@UiThreadTest
public void testSnapToDismissTarget() {
// verify it callbacks properly when the snap target indicates dismissing split.
diff --git a/libs/hwui/DisplayList.h b/libs/hwui/DisplayList.h
index dd2476313b19..3aa5b4bf72f8 100644
--- a/libs/hwui/DisplayList.h
+++ b/libs/hwui/DisplayList.h
@@ -16,21 +16,134 @@
#pragma once
+#include "pipeline/skia/SkiaDisplayList.h"
+
+#include <memory>
+
namespace android {
namespace uirenderer {
namespace VectorDrawable {
class Tree;
};
-namespace skiapipeline {
-class SkiaDisplayList;
-}
typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot;
/**
* Data structure that holds the list of commands used in display list stream
*/
-using DisplayList = skiapipeline::SkiaDisplayList;
+//using DisplayList = skiapipeline::SkiaDisplayList;
+class DisplayList {
+public:
+ // Constructs an empty (invalid) DisplayList
+ explicit DisplayList() {}
+
+ // Constructs a DisplayList from a SkiaDisplayList
+ explicit DisplayList(std::unique_ptr<skiapipeline::SkiaDisplayList> impl)
+ : mImpl(std::move(impl)) {}
+
+ // Move support
+ DisplayList(DisplayList&& other) : mImpl(std::move(other.mImpl)) {}
+ DisplayList& operator=(DisplayList&& other) {
+ mImpl = std::move(other.mImpl);
+ return *this;
+ }
+
+ // No copy support
+ DisplayList(const DisplayList& other) = delete;
+ DisplayList& operator=(const DisplayList&) = delete;
+
+ void updateChildren(std::function<void(RenderNode*)> updateFn) {
+ mImpl->updateChildren(std::move(updateFn));
+ }
+
+ [[nodiscard]] explicit operator bool() const {
+ return mImpl.get() != nullptr;
+ }
+
+ // If true this DisplayList contains a backing content, even if that content is empty
+ // If false, there this DisplayList is in an "empty" state
+ [[nodiscard]] bool isValid() const {
+ return mImpl.get() != nullptr;
+ }
+
+ [[nodiscard]] bool isEmpty() const {
+ return !hasContent();
+ }
+
+ [[nodiscard]] bool hasContent() const {
+ return mImpl && !(mImpl->isEmpty());
+ }
+
+ [[nodiscard]] bool containsProjectionReceiver() const {
+ return mImpl && mImpl->containsProjectionReceiver();
+ }
+
+ [[nodiscard]] skiapipeline::SkiaDisplayList* asSkiaDl() {
+ return mImpl.get();
+ }
+
+ [[nodiscard]] const skiapipeline::SkiaDisplayList* asSkiaDl() const {
+ return mImpl.get();
+ }
+
+ [[nodiscard]] bool hasVectorDrawables() const {
+ return mImpl && mImpl->hasVectorDrawables();
+ }
+
+ void clear(RenderNode* owningNode = nullptr) {
+ if (mImpl && owningNode && mImpl->reuseDisplayList(owningNode)) {
+ // TODO: This is a bit sketchy to have a unique_ptr temporarily owned twice
+ // Do something to cleanup reuseDisplayList passing itself to the RenderNode
+ mImpl.release();
+ } else {
+ mImpl = nullptr;
+ }
+ }
+
+ [[nodiscard]] size_t getUsedSize() const {
+ return mImpl ? mImpl->getUsedSize() : 0;
+ }
+
+ [[nodiscard]] size_t getAllocatedSize() const {
+ return mImpl ? mImpl->getAllocatedSize() : 0;
+ }
+
+ void output(std::ostream& output, uint32_t level) const {
+ if (mImpl) {
+ mImpl->output(output, level);
+ }
+ }
+
+ [[nodiscard]] bool hasFunctor() const {
+ return mImpl && mImpl->hasFunctor();
+ }
+
+ bool prepareListAndChildren(
+ TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer,
+ std::function<void(RenderNode*, TreeObserver&, TreeInfo&, bool)> childFn) {
+ return mImpl && mImpl->prepareListAndChildren(
+ observer, info, functorsNeedLayer, std::move(childFn));
+ }
+
+ void syncContents(const WebViewSyncData& data) {
+ if (mImpl) {
+ mImpl->syncContents(data);
+ }
+ }
+
+ [[nodiscard]] bool hasText() const {
+ return mImpl && mImpl->hasText();
+ }
+
+ void applyColorTransform(ColorTransform transform) {
+ if (mImpl) {
+ mImpl->mDisplayList.applyColorTransform(transform);
+ }
+ }
+
+private:
+ std::unique_ptr<skiapipeline::SkiaDisplayList> mImpl;
+};
} // namespace uirenderer
} // namespace android
diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h
index 89e3df771809..a6a7b12ba658 100644
--- a/libs/hwui/RecordingCanvas.h
+++ b/libs/hwui/RecordingCanvas.h
@@ -18,7 +18,6 @@
#include "CanvasTransform.h"
#include "hwui/Bitmap.h"
-#include "hwui/Canvas.h"
#include "utils/Macros.h"
#include "utils/TypeLogic.h"
@@ -29,7 +28,6 @@
#include "SkPaint.h"
#include "SkPath.h"
#include "SkRect.h"
-#include "SkTemplates.h"
#include <vector>
@@ -40,6 +38,11 @@ namespace skiapipeline {
class FunctorDrawable;
}
+namespace VectorDrawable {
+class Tree;
+}
+typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot;
+
enum class DisplayListOpType : uint8_t {
#define X(T) T,
#include "DisplayListOps.in"
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 74c70c8969f2..44f54eef458f 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -70,15 +70,17 @@ RenderNode::RenderNode()
RenderNode::~RenderNode() {
ImmediateRemoved observer(nullptr);
deleteDisplayList(observer);
- delete mStagingDisplayList;
LOG_ALWAYS_FATAL_IF(hasLayer(), "layer missed detachment!");
}
-void RenderNode::setStagingDisplayList(DisplayList* displayList) {
- mValid = (displayList != nullptr);
+void RenderNode::setStagingDisplayList(DisplayList&& newData) {
+ mValid = newData.isValid();
mNeedsDisplayListSync = true;
- delete mStagingDisplayList;
- mStagingDisplayList = displayList;
+ mStagingDisplayList = std::move(newData);
+}
+
+void RenderNode::discardStagingDisplayList() {
+ setStagingDisplayList(DisplayList());
}
/**
@@ -101,32 +103,22 @@ void RenderNode::output(std::ostream& output, uint32_t level) {
properties().debugOutputProperties(output, level + 1);
- if (mDisplayList) {
- mDisplayList->output(output, level);
- }
+ mDisplayList.output(output, level);
output << std::string(level * 2, ' ') << "/RenderNode(" << getName() << " " << this << ")";
output << std::endl;
}
int RenderNode::getUsageSize() {
int size = sizeof(RenderNode);
- if (mStagingDisplayList) {
- size += mStagingDisplayList->getUsedSize();
- }
- if (mDisplayList && mDisplayList != mStagingDisplayList) {
- size += mDisplayList->getUsedSize();
- }
+ size += mStagingDisplayList.getUsedSize();
+ size += mDisplayList.getUsedSize();
return size;
}
int RenderNode::getAllocatedSize() {
int size = sizeof(RenderNode);
- if (mStagingDisplayList) {
- size += mStagingDisplayList->getAllocatedSize();
- }
- if (mDisplayList && mDisplayList != mStagingDisplayList) {
- size += mDisplayList->getAllocatedSize();
- }
+ size += mStagingDisplayList.getAllocatedSize();
+ size += mDisplayList.getAllocatedSize();
return size;
}
@@ -242,9 +234,9 @@ void RenderNode::prepareTreeImpl(TreeObserver& observer, TreeInfo& info, bool fu
bool willHaveFunctor = false;
if (info.mode == TreeInfo::MODE_FULL && mStagingDisplayList) {
- willHaveFunctor = mStagingDisplayList->hasFunctor();
+ willHaveFunctor = mStagingDisplayList.hasFunctor();
} else if (mDisplayList) {
- willHaveFunctor = mDisplayList->hasFunctor();
+ willHaveFunctor = mDisplayList.hasFunctor();
}
bool childFunctorsNeedLayer =
mProperties.prepareForFunctorPresence(willHaveFunctor, functorsNeedLayer);
@@ -259,8 +251,8 @@ void RenderNode::prepareTreeImpl(TreeObserver& observer, TreeInfo& info, bool fu
}
if (mDisplayList) {
- info.out.hasFunctors |= mDisplayList->hasFunctor();
- bool isDirty = mDisplayList->prepareListAndChildren(
+ info.out.hasFunctors |= mDisplayList.hasFunctor();
+ bool isDirty = mDisplayList.prepareListAndChildren(
observer, info, childFunctorsNeedLayer,
[](RenderNode* child, TreeObserver& observer, TreeInfo& info,
bool functorsNeedLayer) {
@@ -314,16 +306,15 @@ void RenderNode::syncDisplayList(TreeObserver& observer, TreeInfo* info) {
// Make sure we inc first so that we don't fluctuate between 0 and 1,
// which would thrash the layer cache
if (mStagingDisplayList) {
- mStagingDisplayList->updateChildren([](RenderNode* child) { child->incParentRefCount(); });
+ mStagingDisplayList.updateChildren([](RenderNode* child) { child->incParentRefCount(); });
}
deleteDisplayList(observer, info);
- mDisplayList = mStagingDisplayList;
- mStagingDisplayList = nullptr;
+ mDisplayList = std::move(mStagingDisplayList);
if (mDisplayList) {
WebViewSyncData syncData {
.applyForceDark = info && !info->disableForceDark
};
- mDisplayList->syncContents(syncData);
+ mDisplayList.syncContents(syncData);
handleForceDark(info);
}
}
@@ -333,15 +324,18 @@ void RenderNode::handleForceDark(android::uirenderer::TreeInfo *info) {
return;
}
auto usage = usageHint();
- const auto& children = mDisplayList->mChildNodes;
- if (mDisplayList->hasText()) {
+ FatVector<RenderNode*, 6> children;
+ mDisplayList.updateChildren([&children](RenderNode* node) {
+ children.push_back(node);
+ });
+ if (mDisplayList.hasText()) {
usage = UsageHint::Foreground;
}
if (usage == UsageHint::Unknown) {
if (children.size() > 1) {
usage = UsageHint::Background;
} else if (children.size() == 1 &&
- children.front().getRenderNode()->usageHint() !=
+ children.front()->usageHint() !=
UsageHint::Background) {
usage = UsageHint::Background;
}
@@ -350,7 +344,7 @@ void RenderNode::handleForceDark(android::uirenderer::TreeInfo *info) {
// Crude overlap check
SkRect drawn = SkRect::MakeEmpty();
for (auto iter = children.rbegin(); iter != children.rend(); ++iter) {
- const auto& child = iter->getRenderNode();
+ const auto& child = *iter;
// We use stagingProperties here because we haven't yet sync'd the children
SkRect bounds = SkRect::MakeXYWH(child->stagingProperties().getX(), child->stagingProperties().getY(),
child->stagingProperties().getWidth(), child->stagingProperties().getHeight());
@@ -361,7 +355,7 @@ void RenderNode::handleForceDark(android::uirenderer::TreeInfo *info) {
drawn.join(bounds);
}
}
- mDisplayList->mDisplayList.applyColorTransform(
+ mDisplayList.applyColorTransform(
usage == UsageHint::Background ? ColorTransform::Dark : ColorTransform::Light);
}
@@ -378,20 +372,17 @@ void RenderNode::pushStagingDisplayListChanges(TreeObserver& observer, TreeInfo&
void RenderNode::deleteDisplayList(TreeObserver& observer, TreeInfo* info) {
if (mDisplayList) {
- mDisplayList->updateChildren(
+ mDisplayList.updateChildren(
[&observer, info](RenderNode* child) { child->decParentRefCount(observer, info); });
- if (!mDisplayList->reuseDisplayList(this)) {
- delete mDisplayList;
- }
+ mDisplayList.clear(this);
}
- mDisplayList = nullptr;
}
void RenderNode::destroyHardwareResources(TreeInfo* info) {
if (hasLayer()) {
this->setLayerSurface(nullptr);
}
- setStagingDisplayList(nullptr);
+ discardStagingDisplayList();
ImmediateRemoved observer(info);
deleteDisplayList(observer, info);
@@ -402,7 +393,7 @@ void RenderNode::destroyLayers() {
this->setLayerSurface(nullptr);
}
if (mDisplayList) {
- mDisplayList->updateChildren([](RenderNode* child) { child->destroyLayers(); });
+ mDisplayList.updateChildren([](RenderNode* child) { child->destroyLayers(); });
}
}
diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h
index 6d5e62e955bb..39ea53b6e3b3 100644
--- a/libs/hwui/RenderNode.h
+++ b/libs/hwui/RenderNode.h
@@ -100,16 +100,17 @@ public:
// See flags defined in DisplayList.java
enum ReplayFlag { kReplayFlag_ClipChildren = 0x1 };
- void setStagingDisplayList(DisplayList* newData);
+ void setStagingDisplayList(DisplayList&& newData);
+ void discardStagingDisplayList();
void output();
int getUsageSize();
int getAllocatedSize();
- bool isRenderable() const { return mDisplayList && !mDisplayList->isEmpty(); }
+ bool isRenderable() const { return mDisplayList.hasContent(); }
bool hasProjectionReceiver() const {
- return mDisplayList && mDisplayList->containsProjectionReceiver();
+ return mDisplayList.containsProjectionReceiver();
}
const char* getName() const { return mName.string(); }
@@ -168,12 +169,14 @@ public:
bool nothingToDraw() const {
const Outline& outline = properties().getOutline();
- return mDisplayList == nullptr || properties().getAlpha() <= 0 ||
+ return !mDisplayList.isValid() || properties().getAlpha() <= 0 ||
(outline.getShouldClip() && outline.isEmpty()) || properties().getScaleX() == 0 ||
properties().getScaleY() == 0;
}
- const DisplayList* getDisplayList() const { return mDisplayList; }
+ const DisplayList& getDisplayList() const { return mDisplayList; }
+ // TODO: can this be cleaned up?
+ DisplayList& getDisplayList() { return mDisplayList; }
// Note: The position callbacks are relying on the listener using
// the frameNumber to appropriately batch/synchronize these transactions.
@@ -252,8 +255,8 @@ private:
bool mNeedsDisplayListSync;
// WARNING: Do not delete this directly, you must go through deleteDisplayList()!
- DisplayList* mDisplayList;
- DisplayList* mStagingDisplayList;
+ DisplayList mDisplayList;
+ DisplayList mStagingDisplayList;
int64_t mDamageGenerationId;
diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h
index fa7d373308d3..e6fc9da0a9d3 100644
--- a/libs/hwui/SkiaCanvas.h
+++ b/libs/hwui/SkiaCanvas.h
@@ -53,9 +53,9 @@ public:
LOG_ALWAYS_FATAL("SkiaCanvas cannot be reset as a recording canvas");
}
- virtual uirenderer::DisplayList* finishRecording() override {
+ virtual uirenderer::DisplayList finishRecording() override {
LOG_ALWAYS_FATAL("SkiaCanvas does not produce a DisplayList");
- return nullptr;
+ return uirenderer::DisplayList();
}
virtual void enableZ(bool enableZ) override {
LOG_ALWAYS_FATAL("SkiaCanvas does not support enableZ");
diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h
index 737d60525aa9..17b936ade45c 100644
--- a/libs/hwui/WebViewFunctorManager.h
+++ b/libs/hwui/WebViewFunctorManager.h
@@ -19,11 +19,11 @@
#include <private/hwui/WebViewFunctor.h>
#ifdef __ANDROID__ // Layoutlib does not support render thread
#include <renderthread/RenderProxy.h>
-#else
-#include <utils/Log.h>
#endif
#include <utils/LightRefBase.h>
+#include <utils/Log.h>
+#include <utils/StrongPointer.h>
#include <mutex>
#include <vector>
diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h
index d0c996bee449..9304b7af9cd9 100644
--- a/libs/hwui/hwui/Canvas.h
+++ b/libs/hwui/hwui/Canvas.h
@@ -118,7 +118,7 @@ public:
virtual void resetRecording(int width, int height,
uirenderer::RenderNode* renderNode = nullptr) = 0;
- virtual uirenderer::DisplayList* finishRecording() = 0;
+ [[nodiscard]] virtual uirenderer::DisplayList finishRecording() = 0;
virtual void enableZ(bool enableZ) = 0;
bool isHighContrastText() const { return uirenderer::Properties::enableHighContrastText; }
diff --git a/libs/hwui/jni/Bitmap.cpp b/libs/hwui/jni/Bitmap.cpp
index eb9885a4436a..05278f24ebbd 100755
--- a/libs/hwui/jni/Bitmap.cpp
+++ b/libs/hwui/jni/Bitmap.cpp
@@ -3,11 +3,12 @@
#include "Bitmap.h"
#include "SkBitmap.h"
+#include "SkCanvas.h"
+#include "SkColor.h"
+#include "SkColorSpace.h"
#include "SkPixelRef.h"
#include "SkImageEncoder.h"
#include "SkImageInfo.h"
-#include "SkColor.h"
-#include "SkColorSpace.h"
#include "GraphicsJNI.h"
#include "SkStream.h"
#include "SkWebpEncoder.h"
diff --git a/libs/hwui/jni/BitmapFactory.cpp b/libs/hwui/jni/BitmapFactory.cpp
index 52522a320821..cf02051831c6 100644
--- a/libs/hwui/jni/BitmapFactory.cpp
+++ b/libs/hwui/jni/BitmapFactory.cpp
@@ -8,9 +8,11 @@
#include "MimeType.h"
#include "NinePatchPeeker.h"
#include "SkAndroidCodec.h"
+#include "SkCanvas.h"
#include "SkMath.h"
#include "SkPixelRef.h"
#include "SkStream.h"
+#include "SkString.h"
#include "SkUtils.h"
#include "Utils.h"
diff --git a/libs/hwui/jni/GraphicsJNI.h b/libs/hwui/jni/GraphicsJNI.h
index 541d5a53de07..ba407f2164de 100644
--- a/libs/hwui/jni/GraphicsJNI.h
+++ b/libs/hwui/jni/GraphicsJNI.h
@@ -24,6 +24,7 @@ namespace android {
namespace skia {
class BitmapRegionDecoder;
}
+class Canvas;
class Paint;
struct Typeface;
}
diff --git a/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp b/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
index f4877f4a4fc4..a74e56183bfd 100644
--- a/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
+++ b/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
@@ -98,9 +98,11 @@ static void android_view_DisplayListCanvas_enableZ(CRITICAL_JNI_PARAMS_COMMA jlo
canvas->enableZ(reorderEnable);
}
-static jlong android_view_DisplayListCanvas_finishRecording(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr) {
+static void android_view_DisplayListCanvas_finishRecording(
+ CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
- return reinterpret_cast<jlong>(canvas->finishRecording());
+ RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
+ renderNode->setStagingDisplayList(canvas->finishRecording());
}
static void android_view_DisplayListCanvas_drawRenderNode(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
@@ -172,7 +174,7 @@ static JNINativeMethod gMethods[] = {
{ "nGetMaximumTextureWidth", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize },
{ "nGetMaximumTextureHeight", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize },
{ "nEnableZ", "(JZ)V", (void*) android_view_DisplayListCanvas_enableZ },
- { "nFinishRecording", "(J)J", (void*) android_view_DisplayListCanvas_finishRecording },
+ { "nFinishRecording", "(JJ)V", (void*) android_view_DisplayListCanvas_finishRecording },
{ "nDrawRenderNode", "(JJ)V", (void*) android_view_DisplayListCanvas_drawRenderNode },
{ "nDrawTextureLayer", "(JJ)V", (void*) android_view_DisplayListCanvas_drawTextureLayer },
{ "nDrawCircle", "(JJJJJ)V", (void*) android_view_DisplayListCanvas_drawCircleProps },
diff --git a/libs/hwui/jni/android_graphics_RenderNode.cpp b/libs/hwui/jni/android_graphics_RenderNode.cpp
index 6f4ba894e3af..8b35d96aeac8 100644
--- a/libs/hwui/jni/android_graphics_RenderNode.cpp
+++ b/libs/hwui/jni/android_graphics_RenderNode.cpp
@@ -76,11 +76,9 @@ static jlong android_view_RenderNode_getNativeFinalizer(JNIEnv* env,
return static_cast<jlong>(reinterpret_cast<uintptr_t>(&releaseRenderNode));
}
-static void android_view_RenderNode_setDisplayList(JNIEnv* env,
- jobject clazz, jlong renderNodePtr, jlong displayListPtr) {
+static void android_view_RenderNode_discardDisplayList(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr) {
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
- DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr);
- renderNode->setStagingDisplayList(newData);
+ renderNode->discardStagingDisplayList();
}
static jboolean android_view_RenderNode_isValid(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr) {
@@ -657,18 +655,11 @@ static const JNINativeMethod gMethods[] = {
{ "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
{ "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
{ "nRequestPositionUpdates", "(JLandroid/graphics/RenderNode$PositionUpdateListener;)V", (void*) android_view_RenderNode_requestPositionUpdates },
- { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
-
-
-// ----------------------------------------------------------------------------
-// Fast JNI via @CriticalNative annotation in RenderNode.java
-// ----------------------------------------------------------------------------
- { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
-
// ----------------------------------------------------------------------------
// Critical JNI via @CriticalNative annotation in RenderNode.java
// ----------------------------------------------------------------------------
+ { "nDiscardDisplayList", "(J)V", (void*) android_view_RenderNode_discardDisplayList },
{ "nIsValid", "(J)Z", (void*) android_view_RenderNode_isValid },
{ "nSetLayerType", "(JI)Z", (void*) android_view_RenderNode_setLayerType },
{ "nGetLayerType", "(J)I", (void*) android_view_RenderNode_getLayerType },
diff --git a/libs/hwui/jni/fonts/Font.cpp b/libs/hwui/jni/fonts/Font.cpp
index f612bce748ff..943423f65882 100644
--- a/libs/hwui/jni/fonts/Font.cpp
+++ b/libs/hwui/jni/fonts/Font.cpp
@@ -33,6 +33,7 @@
#include <hwui/Paint.h>
#include <hwui/Typeface.h>
#include <minikin/FontFamily.h>
+#include <minikin/FontFileParser.h>
#include <ui/FatVector.h>
#include <memory>
@@ -233,6 +234,51 @@ static jlong FontBufferHelper_getReleaseFunc(CRITICAL_JNI_PARAMS) {
///////////////////////////////////////////////////////////////////////////////
+// Fast Native
+static jlong FontFileUtil_getFontRevision(JNIEnv* env, jobject, jobject buffer, jint index) {
+ NPE_CHECK_RETURN_ZERO(env, buffer);
+ const void* fontPtr = env->GetDirectBufferAddress(buffer);
+ if (fontPtr == nullptr) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", "Not a direct buffer");
+ return 0;
+ }
+ jlong fontSize = env->GetDirectBufferCapacity(buffer);
+ if (fontSize <= 0) {
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "buffer size must not be zero or negative");
+ return 0;
+ }
+ minikin::FontFileParser parser(fontPtr, fontSize, index);
+ std::optional<uint32_t> revision = parser.getFontRevision();
+ if (!revision.has_value()) {
+ return -1L;
+ }
+ return revision.value();
+}
+
+static jstring FontFileUtil_getFontPostScriptName(JNIEnv* env, jobject, jobject buffer,
+ jint index) {
+ NPE_CHECK_RETURN_ZERO(env, buffer);
+ const void* fontPtr = env->GetDirectBufferAddress(buffer);
+ if (fontPtr == nullptr) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", "Not a direct buffer");
+ return nullptr;
+ }
+ jlong fontSize = env->GetDirectBufferCapacity(buffer);
+ if (fontSize <= 0) {
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "buffer size must not be zero or negative");
+ return nullptr;
+ }
+ minikin::FontFileParser parser(fontPtr, fontSize, index);
+ std::optional<std::string> psName = parser.getPostScriptName();
+ if (!psName.has_value()) {
+ return nullptr; // null
+ }
+ return env->NewStringUTF(psName->c_str());
+}
+///////////////////////////////////////////////////////////////////////////////
+
static const JNINativeMethod gFontBuilderMethods[] = {
{ "nInitBuilder", "()J", (void*) Font_Builder_initBuilder },
{ "nAddAxis", "(JIF)V", (void*) Font_Builder_addAxis },
@@ -254,13 +300,21 @@ static const JNINativeMethod gFontBufferHelperMethods[] = {
{ "nGetReleaseFunc", "()J", (void*) FontBufferHelper_getReleaseFunc },
};
+static const JNINativeMethod gFontFileUtilMethods[] = {
+ { "nGetFontRevision", "(Ljava/nio/ByteBuffer;I)J", (void*) FontFileUtil_getFontRevision },
+ { "nGetFontPostScriptName", "(Ljava/nio/ByteBuffer;I)Ljava/lang/String;",
+ (void*) FontFileUtil_getFontPostScriptName },
+};
+
int register_android_graphics_fonts_Font(JNIEnv* env) {
return RegisterMethodsOrDie(env, "android/graphics/fonts/Font$Builder", gFontBuilderMethods,
NELEM(gFontBuilderMethods)) +
RegisterMethodsOrDie(env, "android/graphics/fonts/Font", gFontMethods,
NELEM(gFontMethods)) +
RegisterMethodsOrDie(env, "android/graphics/fonts/NativeFontBufferHelper",
- gFontBufferHelperMethods, NELEM(gFontBufferHelperMethods));
+ gFontBufferHelperMethods, NELEM(gFontBufferHelperMethods)) +
+ RegisterMethodsOrDie(env, "android/graphics/fonts/FontFileUtil", gFontFileUtilMethods,
+ NELEM(gFontFileUtilMethods));
}
namespace fonts {
diff --git a/libs/hwui/pipeline/skia/DumpOpsCanvas.h b/libs/hwui/pipeline/skia/DumpOpsCanvas.h
index 26ff8bf53f90..3580bed45a1f 100644
--- a/libs/hwui/pipeline/skia/DumpOpsCanvas.h
+++ b/libs/hwui/pipeline/skia/DumpOpsCanvas.h
@@ -29,7 +29,7 @@ namespace skiapipeline {
*/
class DumpOpsCanvas : public SkCanvas {
public:
- DumpOpsCanvas(std::ostream& output, int level, SkiaDisplayList& displayList)
+ DumpOpsCanvas(std::ostream& output, int level, const SkiaDisplayList& displayList)
: mOutput(output)
, mLevel(level)
, mDisplayList(displayList)
@@ -127,7 +127,7 @@ protected:
}
private:
- RenderNodeDrawable* getRenderNodeDrawable(SkDrawable* drawable) {
+ const RenderNodeDrawable* getRenderNodeDrawable(SkDrawable* drawable) {
for (auto& child : mDisplayList.mChildNodes) {
if (drawable == &child) {
return &child;
@@ -147,7 +147,7 @@ private:
std::ostream& mOutput;
int mLevel;
- SkiaDisplayList& mDisplayList;
+ const SkiaDisplayList& mDisplayList;
std::string mIdent;
};
diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
index 1473b3e5abb7..070a765cf7ca 100644
--- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
+++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
@@ -61,12 +61,11 @@ void RenderNodeDrawable::drawBackwardsProjectedNodes(SkCanvas* canvas,
SkAutoCanvasRestore acr(canvas, true);
SkMatrix nodeMatrix;
mat4 hwuiMatrix(child.getRecordedMatrix());
- auto childNode = child.getRenderNode();
+ const RenderNode* childNode = child.getRenderNode();
childNode->applyViewPropertyTransforms(hwuiMatrix);
hwuiMatrix.copyTo(nodeMatrix);
canvas->concat(nodeMatrix);
- SkiaDisplayList* childDisplayList = static_cast<SkiaDisplayList*>(
- (const_cast<DisplayList*>(childNode->getDisplayList())));
+ const SkiaDisplayList* childDisplayList = childNode->getDisplayList().asSkiaDl();
if (childDisplayList) {
drawBackwardsProjectedNodes(canvas, *childDisplayList, nestLevel + 1);
}
@@ -144,7 +143,7 @@ void RenderNodeDrawable::forceDraw(SkCanvas* canvas) const {
return;
}
- SkiaDisplayList* displayList = (SkiaDisplayList*)renderNode->getDisplayList();
+ SkiaDisplayList* displayList = renderNode->getDisplayList().asSkiaDl();
SkAutoCanvasRestore acr(canvas, true);
const RenderProperties& properties = this->getNodeProperties();
@@ -213,14 +212,14 @@ void RenderNodeDrawable::drawContent(SkCanvas* canvas) const {
if (mComposeLayer) {
setViewProperties(properties, canvas, &alphaMultiplier);
}
- SkiaDisplayList* displayList = (SkiaDisplayList*)mRenderNode->getDisplayList();
+ SkiaDisplayList* displayList = mRenderNode->getDisplayList().asSkiaDl();
displayList->mParentMatrix = canvas->getTotalMatrix();
// TODO should we let the bound of the drawable do this for us?
const SkRect bounds = SkRect::MakeWH(properties.getWidth(), properties.getHeight());
bool quickRejected = properties.getClipToBounds() && canvas->quickReject(bounds);
if (!quickRejected) {
- SkiaDisplayList* displayList = (SkiaDisplayList*)renderNode->getDisplayList();
+ SkiaDisplayList* displayList = renderNode->getDisplayList().asSkiaDl();
const LayerProperties& layerProperties = properties.layerProperties();
// composing a hardware layer
if (renderNode->getLayerSurface() && mComposeLayer) {
diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
index c63f5d349311..e6c6e1094c40 100644
--- a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
+++ b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
@@ -172,7 +172,7 @@ void SkiaDisplayList::reset() {
new (&allocator) LinearAllocator();
}
-void SkiaDisplayList::output(std::ostream& output, uint32_t level) {
+void SkiaDisplayList::output(std::ostream& output, uint32_t level) const {
DumpOpsCanvas canvas(output, level, *this);
mDisplayList.draw(&canvas);
}
diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.h b/libs/hwui/pipeline/skia/SkiaDisplayList.h
index f2f19ba2975e..483264f95e60 100644
--- a/libs/hwui/pipeline/skia/SkiaDisplayList.h
+++ b/libs/hwui/pipeline/skia/SkiaDisplayList.h
@@ -142,7 +142,7 @@ public:
void draw(SkCanvas* canvas) { mDisplayList.draw(canvas); }
- void output(std::ostream& output, uint32_t level);
+ void output(std::ostream& output, uint32_t level) const;
LinearAllocator allocator;
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 6e7493cb443d..d14dc3672b99 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -98,7 +98,7 @@ void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque)
continue;
}
SkASSERT(layerNode->getLayerSurface());
- SkiaDisplayList* displayList = (SkiaDisplayList*)layerNode->getDisplayList();
+ SkiaDisplayList* displayList = layerNode->getDisplayList().asSkiaDl();
if (!displayList || displayList->isEmpty()) {
ALOGE("%p drawLayers(%s) : missing drawable", layerNode, layerNode->getName());
return;
@@ -288,7 +288,7 @@ bool SkiaPipeline::setupMultiFrameCapture() {
// recurse through the rendernode's children, add any nodes which are layers to the queue.
static void collectLayers(RenderNode* node, LayerUpdateQueue* layers) {
- SkiaDisplayList* dl = (SkiaDisplayList*)node->getDisplayList();
+ SkiaDisplayList* dl = node->getDisplayList().asSkiaDl();
if (dl) {
const auto& prop = node->properties();
if (node->hasLayer()) {
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index 7faebda8e043..5f35155c2b5a 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -55,11 +55,11 @@ void SkiaRecordingCanvas::initDisplayList(uirenderer::RenderNode* renderNode, in
SkiaCanvas::reset(&mRecorder);
}
-uirenderer::DisplayList* SkiaRecordingCanvas::finishRecording() {
+uirenderer::DisplayList SkiaRecordingCanvas::finishRecording() {
// close any existing chunks if necessary
enableZ(false);
mRecorder.restoreToCount(1);
- return mDisplayList.release();
+ return uirenderer::DisplayList(std::move(mDisplayList));
}
// ----------------------------------------------------------------------------
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
index 622df43b0528..ee308f0832a2 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
@@ -43,7 +43,7 @@ public:
initDisplayList(renderNode, width, height);
}
- virtual uirenderer::DisplayList* finishRecording() override;
+ virtual uirenderer::DisplayList finishRecording() override;
virtual void drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) override;
virtual void drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const Paint* paint) override;
diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h
index 771c3452bf84..ba6e8ee290bc 100644
--- a/libs/hwui/tests/common/TestUtils.h
+++ b/libs/hwui/tests/common/TestUtils.h
@@ -210,7 +210,8 @@ public:
int left, int top, int right, int bottom,
std::function<void(RenderProperties& props, skiapipeline::SkiaRecordingCanvas& canvas)>
setup,
- const char* name = nullptr, skiapipeline::SkiaDisplayList* displayList = nullptr) {
+ const char* name = nullptr,
+ std::unique_ptr<skiapipeline::SkiaDisplayList> displayList = nullptr) {
sp<RenderNode> node = new RenderNode();
if (name) {
node->setName(name);
@@ -218,7 +219,7 @@ public:
RenderProperties& props = node->mutateStagingProperties();
props.setLeftTopRightBottom(left, top, right, bottom);
if (displayList) {
- node->setStagingDisplayList(displayList);
+ node->setStagingDisplayList(DisplayList(std::move(displayList)));
}
if (setup) {
std::unique_ptr<skiapipeline::SkiaRecordingCanvas> canvas(
@@ -346,13 +347,11 @@ private:
node->mNeedsDisplayListSync = false;
node->syncDisplayList(observer, nullptr);
}
- auto displayList = node->getDisplayList();
+ auto& displayList = node->getDisplayList();
if (displayList) {
- for (auto&& childDr :
- static_cast<skiapipeline::SkiaDisplayList*>(const_cast<DisplayList*>(displayList))
- ->mChildNodes) {
- syncHierarchyPropertiesAndDisplayListImpl(childDr.getRenderNode());
- }
+ displayList.updateChildren([](RenderNode* child) {
+ syncHierarchyPropertiesAndDisplayListImpl(child);
+ });
}
}
diff --git a/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp b/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp
index d393c693c774..ade1ddd3f703 100644
--- a/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp
+++ b/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp
@@ -45,19 +45,19 @@ BENCHMARK(BM_DisplayList_alloc_theoretical);
void BM_DisplayListCanvas_record_empty(benchmark::State& benchState) {
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
while (benchState.KeepRunning()) {
canvas->resetRecording(100, 100);
benchmark::DoNotOptimize(canvas.get());
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
}
}
BENCHMARK(BM_DisplayListCanvas_record_empty);
void BM_DisplayListCanvas_record_saverestore(benchmark::State& benchState) {
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
while (benchState.KeepRunning()) {
canvas->resetRecording(100, 100);
@@ -66,20 +66,20 @@ void BM_DisplayListCanvas_record_saverestore(benchmark::State& benchState) {
benchmark::DoNotOptimize(canvas.get());
canvas->restore();
canvas->restore();
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
}
}
BENCHMARK(BM_DisplayListCanvas_record_saverestore);
void BM_DisplayListCanvas_record_translate(benchmark::State& benchState) {
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
while (benchState.KeepRunning()) {
canvas->resetRecording(100, 100);
canvas->scale(10, 10);
benchmark::DoNotOptimize(canvas.get());
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
}
}
BENCHMARK(BM_DisplayListCanvas_record_translate);
@@ -92,7 +92,7 @@ BENCHMARK(BM_DisplayListCanvas_record_translate);
*/
void BM_DisplayListCanvas_record_simpleBitmapView(benchmark::State& benchState) {
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
Paint rectPaint;
sk_sp<Bitmap> iconBitmap(TestUtils::createBitmap(80, 80));
@@ -111,7 +111,7 @@ void BM_DisplayListCanvas_record_simpleBitmapView(benchmark::State& benchState)
canvas->restore();
}
benchmark::DoNotOptimize(canvas.get());
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
}
}
BENCHMARK(BM_DisplayListCanvas_record_simpleBitmapView);
@@ -122,7 +122,7 @@ void BM_DisplayListCanvas_basicViewGroupDraw(benchmark::State& benchState) {
});
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
while (benchState.KeepRunning()) {
canvas->resetRecording(200, 200);
@@ -143,7 +143,7 @@ void BM_DisplayListCanvas_basicViewGroupDraw(benchmark::State& benchState) {
canvas->enableZ(false);
canvas->restoreToCount(clipRestoreCount);
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
}
}
BENCHMARK(BM_DisplayListCanvas_basicViewGroupDraw)->Arg(1)->Arg(5)->Arg(10);
diff --git a/libs/hwui/tests/microbench/RenderNodeBench.cpp b/libs/hwui/tests/microbench/RenderNodeBench.cpp
index 011939a6e4b2..dd3f737abfa9 100644
--- a/libs/hwui/tests/microbench/RenderNodeBench.cpp
+++ b/libs/hwui/tests/microbench/RenderNodeBench.cpp
@@ -16,6 +16,7 @@
#include <benchmark/benchmark.h>
+#include "hwui/Canvas.h"
#include "RenderNode.h"
using namespace android;
@@ -34,7 +35,7 @@ BENCHMARK(BM_RenderNode_create);
void BM_RenderNode_recordSimple(benchmark::State& state) {
sp<RenderNode> node = new RenderNode();
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
while (state.KeepRunning()) {
canvas->resetRecording(100, 100, node.get());
@@ -47,12 +48,12 @@ BENCHMARK(BM_RenderNode_recordSimple);
void BM_RenderNode_recordSimpleWithReuse(benchmark::State& state) {
sp<RenderNode> node = new RenderNode();
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
- delete canvas->finishRecording();
+ static_cast<void>(canvas->finishRecording());
while (state.KeepRunning()) {
canvas->resetRecording(100, 100, node.get());
canvas->drawColor(0x00000000, SkBlendMode::kSrcOver);
- canvas->finishRecording()->reuseDisplayList(node.get());
+ canvas->finishRecording().clear(node.get());
}
}
BENCHMARK(BM_RenderNode_recordSimpleWithReuse); \ No newline at end of file
diff --git a/libs/hwui/tests/unit/RenderNodeTests.cpp b/libs/hwui/tests/unit/RenderNodeTests.cpp
index 4659a929a9eb..61bd646b0a76 100644
--- a/libs/hwui/tests/unit/RenderNodeTests.cpp
+++ b/libs/hwui/tests/unit/RenderNodeTests.cpp
@@ -326,7 +326,7 @@ RENDERTHREAD_TEST(DISABLED_RenderNode, prepareTree_HwLayer_AVD_enqueueDamage) {
// Check that the VD is in the dislay list, and the layer update queue contains the correct
// damage rect.
- EXPECT_TRUE(rootNode->getDisplayList()->hasVectorDrawables());
+ EXPECT_TRUE(rootNode->getDisplayList().hasVectorDrawables());
ASSERT_FALSE(info.layerUpdateQueue->entries().empty());
EXPECT_EQ(rootNode.get(), info.layerUpdateQueue->entries().at(0).renderNode.get());
EXPECT_EQ(uirenderer::Rect(0, 0, 200, 400), info.layerUpdateQueue->entries().at(0).damage);
diff --git a/libs/hwui/tests/unit/SkiaDisplayListTests.cpp b/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
index c63f008c4aed..801a294b5648 100644
--- a/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
+++ b/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
@@ -38,12 +38,13 @@ TEST(SkiaDisplayList, create) {
}
TEST(SkiaDisplayList, reset) {
- std::unique_ptr<SkiaDisplayList> skiaDL;
+ DisplayList displayList;
{
SkiaRecordingCanvas canvas{nullptr, 1, 1};
canvas.drawColor(0, SkBlendMode::kSrc);
- skiaDL.reset(canvas.finishRecording());
+ displayList = canvas.finishRecording();
}
+ SkiaDisplayList* skiaDL = displayList.asSkiaDl();
SkCanvas dummyCanvas;
RenderNodeDrawable drawable(nullptr, &dummyCanvas);
diff --git a/location/java/android/location/CorrelationVector.java b/location/java/android/location/CorrelationVector.java
new file mode 100644
index 000000000000..eca35dd69362
--- /dev/null
+++ b/location/java/android/location/CorrelationVector.java
@@ -0,0 +1,228 @@
+/*
+ * 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.location;
+
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * Contains info about the correlation output of incoming GNSS signal and a local copy of
+ * its corresponding spreading code at a given frequency offset.
+ *
+ * @hide
+ */
+@SystemApi
+public final class CorrelationVector implements Parcelable {
+
+ private final double mSamplingWidthMeters;
+ private final double mSamplingStartMeters;
+ private final int mFrequencyOffsetMetersPerSecond;
+ @NonNull private final int[] mMagnitude;
+
+ /**
+ * Returns the space between correlation samples in meters.
+ */
+ @FloatRange(from = 0.0f, fromInclusive = false)
+ public double getSamplingWidthMeters() {
+ return mSamplingWidthMeters;
+ }
+
+ /**
+ * Returns the offset of the first sampling bin in meters.
+ *
+ * <p>The following sampling bins are located at positive offsets from this value as follows:
+ * samplingStartMeters, samplingStartMeters + samplingWidthMeters, ... , samplingStartMeters +
+ * (magnitude.size-1) * samplingWidthMeters.
+ *
+ */
+ @FloatRange(from = 0.0f)
+ public double getSamplingStartMeters() {
+ return mSamplingStartMeters;
+ }
+
+ /**
+ * Returns the frequency offset from reported pseudorange rate for this CorrelationVector.
+ */
+ @IntRange(from = 0)
+ public int getFrequencyOffsetMetersPerSecond() {
+ return mFrequencyOffsetMetersPerSecond;
+ }
+
+ /**
+ * Returns the data array representing normalized correlation magnitude values.
+ *
+ * <p>The data are normalized correlation magnitude values from -1 to 1, the reported value must
+ * be encoded as signed 16 bit integer where 1 is represented by 32767 and -1 is represented
+ * by -32768.
+ *
+ */
+ @NonNull
+ public int[] getMagnitude() {
+ return mMagnitude.clone();
+ }
+
+ private CorrelationVector(Builder builder) {
+ Preconditions.checkNotNull(builder.mMagnitude, "Magnitude array must not be null");
+ Preconditions.checkArgumentPositive(builder.mMagnitude.length,
+ "Magnitude array must have non-zero length");
+ Preconditions.checkArgumentNonNegative(builder.mFrequencyOffsetMetersPerSecond,
+ "FrequencyOffsetMetersPerSecond must be non-negative (greater than or equal to 0)");
+ Preconditions.checkArgument(builder.mSamplingWidthMeters > 0.0,
+ "SamplingWidthMeters must be positive (greater than 0)");
+ Preconditions.checkArgument(builder.mSamplingStartMeters >= 0.0,
+ "SamplingStartMeters must be non-negative (greater than or equal to 0)");
+ mMagnitude = builder.mMagnitude;
+ mFrequencyOffsetMetersPerSecond = builder.mFrequencyOffsetMetersPerSecond;
+ mSamplingWidthMeters = builder.mSamplingWidthMeters;
+ mSamplingStartMeters = builder.mSamplingStartMeters;
+ }
+
+ private CorrelationVector(Parcel in) {
+ mSamplingWidthMeters = in.readDouble();
+ mSamplingStartMeters = in.readDouble();
+ mFrequencyOffsetMetersPerSecond = in.readInt();
+ mMagnitude = new int[in.readInt()];
+ in.readIntArray(mMagnitude);
+ }
+
+ /*
+ * Method definitions to support Parcelable operations.
+ */
+ public static final @NonNull Parcelable.Creator<CorrelationVector> CREATOR =
+ new Parcelable.Creator<CorrelationVector>() {
+ @Override
+ public CorrelationVector createFromParcel(Parcel parcel) {
+ return new CorrelationVector(parcel);
+ }
+
+ @Override
+ public CorrelationVector[] newArray(int size) {
+ return new CorrelationVector[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "CorrelationVector{"
+ + "FrequencyOffsetMetersPerSecond=" + mFrequencyOffsetMetersPerSecond
+ + ", SamplingWidthMeters=" + mSamplingWidthMeters
+ + ", SamplingStartMeters=" + mSamplingStartMeters
+ + ", Magnitude=" + Arrays.toString(mMagnitude)
+ + '}';
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeDouble(mSamplingWidthMeters);
+ dest.writeDouble(mSamplingStartMeters);
+ dest.writeInt(mFrequencyOffsetMetersPerSecond);
+ dest.writeInt(mMagnitude.length);
+ dest.writeIntArray(mMagnitude);
+ }
+
+ /**
+ * Returns true if this {@link CorrelationVector} is equivalent to the given object.
+ * Returns false otherwise.
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (object == this) {
+ return true;
+ }
+ if (!(object instanceof CorrelationVector)) {
+ return false;
+ }
+ CorrelationVector c = (CorrelationVector) object;
+ return Arrays.equals(mMagnitude, c.getMagnitude())
+ && Double.compare(mSamplingWidthMeters, c.getSamplingWidthMeters()) == 0
+ && Double.compare(mSamplingStartMeters, c.getSamplingStartMeters()) == 0
+ && Integer.compare(mFrequencyOffsetMetersPerSecond,
+ c.getFrequencyOffsetMetersPerSecond()) == 0;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mSamplingWidthMeters, mSamplingStartMeters,
+ mFrequencyOffsetMetersPerSecond, Arrays.hashCode(mMagnitude));
+ }
+
+ /**
+ * Builder class for CorrelationVector.
+ */
+ public static final class Builder {
+
+ private double mSamplingWidthMeters;
+ private double mSamplingStartMeters;
+ private int mFrequencyOffsetMetersPerSecond;
+ @NonNull private int[] mMagnitude;
+
+ /** Sets the space between correlation samples in meters. */
+ @NonNull
+ public Builder setSamplingWidthMeters(
+ @FloatRange(from = 0.0f, fromInclusive = false) double samplingWidthMeters) {
+ mSamplingWidthMeters = samplingWidthMeters;
+ return this;
+ }
+
+ /** Sets the offset of the first sampling bin in meters. */
+ @NonNull
+ public Builder setSamplingStartMeters(@FloatRange(from = 0.0f) double samplingStartMeters) {
+ mSamplingStartMeters = samplingStartMeters;
+ return this;
+ }
+
+ /** Sets the frequency offset from reported pseudorange rate for this CorrelationVector */
+ @NonNull
+ public Builder setFrequencyOffsetMetersPerSecond(
+ @IntRange(from = 0) int frequencyOffsetMetersPerSecond) {
+ mFrequencyOffsetMetersPerSecond = frequencyOffsetMetersPerSecond;
+ return this;
+ }
+
+ /** Sets the data array representing normalized correlation magnitude values. */
+ @NonNull
+ public Builder setMagnitude(@NonNull int[] magnitude) {
+ mMagnitude = magnitude;
+ return this;
+ }
+
+ /**
+ * Build CorrelationVector object.
+ *
+ * @return instance of CorrelationVector
+ */
+ @NonNull
+ public CorrelationVector build() {
+ return new CorrelationVector(this);
+ }
+ }
+}
diff --git a/location/java/android/location/GnssCapabilities.java b/location/java/android/location/GnssCapabilities.java
index b650a9fd0416..a5e28158ab78 100644
--- a/location/java/android/location/GnssCapabilities.java
+++ b/location/java/android/location/GnssCapabilities.java
@@ -58,6 +58,8 @@ public final class GnssCapabilities implements Parcelable {
/** @hide */
public static final int TOP_HAL_CAPABILITY_ANTENNA_INFO = 2048;
/** @hide */
+ public static final int TOP_HAL_CAPABILITY_CORRELATION_VECTOR = 4096;
+ /** @hide */
public static final int TOP_HAL_CAPABILITY_SATELLITE_PVT = 8192;
/** @hide */
@@ -67,7 +69,8 @@ public final class GnssCapabilities implements Parcelable {
TOP_HAL_CAPABILITY_MEASUREMENTS, TOP_HAL_CAPABILITY_NAV_MESSAGES,
TOP_HAL_CAPABILITY_LOW_POWER_MODE, TOP_HAL_CAPABILITY_SATELLITE_BLOCKLIST,
TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS, TOP_HAL_CAPABILITY_ANTENNA_INFO,
- TOP_HAL_CAPABILITY_SATELLITE_PVT})
+ TOP_HAL_CAPABILITY_CORRELATION_VECTOR, TOP_HAL_CAPABILITY_SATELLITE_PVT})
+
@Retention(RetentionPolicy.SOURCE)
public @interface TopHalCapabilityFlags {}
@@ -337,6 +340,17 @@ public final class GnssCapabilities implements Parcelable {
}
/**
+ * Returns {@code true} if GNSS chipset supports correlation vectors as part of measurements
+ * outputs, {@code false} otherwise.
+ *
+ * @hide
+ */
+ @SystemApi
+ public boolean hasMeasurementCorrelationVectors() {
+ return (mTopFlags & TOP_HAL_CAPABILITY_CORRELATION_VECTOR) != 0;
+ }
+
+ /**
* Returns {@code true} if GNSS chipset supports line-of-sight satellite identification
* measurement corrections, {@code false} otherwise.
*
@@ -533,6 +547,9 @@ public final class GnssCapabilities implements Parcelable {
if (hasAntennaInfo()) {
builder.append("ANTENNA_INFO ");
}
+ if (hasMeasurementCorrelationVectors()) {
+ builder.append("MEASUREMENT_CORRELATION_VECTORS ");
+ }
if (hasMeasurementCorrectionsLosSats()) {
builder.append("LOS_SATS ");
}
@@ -720,6 +737,17 @@ public final class GnssCapabilities implements Parcelable {
}
/**
+ * Sets correlation vector capability.
+ *
+ * @hide
+ */
+ @SystemApi
+ public @NonNull Builder setHasMeasurementCorrelationVectors(boolean capable) {
+ mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_CORRELATION_VECTOR, capable);
+ return this;
+ }
+
+ /**
* Sets measurement corrections line-of-sight satellites capabilitity.
*
* @hide
diff --git a/location/java/android/location/GnssMeasurement.java b/location/java/android/location/GnssMeasurement.java
index 5509a6c65614..3d188c0acce3 100644
--- a/location/java/android/location/GnssMeasurement.java
+++ b/location/java/android/location/GnssMeasurement.java
@@ -38,6 +38,9 @@ import android.os.Parcelable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
/**
* A class representing a GNSS satellite measurement, containing raw and computed information.
@@ -70,6 +73,7 @@ public final class GnssMeasurement implements Parcelable {
private double mSatelliteInterSignalBiasNanos;
private double mSatelliteInterSignalBiasUncertaintyNanos;
@Nullable private SatellitePvt mSatellitePvt;
+ @Nullable private Collection<CorrelationVector> mReadOnlyCorrelationVectors;
// The following enumerations must be in sync with the values declared in GNSS HAL.
@@ -77,6 +81,7 @@ public final class GnssMeasurement implements Parcelable {
private static final int HAS_CODE_TYPE = (1 << 14);
private static final int HAS_BASEBAND_CN0 = (1 << 15);
private static final int HAS_SATELLITE_PVT = (1 << 20);
+ private static final int HAS_CORRELATION_VECTOR = (1 << 21);
/**
* The status of the multipath indicator.
@@ -173,8 +178,8 @@ public final class GnssMeasurement implements Parcelable {
* @hide
*/
@IntDef(flag = true, prefix = { "ADR_STATE_" }, value = {
- ADR_STATE_VALID, ADR_STATE_RESET, ADR_STATE_CYCLE_SLIP, ADR_STATE_HALF_CYCLE_RESOLVED,
- ADR_STATE_HALF_CYCLE_REPORTED
+ ADR_STATE_UNKNOWN, ADR_STATE_VALID, ADR_STATE_RESET, ADR_STATE_CYCLE_SLIP,
+ ADR_STATE_HALF_CYCLE_RESOLVED, ADR_STATE_HALF_CYCLE_REPORTED
})
@Retention(RetentionPolicy.SOURCE)
public @interface AdrState {}
@@ -279,6 +284,7 @@ public final class GnssMeasurement implements Parcelable {
mSatelliteInterSignalBiasUncertaintyNanos =
measurement.mSatelliteInterSignalBiasUncertaintyNanos;
mSatellitePvt = measurement.mSatellitePvt;
+ mReadOnlyCorrelationVectors = measurement.mReadOnlyCorrelationVectors;
}
/**
@@ -1712,6 +1718,7 @@ public final class GnssMeasurement implements Parcelable {
*
* <p>The value is only available if {@link #hasSatellitePvt()} is
* {@code true}.
+ *
* @hide
*/
@Nullable
@@ -1745,6 +1752,58 @@ public final class GnssMeasurement implements Parcelable {
resetFlag(HAS_SATELLITE_PVT);
}
+ /**
+ * Returns {@code true} if {@link #getCorrelationVectors()} is available,
+ * {@code false} otherwise.
+ *
+ * @hide
+ */
+ @SystemApi
+ public boolean hasCorrelationVectors() {
+ return isFlagSet(HAS_CORRELATION_VECTOR);
+ }
+
+ /**
+ * Gets read-only collection of CorrelationVector with each CorrelationVector corresponding to a
+ * frequency offset.
+ *
+ * <p>To represent correlation values over a 2D spaces (delay and frequency), a
+ * CorrelationVector is required per frequency offset, and each CorrelationVector contains
+ * correlation values at equally spaced spatial offsets.
+ *
+ * @hide
+ */
+ @Nullable
+ @SystemApi
+ public Collection<CorrelationVector> getCorrelationVectors() {
+ return mReadOnlyCorrelationVectors;
+ }
+
+ /**
+ * Sets the CorrelationVectors.
+ *
+ * @hide
+ */
+ @TestApi
+ public void setCorrelationVectors(@Nullable Collection<CorrelationVector> correlationVectors) {
+ if (correlationVectors == null || correlationVectors.isEmpty()) {
+ resetCorrelationVectors();
+ } else {
+ setFlag(HAS_CORRELATION_VECTOR);
+ mReadOnlyCorrelationVectors = Collections.unmodifiableCollection(correlationVectors);
+ }
+ }
+
+ /**
+ * Resets the CorrelationVectors.
+ *
+ * @hide
+ */
+ @TestApi
+ public void resetCorrelationVectors() {
+ resetFlag(HAS_CORRELATION_VECTOR);
+ mReadOnlyCorrelationVectors = null;
+ }
public static final @NonNull Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() {
@Override
@@ -1781,6 +1840,15 @@ public final class GnssMeasurement implements Parcelable {
ClassLoader classLoader = getClass().getClassLoader();
gnssMeasurement.mSatellitePvt = parcel.readParcelable(classLoader);
}
+ if (gnssMeasurement.hasCorrelationVectors()) {
+ CorrelationVector[] correlationVectorsArray =
+ new CorrelationVector[parcel.readInt()];
+ parcel.readTypedArray(correlationVectorsArray, CorrelationVector.CREATOR);
+ Collection<CorrelationVector> corrVecCollection =
+ Arrays.asList(correlationVectorsArray);
+ gnssMeasurement.mReadOnlyCorrelationVectors =
+ Collections.unmodifiableCollection(corrVecCollection);
+ }
return gnssMeasurement;
}
@@ -1821,6 +1889,13 @@ public final class GnssMeasurement implements Parcelable {
if (hasSatellitePvt()) {
parcel.writeParcelable(mSatellitePvt, flags);
}
+ if (hasCorrelationVectors()) {
+ int correlationVectorCount = mReadOnlyCorrelationVectors.size();
+ CorrelationVector[] correlationVectorArray =
+ mReadOnlyCorrelationVectors.toArray(new CorrelationVector[correlationVectorCount]);
+ parcel.writeInt(correlationVectorArray.length);
+ parcel.writeTypedArray(correlationVectorArray, flags);
+ }
}
@Override
@@ -1928,6 +2003,13 @@ public final class GnssMeasurement implements Parcelable {
builder.append(mSatellitePvt.toString());
}
+ if (hasCorrelationVectors()) {
+ for (CorrelationVector correlationVector : mReadOnlyCorrelationVectors) {
+ builder.append(correlationVector.toString());
+ builder.append("\n");
+ }
+ }
+
return builder.toString();
}
@@ -1958,6 +2040,7 @@ public final class GnssMeasurement implements Parcelable {
resetSatelliteInterSignalBiasNanos();
resetSatelliteInterSignalBiasUncertaintyNanos();
resetSatellitePvt();
+ resetCorrelationVectors();
}
private void setFlag(int flag) {
diff --git a/location/java/android/location/GnssMeasurementRequest.java b/location/java/android/location/GnssMeasurementRequest.java
index 613f5918b708..f509252e7542 100644
--- a/location/java/android/location/GnssMeasurementRequest.java
+++ b/location/java/android/location/GnssMeasurementRequest.java
@@ -17,20 +17,38 @@
package android.location;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import java.util.Objects;
+
/**
* This class contains extra parameters to pass in a GNSS measurement request.
*/
public final class GnssMeasurementRequest implements Parcelable {
+ private final boolean mCorrelationVectorOutputsEnabled;
private final boolean mFullTracking;
/**
* Creates a {@link GnssMeasurementRequest} with a full list of parameters.
*/
- private GnssMeasurementRequest(boolean fullTracking) {
+ private GnssMeasurementRequest(boolean fullTracking, boolean correlationVectorOutputsEnabled) {
mFullTracking = fullTracking;
+ mCorrelationVectorOutputsEnabled = correlationVectorOutputsEnabled;
+ }
+
+ /**
+ * Represents whether to enable correlation vector outputs.
+ *
+ * <p>If true, enable correlation vectors as part of the raw GNSS measurements outputs.
+ * If false, disable correlation vectors.
+ *
+ * @hide
+ */
+ @SystemApi
+ public boolean isCorrelationVectorOutputsEnabled() {
+ return mCorrelationVectorOutputsEnabled;
}
/**
@@ -56,7 +74,7 @@ public final class GnssMeasurementRequest implements Parcelable {
@Override
@NonNull
public GnssMeasurementRequest createFromParcel(@NonNull Parcel parcel) {
- return new GnssMeasurementRequest(parcel.readBoolean());
+ return new GnssMeasurementRequest(parcel.readBoolean(), parcel.readBoolean());
}
@Override
@@ -68,6 +86,7 @@ public final class GnssMeasurementRequest implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel parcel, int flags) {
parcel.writeBoolean(mFullTracking);
+ parcel.writeBoolean(mCorrelationVectorOutputsEnabled);
}
@NonNull
@@ -78,6 +97,9 @@ public final class GnssMeasurementRequest implements Parcelable {
if (mFullTracking) {
s.append("FullTracking");
}
+ if (mCorrelationVectorOutputsEnabled) {
+ s.append(", CorrelationVectorOutPuts");
+ }
s.append(']');
return s.toString();
}
@@ -90,13 +112,15 @@ public final class GnssMeasurementRequest implements Parcelable {
GnssMeasurementRequest other = (GnssMeasurementRequest) obj;
if (mFullTracking != other.mFullTracking) return false;
-
+ if (mCorrelationVectorOutputsEnabled != other.mCorrelationVectorOutputsEnabled) {
+ return false;
+ }
return true;
}
@Override
public int hashCode() {
- return mFullTracking ? 1 : 0;
+ return Objects.hash(mFullTracking, mCorrelationVectorOutputsEnabled);
}
@Override
@@ -106,6 +130,7 @@ public final class GnssMeasurementRequest implements Parcelable {
/** Builder for {@link GnssMeasurementRequest} */
public static final class Builder {
+ private boolean mCorrelationVectorOutputsEnabled;
private boolean mFullTracking;
/**
@@ -118,10 +143,25 @@ public final class GnssMeasurementRequest implements Parcelable {
* Constructs a {@link Builder} instance by copying a {@link GnssMeasurementRequest}.
*/
public Builder(@NonNull GnssMeasurementRequest request) {
+ mCorrelationVectorOutputsEnabled = request.isCorrelationVectorOutputsEnabled();
mFullTracking = request.isFullTracking();
}
/**
+ * Set the value of whether to enable correlation vector outputs, which is false by default.
+ *
+ * <p>If true, enable correlation vectors as part of the raw GNSS measurements outputs.
+ * If false, disable correlation vectors.
+ *
+ * @hide
+ */
+ @SystemApi
+ @NonNull public Builder setCorrelationVectorOutputsEnabled(boolean value) {
+ mCorrelationVectorOutputsEnabled = value;
+ return this;
+ }
+
+ /**
* Set the value of whether to enable full GNSS tracking, which is false by default.
*
* <p>If true, GNSS chipset switches off duty cycling. In such a mode, no clock
@@ -146,7 +186,7 @@ public final class GnssMeasurementRequest implements Parcelable {
/** Builds a {@link GnssMeasurementRequest} instance as specified by this builder. */
@NonNull
public GnssMeasurementRequest build() {
- return new GnssMeasurementRequest(mFullTracking);
+ return new GnssMeasurementRequest(mFullTracking, mCorrelationVectorOutputsEnabled);
}
}
}
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 2dc9eb44236f..0ce1ad0d9380 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -3171,7 +3171,9 @@ public class LocationManager {
for (GnssMeasurementRequest request : requests) {
if (request.isFullTracking()) {
builder.setFullTracking(true);
- break;
+ }
+ if (request.isCorrelationVectorOutputsEnabled()) {
+ builder.setCorrelationVectorOutputsEnabled(true);
}
}
diff --git a/location/java/android/location/LocationManagerInternal.java b/location/java/android/location/LocationManagerInternal.java
index 1027f9c0a7be..a6a0e7aa24ff 100644
--- a/location/java/android/location/LocationManagerInternal.java
+++ b/location/java/android/location/LocationManagerInternal.java
@@ -80,4 +80,12 @@ public abstract class LocationManagerInternal {
*/
// TODO: there is no reason for this to exist as part of any API. move all the logic into gnss
public abstract void sendNiResponse(int notifId, int userResponse);
+
+ /**
+ * Returns the GNSS provided time.
+ *
+ * @return LocationTime object that includes the current time, according to the GNSS location
+ * provider, and the elapsed nanos since boot the current time was computed at.
+ */
+ public abstract @Nullable LocationTime getGnssTimeMillis();
}
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index ae97a71bd93a..607c8f11e01a 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -25,6 +25,7 @@ import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.hardware.HardwareBuffer;
import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.metrics.PlaybackComponent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -1538,7 +1539,8 @@ import java.util.concurrent.locks.ReentrantLock;
</tbody>
</table>
*/
-final public class MediaCodec {
+final public class MediaCodec implements PlaybackComponent {
+
/**
* Per buffer metadata includes an offset and size specifying
* the range of valid data in the associated codec (output) buffer.
@@ -1680,6 +1682,7 @@ final public class MediaCodec {
private MediaCodecInfo mCodecInfo;
private final Object mCodecInfoLock = new Object();
private MediaCrypto mCrypto;
+ private String mPlaybackId;
private static final int EVENT_CALLBACK = 1;
private static final int EVENT_SET_CALLBACK = 2;
@@ -1690,6 +1693,23 @@ final public class MediaCodec {
private static final int CB_ERROR = 3;
private static final int CB_OUTPUT_FORMAT_CHANGE = 4;
+
+ /**
+ * @hide
+ */
+ @Override
+ public void setPlaybackId(@NonNull String playbackId) {
+ // TODO: add a native method to pass the ID to the native code for logging.
+ mPlaybackId = playbackId;
+ }
+ /**
+ * @hide
+ */
+ @Override
+ public String getPlaybackId() {
+ return mPlaybackId;
+ }
+
private class EventHandler extends Handler {
private MediaCodec mCodec;
diff --git a/media/java/android/media/metrics/IPlaybackMetricsManager.aidl b/media/java/android/media/metrics/IPlaybackMetricsManager.aidl
index 47debe90c854..85c93612e7e2 100644
--- a/media/java/android/media/metrics/IPlaybackMetricsManager.aidl
+++ b/media/java/android/media/metrics/IPlaybackMetricsManager.aidl
@@ -16,6 +16,7 @@
package android.media.metrics;
+import android.media.metrics.PlaybackErrorEvent;
import android.media.metrics.PlaybackMetrics;
/**
@@ -25,4 +26,5 @@ import android.media.metrics.PlaybackMetrics;
interface IPlaybackMetricsManager {
void reportPlaybackMetrics(in String sessionId, in PlaybackMetrics metrics, int userId);
String getSessionId(int userId);
+ void reportPlaybackErrorEvent(in String sessionId, in PlaybackErrorEvent event, int userId);
} \ No newline at end of file
diff --git a/media/java/android/media/metrics/PlaybackComponent.java b/media/java/android/media/metrics/PlaybackComponent.java
new file mode 100644
index 000000000000..625dd0a1870d
--- /dev/null
+++ b/media/java/android/media/metrics/PlaybackComponent.java
@@ -0,0 +1,36 @@
+/*
+ * 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.media.metrics;
+
+import android.annotation.NonNull;
+
+/**
+ * Interface for playback related components used by playback metrics.
+ * @hide
+ */
+public interface PlaybackComponent {
+
+ /**
+ * Sets the playback ID of the component.
+ */
+ void setPlaybackId(@NonNull String playbackId);
+
+ /**
+ * Gets playback ID.
+ */
+ @NonNull String getPlaybackId();
+}
diff --git a/media/java/android/media/metrics/PlaybackErrorEvent.aidl b/media/java/android/media/metrics/PlaybackErrorEvent.aidl
new file mode 100644
index 000000000000..b0d6b4beae57
--- /dev/null
+++ b/media/java/android/media/metrics/PlaybackErrorEvent.aidl
@@ -0,0 +1,19 @@
+/*
+ * 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.media.metrics;
+
+parcelable PlaybackErrorEvent;
diff --git a/media/java/android/media/metrics/PlaybackErrorEvent.java b/media/java/android/media/metrics/PlaybackErrorEvent.java
new file mode 100644
index 000000000000..db7000536299
--- /dev/null
+++ b/media/java/android/media/metrics/PlaybackErrorEvent.java
@@ -0,0 +1,234 @@
+/*
+ * 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.media.metrics;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.util.Objects;
+
+/**
+ * Playback error event.
+ * @hide
+ */
+public final class PlaybackErrorEvent implements Parcelable {
+ public static final int ERROR_CODE_UNKNOWN = 0;
+ public static final int ERROR_CODE_OTHER = 1;
+ public static final int ERROR_CODE_RUNTIME = 2;
+
+ private final @Nullable String mExceptionStack;
+ private final int mErrorCode;
+ private final int mSubErrorCode;
+ private final long mTimeSincePlaybackCreatedMillis;
+
+
+ /** @hide */
+ // TODO: more error types
+ @IntDef(prefix = "ERROR_CODE_", value = {
+ ERROR_CODE_UNKNOWN,
+ ERROR_CODE_OTHER,
+ ERROR_CODE_RUNTIME
+ })
+ @Retention(java.lang.annotation.RetentionPolicy.SOURCE)
+ public @interface ErrorCode {}
+
+ /**
+ * Creates a new PlaybackErrorEvent.
+ *
+ * @hide
+ */
+ public PlaybackErrorEvent(
+ @Nullable String exceptionStack,
+ int errorCode,
+ int subErrorCode,
+ long timeSincePlaybackCreatedMillis) {
+ this.mExceptionStack = exceptionStack;
+ this.mErrorCode = errorCode;
+ this.mSubErrorCode = subErrorCode;
+ this.mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis;
+ }
+
+ /** @hide */
+ @Nullable
+ public String getExceptionStack() {
+ return mExceptionStack;
+ }
+
+ @ErrorCode
+ public int getErrorCode() {
+ return mErrorCode;
+ }
+
+ public int getSubErrorCode() {
+ return mSubErrorCode;
+ }
+
+ public long getTimeSincePlaybackCreatedMillis() {
+ return mTimeSincePlaybackCreatedMillis;
+ }
+
+ @Override
+ public String toString() {
+ return "PlaybackErrorEvent { "
+ + "exceptionStack = " + mExceptionStack + ", "
+ + "errorCode = " + mErrorCode + ", "
+ + "subErrorCode = " + mSubErrorCode + ", "
+ + "timeSincePlaybackCreatedMillis = " + mTimeSincePlaybackCreatedMillis
+ + " }";
+ }
+
+ @Override
+ public boolean equals(@Nullable Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ PlaybackErrorEvent that = (PlaybackErrorEvent) o;
+ return Objects.equals(mExceptionStack, that.mExceptionStack)
+ && mErrorCode == that.mErrorCode
+ && mSubErrorCode == that.mSubErrorCode
+ && mTimeSincePlaybackCreatedMillis == that.mTimeSincePlaybackCreatedMillis;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mExceptionStack, mErrorCode, mSubErrorCode,
+ mTimeSincePlaybackCreatedMillis);
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ byte flg = 0;
+ if (mExceptionStack != null) flg |= 0x1;
+ dest.writeByte(flg);
+ if (mExceptionStack != null) dest.writeString(mExceptionStack);
+ dest.writeInt(mErrorCode);
+ dest.writeInt(mSubErrorCode);
+ dest.writeLong(mTimeSincePlaybackCreatedMillis);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** @hide */
+ /* package-private */ PlaybackErrorEvent(@NonNull Parcel in) {
+ byte flg = in.readByte();
+ String exceptionStack = (flg & 0x1) == 0 ? null : in.readString();
+ int errorCode = in.readInt();
+ int subErrorCode = in.readInt();
+ long timeSincePlaybackCreatedMillis = in.readLong();
+
+ this.mExceptionStack = exceptionStack;
+ this.mErrorCode = errorCode;
+ this.mSubErrorCode = subErrorCode;
+ this.mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis;
+ }
+
+ public static final @NonNull Parcelable.Creator<PlaybackErrorEvent> CREATOR =
+ new Parcelable.Creator<PlaybackErrorEvent>() {
+ @Override
+ public PlaybackErrorEvent[] newArray(int size) {
+ return new PlaybackErrorEvent[size];
+ }
+
+ @Override
+ public PlaybackErrorEvent createFromParcel(@NonNull Parcel in) {
+ return new PlaybackErrorEvent(in);
+ }
+ };
+
+ /**
+ * A builder for {@link PlaybackErrorEvent}
+ */
+ public static final class Builder {
+ private @Nullable Exception mException;
+ private int mErrorCode;
+ private int mSubErrorCode;
+ private long mTimeSincePlaybackCreatedMillis;
+
+ /**
+ * Creates a new Builder.
+ *
+ * @hide
+ */
+ public Builder(
+ @Nullable Exception exception,
+ int errorCode,
+ int subErrorCode,
+ long timeSincePlaybackCreatedMillis) {
+ mException = exception;
+ mErrorCode = errorCode;
+ mSubErrorCode = subErrorCode;
+ mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis;
+ }
+
+ /**
+ * Sets the {@link Exception} object.
+ */
+ public @NonNull Builder setException(@NonNull Exception value) {
+ mException = value;
+ return this;
+ }
+
+ /**
+ * Sets error code.
+ */
+ public @NonNull Builder setErrorCode(@ErrorCode int value) {
+ mErrorCode = value;
+ return this;
+ }
+
+ /**
+ * Sets sub error code.
+ */
+ public @NonNull Builder setSubErrorCode(int value) {
+ mSubErrorCode = value;
+ return this;
+ }
+
+ /**
+ * Set the timestamp in milliseconds.
+ */
+ public @NonNull Builder setTimeSincePlaybackCreatedMillis(long value) {
+ mTimeSincePlaybackCreatedMillis = value;
+ return this;
+ }
+
+ /** Builds the instance. */
+ public @NonNull PlaybackErrorEvent build() {
+
+ String stack;
+ if (mException.getStackTrace() != null && mException.getStackTrace().length > 0) {
+ // TODO: a better definition of the stack trace
+ stack = mException.getStackTrace()[0].toString();
+ } else {
+ stack = null;
+ }
+
+ PlaybackErrorEvent o = new PlaybackErrorEvent(
+ stack,
+ mErrorCode,
+ mSubErrorCode,
+ mTimeSincePlaybackCreatedMillis);
+ return o;
+ }
+ }
+}
diff --git a/media/java/android/media/metrics/PlaybackMetricsManager.java b/media/java/android/media/metrics/PlaybackMetricsManager.java
index d51ff473696d..b778bbd6fa1d 100644
--- a/media/java/android/media/metrics/PlaybackMetricsManager.java
+++ b/media/java/android/media/metrics/PlaybackMetricsManager.java
@@ -61,4 +61,16 @@ public class PlaybackMetricsManager {
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Reports error event.
+ * @hide
+ */
+ public void reportPlaybackErrorEvent(@NonNull String sessionId, PlaybackErrorEvent event) {
+ try {
+ mService.reportPlaybackErrorEvent(sessionId, event, mUserId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/media/java/android/media/metrics/PlaybackSession.java b/media/java/android/media/metrics/PlaybackSession.java
index 4ad89067952c..07f4fbc219c7 100644
--- a/media/java/android/media/metrics/PlaybackSession.java
+++ b/media/java/android/media/metrics/PlaybackSession.java
@@ -50,6 +50,13 @@ public final class PlaybackSession implements AutoCloseable {
mManager.reportPlaybackMetrics(mId, metrics);
}
+ /**
+ * Reports error event.
+ */
+ public void reportPlaybackErrorEvent(PlaybackErrorEvent event) {
+ mManager.reportPlaybackErrorEvent(mId, event);
+ }
+
public @NonNull String getId() {
return mId;
}
diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl
index ed99fad5088a..d8d1ba1341bb 100644
--- a/media/java/android/media/tv/ITvInputManager.aidl
+++ b/media/java/android/media/tv/ITvInputManager.aidl
@@ -94,6 +94,8 @@ interface ITvInputManager {
// For the recording session
void startRecording(in IBinder sessionToken, in Uri programUri, in Bundle params, int userId);
void stopRecording(in IBinder sessionToken, int userId);
+ void pauseRecording(in IBinder sessionToken, in Bundle params, int userId);
+ void resumeRecording(in IBinder sessionToken, in Bundle params, int userId);
// For TV input hardware binding
List<TvInputHardwareInfo> getHardwareList();
diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl
index 24b87d50b33e..158cf211d9f0 100644
--- a/media/java/android/media/tv/ITvInputSession.aidl
+++ b/media/java/android/media/tv/ITvInputSession.aidl
@@ -58,4 +58,6 @@ oneway interface ITvInputSession {
// For the recording session
void startRecording(in Uri programUri, in Bundle params);
void stopRecording();
+ void pauseRecording(in Bundle params);
+ void resumeRecording(in Bundle params);
}
diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java
index e89d33d70d5c..abccf8da9cfc 100644
--- a/media/java/android/media/tv/ITvInputSessionWrapper.java
+++ b/media/java/android/media/tv/ITvInputSessionWrapper.java
@@ -68,6 +68,8 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
private static final int DO_TIME_SHIFT_ENABLE_POSITION_TRACKING = 19;
private static final int DO_START_RECORDING = 20;
private static final int DO_STOP_RECORDING = 21;
+ private static final int DO_PAUSE_RECORDING = 22;
+ private static final int DO_RESUME_RECORDING = 23;
private final boolean mIsRecordingSession;
private final HandlerCaller mCaller;
@@ -224,6 +226,14 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
mTvInputRecordingSessionImpl.stopRecording();
break;
}
+ case DO_PAUSE_RECORDING: {
+ mTvInputRecordingSessionImpl.pauseRecording((Bundle) msg.obj);
+ break;
+ }
+ case DO_RESUME_RECORDING: {
+ mTvInputRecordingSessionImpl.resumeRecording((Bundle) msg.obj);
+ break;
+ }
default: {
Log.w(TAG, "Unhandled message code: " + msg.what);
break;
@@ -363,6 +373,16 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_STOP_RECORDING));
}
+ @Override
+ public void pauseRecording(@Nullable Bundle params) {
+ mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_PAUSE_RECORDING, params));
+ }
+
+ @Override
+ public void resumeRecording(@Nullable Bundle params) {
+ mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_RESUME_RECORDING, params));
+ }
+
private final class TvInputEventReceiver extends InputEventReceiver {
public TvInputEventReceiver(InputChannel inputChannel, Looper looper) {
super(inputChannel, looper);
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index 195ad5bc10f9..54cb2bff5566 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -143,6 +143,7 @@ public final class TvInputInfo implements Parcelable {
// Attributes from XML meta data.
private final String mSetupActivity;
private final boolean mCanRecord;
+ private final boolean mCanPauseRecording;
private final int mTunerCount;
// Attributes specific to HDMI
@@ -264,8 +265,8 @@ public final class TvInputInfo implements Parcelable {
private TvInputInfo(ResolveInfo service, String id, int type, boolean isHardwareInput,
CharSequence label, int labelResId, Icon icon, Icon iconStandby, Icon iconDisconnected,
- String setupActivity, boolean canRecord, int tunerCount, HdmiDeviceInfo hdmiDeviceInfo,
- boolean isConnectedToHdmiSwitch,
+ String setupActivity, boolean canRecord, boolean canPauseRecording, int tunerCount,
+ HdmiDeviceInfo hdmiDeviceInfo, boolean isConnectedToHdmiSwitch,
@HdmiAddressRelativePosition int hdmiConnectionRelativePosition, String parentId,
Bundle extras) {
mService = service;
@@ -279,6 +280,7 @@ public final class TvInputInfo implements Parcelable {
mIconDisconnected = iconDisconnected;
mSetupActivity = setupActivity;
mCanRecord = canRecord;
+ mCanPauseRecording = canPauseRecording;
mTunerCount = tunerCount;
mHdmiDeviceInfo = hdmiDeviceInfo;
mIsConnectedToHdmiSwitch = isConnectedToHdmiSwitch;
@@ -386,6 +388,14 @@ public final class TvInputInfo implements Parcelable {
}
/**
+ * Returns {@code true} if this TV input can pause recording TV programs,
+ * {@code false} otherwise.
+ */
+ public boolean canPauseRecording() {
+ return mCanPauseRecording;
+ }
+
+ /**
* Returns domain-specific extras associated with this TV input.
*/
public Bundle getExtras() {
@@ -571,6 +581,7 @@ public final class TvInputInfo implements Parcelable {
&& Objects.equals(mIconDisconnected, obj.mIconDisconnected)
&& TextUtils.equals(mSetupActivity, obj.mSetupActivity)
&& mCanRecord == obj.mCanRecord
+ && mCanPauseRecording == obj.mCanPauseRecording
&& mTunerCount == obj.mTunerCount
&& Objects.equals(mHdmiDeviceInfo, obj.mHdmiDeviceInfo)
&& mIsConnectedToHdmiSwitch == obj.mIsConnectedToHdmiSwitch
@@ -606,6 +617,7 @@ public final class TvInputInfo implements Parcelable {
dest.writeParcelable(mIconDisconnected, flags);
dest.writeString(mSetupActivity);
dest.writeByte(mCanRecord ? (byte) 1 : 0);
+ dest.writeByte(mCanPauseRecording ? (byte) 1 : 0);
dest.writeInt(mTunerCount);
dest.writeParcelable(mHdmiDeviceInfo, flags);
dest.writeByte(mIsConnectedToHdmiSwitch ? (byte) 1 : 0);
@@ -648,6 +660,7 @@ public final class TvInputInfo implements Parcelable {
mIconDisconnected = in.readParcelable(null);
mSetupActivity = in.readString();
mCanRecord = in.readByte() == 1;
+ mCanPauseRecording = in.readByte() == 1;
mTunerCount = in.readInt();
mHdmiDeviceInfo = in.readParcelable(null);
mIsConnectedToHdmiSwitch = in.readByte() == 1;
@@ -695,6 +708,7 @@ public final class TvInputInfo implements Parcelable {
private Icon mIconDisconnected;
private String mSetupActivity;
private Boolean mCanRecord;
+ private Boolean mCanPauseRecording;
private Integer mTunerCount;
private TvInputHardwareInfo mTvInputHardwareInfo;
private HdmiDeviceInfo mHdmiDeviceInfo;
@@ -879,6 +893,18 @@ public final class TvInputInfo implements Parcelable {
}
/**
+ * Sets whether this TV input can pause recording TV programs or not.
+ *
+ * @param canPauseRecording Whether this TV input can pause recording TV programs.
+ * @return This Builder object to allow for chaining of calls to builder methods.
+ */
+ @NonNull
+ public Builder setCanPauseRecording(boolean canPauseRecording) {
+ this.mCanPauseRecording = canPauseRecording;
+ return this;
+ }
+
+ /**
* Sets domain-specific extras associated with this TV input.
*
* @param extras Domain-specific extras associated with this TV input. Keys <em>must</em> be
@@ -927,7 +953,9 @@ public final class TvInputInfo implements Parcelable {
parseServiceMetadata(type);
return new TvInputInfo(mResolveInfo, id, type, isHardwareInput, mLabel, mLabelResId,
mIcon, mIconStandby, mIconDisconnected, mSetupActivity,
- mCanRecord == null ? false : mCanRecord, mTunerCount == null ? 0 : mTunerCount,
+ mCanRecord == null ? false : mCanRecord,
+ mCanPauseRecording == null ? false : mCanPauseRecording,
+ mTunerCount == null ? 0 : mTunerCount,
mHdmiDeviceInfo, isConnectedToHdmiSwitch, hdmiConnectionRelativePosition,
mParentId, mExtras);
}
@@ -997,6 +1025,12 @@ public final class TvInputInfo implements Parcelable {
mTunerCount = sa.getInt(
com.android.internal.R.styleable.TvInputService_tunerCount, 1);
}
+ if (mCanPauseRecording == null) {
+ mCanPauseRecording = sa.getBoolean(
+ com.android.internal.R.styleable.TvInputService_canPauseRecording,
+ false);
+ }
+
sa.recycle();
} catch (IOException | XmlPullParserException e) {
throw new IllegalStateException("Failed reading meta-data for " + si.packageName, e);
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index e9959be249ec..98b9ad8ec2b3 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -2523,6 +2523,40 @@ public final class TvInputManager {
}
/**
+ * Pauses TV program recording in the current recording session.
+ *
+ * @param params A set of extra parameters which might be handled with this event.
+ */
+ void pauseRecording(@NonNull Bundle params) {
+ if (mToken == null) {
+ Log.w(TAG, "The session has been already released");
+ return;
+ }
+ try {
+ mService.pauseRecording(mToken, params, mUserId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Resumes TV program recording in the current recording session.
+ *
+ * @param params A set of extra parameters which might be handled with this event.
+ */
+ void resumeRecording(@NonNull Bundle params) {
+ if (mToken == null) {
+ Log.w(TAG, "The session has been already released");
+ return;
+ }
+ try {
+ mService.resumeRecording(mToken, params, mUserId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Calls {@link TvInputService.Session#appPrivateCommand(String, Bundle)
* TvInputService.Session.appPrivateCommand()} on the current TvView.
*
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index 945fb3bff936..77fb2b236698 100755
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -1873,6 +1873,28 @@ public abstract class TvInputService extends Service {
/**
+ * Called when the application requests to pause TV program recording. Recording must pause
+ * immediately when this method is called.
+ *
+ * If the pause request cannot be fulfilled, the session must call
+ * {@link #notifyError(int)}.
+ *
+ * @param params Domain-specific data for recording request.
+ */
+ public void onPauseRecording(@NonNull Bundle params) { }
+
+ /**
+ * Called when the application requests to resume TV program recording. Recording must
+ * resume immediately when this method is called.
+ *
+ * If the resume request cannot be fulfilled, the session must call
+ * {@link #notifyError(int)}.
+ *
+ * @param params Domain-specific data for recording request.
+ */
+ public void onResumeRecording(@NonNull Bundle params) { }
+
+ /**
* Called when the application requests to release all the resources held by this recording
* session.
*/
@@ -1924,6 +1946,22 @@ public abstract class TvInputService extends Service {
}
/**
+ * Calls {@link #onPauseRecording(Bundle)}.
+ *
+ */
+ void pauseRecording(@NonNull Bundle params) {
+ onPauseRecording(params);
+ }
+
+ /**
+ * Calls {@link #onResumeRecording(Bundle)}.
+ *
+ */
+ void resumeRecording(@NonNull Bundle params) {
+ onResumeRecording(params);
+ }
+
+ /**
* Calls {@link #onAppPrivateCommand(String, Bundle)}.
*/
void appPrivateCommand(String action, Bundle data) {
diff --git a/media/java/android/media/tv/TvRecordingClient.java b/media/java/android/media/tv/TvRecordingClient.java
index 23fadac8a72b..180e2bd6845b 100644
--- a/media/java/android/media/tv/TvRecordingClient.java
+++ b/media/java/android/media/tv/TvRecordingClient.java
@@ -30,6 +30,7 @@ import android.util.Log;
import android.util.Pair;
import java.util.ArrayDeque;
+import java.util.Objects;
import java.util.Queue;
/**
@@ -49,6 +50,8 @@ public class TvRecordingClient {
private boolean mIsRecordingStarted;
private boolean mIsTuned;
+ private boolean mIsPaused;
+ private boolean mIsRecordingStopping;
private final Queue<Pair<String, Bundle>> mPendingAppPrivateCommands = new ArrayDeque<>();
/**
@@ -113,17 +116,22 @@ public class TvRecordingClient {
if (TextUtils.isEmpty(inputId)) {
throw new IllegalArgumentException("inputId cannot be null or an empty string");
}
- if (mIsRecordingStarted) {
+ if (mIsRecordingStarted && !mIsPaused) {
throw new IllegalStateException("tune failed - recording already started");
}
if (mSessionCallback != null && TextUtils.equals(mSessionCallback.mInputId, inputId)) {
if (mSession != null) {
+ mSessionCallback.mChannelUri = channelUri;
mSession.tune(channelUri, params);
} else {
mSessionCallback.mChannelUri = channelUri;
mSessionCallback.mConnectionParams = params;
}
+ mIsTuned = false;
} else {
+ if (mIsPaused) {
+ throw new IllegalStateException("tune failed - inputId is changed during pause");
+ }
resetInternal();
mSessionCallback = new MySessionCallback(inputId, channelUri, params);
if (mTvInputManager != null) {
@@ -148,6 +156,8 @@ public class TvRecordingClient {
mSession.release();
mIsTuned = false;
mIsRecordingStarted = false;
+ mIsPaused = false;
+ mIsRecordingStopping = false;
mSession = null;
}
}
@@ -169,7 +179,8 @@ public class TvRecordingClient {
*
* @param programUri The URI for the TV program to record, built by
* {@link TvContract#buildProgramUri(long)}. Can be {@code null}.
- * @throws IllegalStateException If {@link #tune} request hasn't been handled yet.
+ * @throws IllegalStateException If {@link #tune} request hasn't been handled yet or during
+ * pause.
*/
public void startRecording(@Nullable Uri programUri) {
startRecording(programUri, Bundle.EMPTY);
@@ -195,11 +206,16 @@ public class TvRecordingClient {
* @param params Domain-specific data for this request. Keys <em>must</em> be a scoped
* name, i.e. prefixed with a package name you own, so that different developers will
* not create conflicting keys.
- * @throws IllegalStateException If {@link #tune} request hasn't been handled yet.
+ * @throws IllegalStateException If {@link #tune} request hasn't been handled yet or during
+ * pause.
*/
public void startRecording(@Nullable Uri programUri, @NonNull Bundle params) {
- if (!mIsTuned) {
- throw new IllegalStateException("startRecording failed - not yet tuned");
+ if (mIsRecordingStopping || !mIsTuned || mIsPaused) {
+ throw new IllegalStateException("startRecording failed -"
+ + "recording not yet stopped or not yet tuned or paused");
+ }
+ if (mIsRecordingStarted) {
+ Log.w(TAG, "startRecording failed - recording already started");
}
if (mSession != null) {
mSession.startRecording(programUri, params);
@@ -225,6 +241,103 @@ public class TvRecordingClient {
}
if (mSession != null) {
mSession.stopRecording();
+ if (mIsRecordingStarted) {
+ mIsRecordingStopping = true;
+ }
+ }
+ }
+
+ /**
+ * Pause TV program recording in the current recording session. Recording is expected to pause
+ * immediately when this method is called. If recording has not yet started in the current
+ * recording session, this method does nothing.
+ *
+ * <p>In pause status, the application can tune during recording. To continue recording,
+ * please call {@link TvRecordingClient#resumeRecording()} to resume instead of
+ * {@link TvRecordingClient#startRecording(Uri)}. Application can stop
+ * the recording with {@link TvRecordingClient#stopRecording()} in recording pause status.
+ *
+ * <p>If the pause request cannot be fulfilled, the recording session will respond by calling
+ * {@link RecordingCallback#onError(int)}.
+ */
+ public void pauseRecording() {
+ pauseRecording(Bundle.EMPTY);
+ }
+
+ /**
+ * Pause TV program recording in the current recording session. Recording is expected to pause
+ * immediately when this method is called. If recording has not yet started in the current
+ * recording session, this method does nothing.
+ *
+ * <p>In pause status, the application can tune during recording. To continue recording,
+ * please call {@link TvRecordingClient#resumeRecording()} to resume instead of
+ * {@link TvRecordingClient#startRecording(Uri)}. Application can stop
+ * the recording with {@link TvRecordingClient#stopRecording()} in recording pause status.
+ *
+ * <p>If the pause request cannot be fulfilled, the recording session will respond by calling
+ * {@link RecordingCallback#onError(int)}.
+ *
+ * @param params Domain-specific data for this request.
+ */
+ public void pauseRecording(@NonNull Bundle params) {
+ if (!mIsRecordingStarted || mIsRecordingStopping) {
+ throw new IllegalStateException(
+ "pauseRecording failed - recording not yet started or stopping");
+ }
+ TvInputInfo info = mTvInputManager.getTvInputInfo(mSessionCallback.mInputId);
+ if (info == null || !info.canPauseRecording()) {
+ throw new UnsupportedOperationException(
+ "pauseRecording failed - operation not supported");
+ }
+ if (mIsPaused) {
+ Log.w(TAG, "pauseRecording failed - recording already paused");
+ }
+ if (mSession != null) {
+ mSession.pauseRecording(params);
+ mIsPaused = true;
+ }
+ }
+
+ /**
+ * Resume TV program recording only in recording pause status in the current recording session.
+ * Recording is expected to resume immediately when this method is called. If recording has not
+ * yet paused in the current recording session, this method does nothing.
+ *
+ * <p>When record is resumed, the recording is continue and can not re-tune. Application can
+ * stop the recording with {@link TvRecordingClient#stopRecording()} after record resumed.
+ *
+ * <p>If the pause request cannot be fulfilled, the recording session will respond by calling
+ * {@link RecordingCallback#onError(int)}.
+ */
+ public void resumeRecording() {
+ resumeRecording(Bundle.EMPTY);
+ }
+
+ /**
+ * Resume TV program recording only in recording pause status in the current recording session.
+ * Recording is expected to resume immediately when this method is called. If recording has not
+ * yet paused in the current recording session, this method does nothing.
+ *
+ * <p>When record is resumed, the recording is continues and can not re-tune. Application can
+ * stop the recording with {@link TvRecordingClient#stopRecording()} after record resumed.
+ *
+ * <p>If the resume request cannot be fulfilled, the recording session will respond by calling
+ * {@link RecordingCallback#onError(int)}.
+ *
+ * @param params Domain-specific data for this request.
+ */
+ public void resumeRecording(@NonNull Bundle params) {
+ if (!mIsRecordingStarted || mIsRecordingStopping || !mIsTuned) {
+ throw new IllegalStateException(
+ "resumeRecording failed - recording not yet started or stopping or "
+ + "not yet tuned");
+ }
+ if (!mIsPaused) {
+ Log.w(TAG, "resumeRecording failed - recording not yet paused");
+ }
+ if (mSession != null) {
+ mSession.resumeRecording(params);
+ mIsPaused = false;
}
}
@@ -367,6 +480,10 @@ public class TvRecordingClient {
Log.w(TAG, "onTuned - session not created");
return;
}
+ if (mIsTuned || !Objects.equals(mChannelUri, channelUri)) {
+ Log.w(TAG, "onTuned - already tuned or not yet tuned to last channel");
+ return;
+ }
mIsTuned = true;
mCallback.onTuned(channelUri);
}
@@ -382,6 +499,8 @@ public class TvRecordingClient {
}
mIsTuned = false;
mIsRecordingStarted = false;
+ mIsPaused = false;
+ mIsRecordingStopping = false;
mSessionCallback = null;
mSession = null;
if (mCallback != null) {
@@ -398,7 +517,13 @@ public class TvRecordingClient {
Log.w(TAG, "onRecordingStopped - session not created");
return;
}
+ if (!mIsRecordingStarted) {
+ Log.w(TAG, "onRecordingStopped - recording not yet started");
+ return;
+ }
mIsRecordingStarted = false;
+ mIsPaused = false;
+ mIsRecordingStopping = false;
mCallback.onRecordingStopped(recordedProgramUri);
}
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index 14761a6f92a8..d6d64f6f2c8e 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -21,18 +21,39 @@
#include "FrontendClient.h"
+using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
using ::aidl::android::media::tv::tuner::TunerFrontendSettings;
+
+using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
+using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
+using ::android::hardware::tv::tuner::V1_0::FrontendType;
using ::android::hardware::tv::tuner::V1_1::Constant;
+using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
+using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
+using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
namespace android {
/////////////// FrontendClient ///////////////////////
-FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id) {
+FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id, int type) {
mTunerFrontend = tunerFrontend;
mAidlCallback = NULL;
mHidlCallback = NULL;
mId = id;
+ mType = type;
}
FrontendClient::~FrontendClient() {
@@ -42,11 +63,13 @@ FrontendClient::~FrontendClient() {
mAidlCallback = NULL;
mHidlCallback = NULL;
mId = -1;
+ mType = -1;
}
Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
if (mTunerFrontend != NULL) {
mAidlCallback = ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
+ mAidlCallback->setFrontendType(mType);
mTunerFrontend->setCallback(mAidlCallback);
return Result::SUCCESS;
}
@@ -298,56 +321,21 @@ Status TunerFrontendCallback::onEvent(int frontendEventType) {
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
}
-Status TunerFrontendCallback::onLocked() {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onScanStopped() {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onProgress(int /*percent*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onFrequenciesReport(const vector<int>& /*frequency*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onSymbolRates(const vector<int>& /*rates*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onHierarchy(int /*hierarchy*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onSignalType(int /*signalType*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onPlpIds(const vector<int>& /*plpIds*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onGroupIds(const vector<int>& /*groupIds*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onInputStreamIds(const vector<int>& /*inputStreamIds*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onDvbsStandard(int /*dvbsStandandard*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onAnalogSifStandard(int /*sifStandandard*/) {
- return Status::ok();
-}
-
-Status TunerFrontendCallback::onAtsc3PlpInfos(const vector<TunerAtsc3PlpInfo>& /*atsc3PlpInfos*/) {
- return Status::ok();
+Status TunerFrontendCallback::onScanMessage(int messageType,
+ const TunerFrontendScanMessage& message) {
+ if (mFrontendClientCallback != NULL) {
+ if (!is1_1ExtendedScanMessage(messageType)) {
+ mFrontendClientCallback->onScanMessage(
+ static_cast<FrontendScanMessageType>(messageType),
+ getHalScanMessage(messageType, message));
+ } else {
+ mFrontendClientCallback->onScanMessageExt1_1(
+ static_cast<FrontendScanMessageTypeExt1_1>(messageType),
+ getHalScanMessageExt1_1(messageType, message));
+ }
+ return Status::ok();
+ }
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
}
/////////////// IFrontendCallback ///////////////////////
@@ -377,4 +365,167 @@ Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeEx
}
return Void();
}
+
+/////////////// FrontendClientCallback Helper Methods ///////////////////////
+
+FrontendScanMessage TunerFrontendCallback::getHalScanMessage(
+ int messageType, const TunerFrontendScanMessage& message) {
+ FrontendScanMessage scanMessage;
+ switch (messageType) {
+ case (int) FrontendScanMessageType::LOCKED:
+ scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>());
+ break;
+ case (int) FrontendScanMessageType::END:
+ scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>());
+ break;
+ case (int) FrontendScanMessageType::PROGRESS_PERCENT:
+ scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>());
+ break;
+ case (int) FrontendScanMessageType::FREQUENCY: {
+ vector<int> f = message.get<TunerFrontendScanMessage::frequencies>();
+ hidl_vec<uint32_t> frequencies(begin(f), end(f));
+ scanMessage.frequencies(frequencies);
+ break;
+ }
+ case (int) FrontendScanMessageType::SYMBOL_RATE: {
+ vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>();
+ hidl_vec<uint32_t> symbolRates(begin(s), end(s));
+ scanMessage.symbolRates(symbolRates);
+ break;
+ }
+ case (int) FrontendScanMessageType::HIERARCHY:
+ scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>(
+ message.get<TunerFrontendScanMessage::hierarchy>()));
+ break;
+ case (int) FrontendScanMessageType::ANALOG_TYPE:
+ scanMessage.analogType(static_cast<FrontendAnalogType>(
+ message.get<TunerFrontendScanMessage::analogType>()));
+ break;
+ case (int) FrontendScanMessageType::PLP_IDS: {
+ vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>();
+ hidl_vec<uint8_t> plpIds(begin(p), end(p));
+ scanMessage.plpIds(plpIds);
+ break;
+ }
+ case (int) FrontendScanMessageType::GROUP_IDS: {
+ vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>();
+ hidl_vec<uint8_t> groupIds(begin(g), end(g));
+ scanMessage.groupIds(groupIds);
+ break;
+ }
+ case (int) FrontendScanMessageType::INPUT_STREAM_IDS: {
+ vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>();
+ hidl_vec<uint16_t> inputStreamIds(begin(i), end(i));
+ scanMessage.inputStreamIds(inputStreamIds);
+ break;
+ }
+ case (int) FrontendScanMessageType::STANDARD: {
+ FrontendScanMessage::Standard std;
+ int standard = message.get<TunerFrontendScanMessage::std>();
+ switch (mType) {
+ case (int) FrontendType::DVBS:
+ std.sStd(static_cast<FrontendDvbsStandard>(standard));
+ scanMessage.std(std);
+ break;
+ case (int) FrontendType::DVBT:
+ std.tStd(static_cast<FrontendDvbtStandard>(standard));
+ scanMessage.std(std);
+ break;
+ case (int) FrontendType::ANALOG:
+ std.sifStd(static_cast<FrontendAnalogSifStandard>(standard));
+ scanMessage.std(std);
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case (int) FrontendScanMessageType::ATSC3_PLP_INFO: {
+ vector<TunerFrontendScanAtsc3PlpInfo> plp =
+ message.get<TunerFrontendScanMessage::atsc3PlpInfos>();
+ hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo;
+ for (TunerFrontendScanAtsc3PlpInfo info : plp) {
+ FrontendScanAtsc3PlpInfo p{
+ .plpId = static_cast<uint8_t>(info.plpId),
+ .bLlsFlag = info.llsFlag,
+ };
+ int size = plpInfo.size();
+ plpInfo.resize(size + 1);
+ plpInfo[size] = p;
+ }
+ scanMessage.atsc3PlpInfos(plpInfo);
+ break;
+ }
+ default:
+ break;
+ }
+ return scanMessage;
+}
+
+FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1(
+ int messageType, const TunerFrontendScanMessage& message) {
+ FrontendScanMessageExt1_1 scanMessage;
+ switch (messageType) {
+ case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY:
+ scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>());
+ break;
+ case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX:
+ scanMessage.annex(static_cast<FrontendDvbcAnnex>(
+ message.get<TunerFrontendScanMessage::annex>()));
+ break;
+ case (int) FrontendScanMessageTypeExt1_1::MODULATION: {
+ FrontendModulation m;
+ int modulation = message.get<TunerFrontendScanMessage::modulation>();
+ switch (mType) {
+ case (int) FrontendType::DVBC:
+ m.dvbc(static_cast<FrontendDvbcModulation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ case (int) FrontendType::DVBS:
+ m.dvbs(static_cast<FrontendDvbsModulation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ case (int) FrontendType::DVBT:
+ m.dvbt(static_cast<FrontendDvbtConstellation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ case (int) FrontendType::ISDBS:
+ m.isdbs(static_cast<FrontendIsdbsModulation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ case (int) FrontendType::ISDBS3:
+ m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ case (int) FrontendType::ISDBT:
+ m.isdbt(static_cast<FrontendIsdbtModulation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ case (int) FrontendType::ATSC:
+ m.atsc(static_cast<FrontendAtscModulation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ case (int) FrontendType::ATSC3:
+ m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB:
+ m.dtmb(static_cast<FrontendDtmbModulation>(modulation));
+ scanMessage.modulation(m);
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ return scanMessage;
+}
+
+bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) {
+ return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION
+ && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY;
+}
} // namespace android
diff --git a/media/jni/tuner/FrontendClient.h b/media/jni/tuner/FrontendClient.h
index 32356744c839..4f95c22bd3c7 100644
--- a/media/jni/tuner/FrontendClient.h
+++ b/media/jni/tuner/FrontendClient.h
@@ -30,7 +30,7 @@ using Status = ::ndk::ScopedAStatus;
using ::aidl::android::media::tv::tuner::BnTunerFrontendCallback;
using ::aidl::android::media::tv::tuner::ITunerFrontend;
-using ::aidl::android::media::tv::tuner::TunerAtsc3PlpInfo;
+using ::aidl::android::media::tv::tuner::TunerFrontendScanMessage;
using ::android::hardware::Return;
using ::android::hardware::Void;
@@ -63,34 +63,18 @@ public:
Status onEvent(int frontendEventType);
- Status onLocked();
+ Status onScanMessage(int messageType, const TunerFrontendScanMessage& message);
- Status onScanStopped();
-
- Status onProgress(int percent);
-
- Status onFrequenciesReport(const vector<int>& frequency);
-
- Status onSymbolRates(const vector<int>& rates);
-
- Status onHierarchy(int hierarchy);
-
- Status onSignalType(int signalType);
-
- Status onPlpIds(const vector<int>& plpIds);
-
- Status onGroupIds(const vector<int>& groupIds);
-
- Status onInputStreamIds(const vector<int>& inputStreamIds);
-
- Status onDvbsStandard(int dvbsStandandard);
-
- Status onAnalogSifStandard(int sifStandandard);
-
- Status onAtsc3PlpInfos(const vector<TunerAtsc3PlpInfo>& atsc3PlpInfos);
+ void setFrontendType(int frontendType) { mType = frontendType; }
private:
+ FrontendScanMessage getHalScanMessage(int messageType, const TunerFrontendScanMessage& message);
+ FrontendScanMessageExt1_1 getHalScanMessageExt1_1(int messageType,
+ const TunerFrontendScanMessage& message);
+ bool is1_1ExtendedScanMessage(int messageType);
+
sp<FrontendClientCallback> mFrontendClientCallback;
+ int mType;
};
struct HidlFrontendCallback : public IFrontendCallback {
@@ -111,7 +95,7 @@ private:
struct FrontendClient : public RefBase {
public:
- FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id);
+ FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id, int type);
~FrontendClient();
/**
@@ -210,6 +194,7 @@ private:
sp<HidlFrontendCallback> mHidlCallback;
int mId;
+ int mType;
};
} // namespace android
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index 39e6ba27e56f..a26753dd65a6 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -98,14 +98,28 @@ sp<FrontendClient> TunerClient::openFrontend(int frontendHandle) {
// TODO: handle error code
shared_ptr<ITunerFrontend> tunerFrontend;
mTunerService->openFrontend(frontendHandle, &tunerFrontend);
- return new FrontendClient(tunerFrontend, frontendHandle);
+ if (tunerFrontend == NULL) {
+ return NULL;
+ }
+ int id;
+ // TODO: handle error code
+ tunerFrontend->getFrontendId(&id);
+ TunerServiceFrontendInfo aidlFrontendInfo;
+ // TODO: handle error code
+ mTunerService->getFrontendInfo(id, &aidlFrontendInfo);
+ return new FrontendClient(tunerFrontend, frontendHandle, aidlFrontendInfo.type);
}
if (mTuner != NULL) {
int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
sp<IFrontend> hidlFrontend = openHidlFrontendById(id);
if (hidlFrontend != NULL) {
- sp<FrontendClient> frontendClient = new FrontendClient(NULL, id);
+ FrontendInfo hidlInfo;
+ Result res = getHidlFrontendInfo(id, hidlInfo);
+ if (res != Result::SUCCESS) {
+ return NULL;
+ }
+ sp<FrontendClient> frontendClient = new FrontendClient(NULL, id, (int)hidlInfo.type);
frontendClient->setHidlFrontend(hidlFrontend);
return frontendClient;
}
diff --git a/native/graphics/jni/corpus/webp-color-profile-lossless.webp b/native/graphics/jni/corpus/webp-color-profile-lossless.webp
new file mode 100644
index 000000000000..4fd63d5794ff
--- /dev/null
+++ b/native/graphics/jni/corpus/webp-color-profile-lossless.webp
Binary files differ
diff --git a/native/graphics/jni/fuzz_imagedecoder.cpp b/native/graphics/jni/fuzz_imagedecoder.cpp
index f2cd1a8f4eb9..015aca70e4e0 100644
--- a/native/graphics/jni/fuzz_imagedecoder.cpp
+++ b/native/graphics/jni/fuzz_imagedecoder.cpp
@@ -73,6 +73,12 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
return 0;
}
- AImageDecoder_decodeImage(decoder.get(), pixels.get(), stride, pixelSize);
+ while (true) {
+ int result = AImageDecoder_decodeImage(decoder.get(), pixels.get(), stride, pixelSize);
+ if (result != ANDROID_IMAGE_DECODER_SUCCESS) break;
+
+ result = AImageDecoder_advanceFrame(decoder.get());
+ if (result != ANDROID_IMAGE_DECODER_SUCCESS) break;
+ }
return 0;
}
diff --git a/packages/CompanionDeviceManager/res/values-af/strings.xml b/packages/CompanionDeviceManager/res/values-af/strings.xml
index 8fc353191441..d366a0be94a5 100644
--- a/packages/CompanionDeviceManager/res/values-af/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-af/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Metgeseltoestel-bestuurder"</string>
<string name="chooser_title" msgid="2262294130493605839">"Kies \'n <xliff:g id="PROFILE_NAME">%1$s</xliff:g> om deur &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; bestuur te word"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"toestel"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Stel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; om jou <xliff:g id="PROFILE_NAME">%2$s</xliff:g> te bestuur – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Jy het <xliff:g id="APP_NAME_0">%1$s</xliff:g> nodig om jou <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> te bestuur. <xliff:g id="APP_NAME2">%3$s</xliff:g> sal toegang hê tot <xliff:g id="PERMISSIONS">%4$s</xliff:g> terwyl die <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> gekoppel is."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ja"</string>
<string name="consent_no" msgid="1335543792857823917">"Nee, dankie"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-am/strings.xml b/packages/CompanionDeviceManager/res/values-am/strings.xml
index ff31454cba08..68e816adf726 100644
--- a/packages/CompanionDeviceManager/res/values-am/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-am/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"አጃቢ የመሣሪያ አስተዳዳሪ"</string>
<string name="chooser_title" msgid="2262294130493605839">"በ&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; የሚተዳደር <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ይምረጡ"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"መሣሪያ"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; የእርስዎን <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; እንዲያስተዳድር ያቀናብሩት"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> የእርስዎን <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> ለማስተዳደር ያስፈልጋል። <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> ተገናኝቶ ሳለ <xliff:g id="APP_NAME2">%3$s</xliff:g> የ<xliff:g id="PERMISSIONS">%4$s</xliff:g> መዳረሻን ያገኛል።"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"አዎ"</string>
<string name="consent_no" msgid="1335543792857823917">"አይ፣ አመሰግናለሁ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml
index aedf0f3f94b2..184837f692e8 100644
--- a/packages/CompanionDeviceManager/res/values-ar/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"تطبيق \"مدير الجهاز المصاحب\""</string>
<string name="chooser_title" msgid="2262294130493605839">"‏اختَر <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ليديره تطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"جهاز"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"‏اضبط &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; لإدارة <xliff:g id="PROFILE_NAME">%2$s</xliff:g> على &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"يجب توفّر تطبيق <xliff:g id="APP_NAME_0">%1$s</xliff:g> لإدارة <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. سيتمكن تطبيق <xliff:g id="APP_NAME2">%3$s</xliff:g> من الوصول إلى <xliff:g id="PERMISSIONS">%4$s</xliff:g> عندما يكون <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> مرتبطًا."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"نعم"</string>
<string name="consent_no" msgid="1335543792857823917">"لا، شكرًا"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-as/strings.xml b/packages/CompanionDeviceManager/res/values-as/strings.xml
index f0c3ee890a41..116d63b3d8d5 100644
--- a/packages/CompanionDeviceManager/res/values-as/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-as/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"কম্পেনিয়ন ডিভাইচ মেনেজাৰ"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;এ পৰিচালনা কৰিব লগা এটা <xliff:g id="PROFILE_NAME">%1$s</xliff:g> বাছনি কৰক"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইচ"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"আপোনাৰ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> পৰিচালনা কৰিবলৈ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ছেট কৰক - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"আপোনাৰ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> পৰিচালনা কৰিবলৈ <xliff:g id="APP_NAME_0">%1$s</xliff:g>ৰ আৱশ্যক। <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>ৰ সৈতে সংযোগ কৰিলে <xliff:g id="APP_NAME2">%3$s</xliff:g>এ <xliff:g id="PERMISSIONS">%4$s</xliff:g>লৈ এক্সেছ পাব।"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"হয়"</string>
<string name="consent_no" msgid="1335543792857823917">"নালাগে, ধন্যবাদ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-az/strings.xml b/packages/CompanionDeviceManager/res/values-az/strings.xml
index 64bea4da663b..bc719a340074 100644
--- a/packages/CompanionDeviceManager/res/values-az/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-az/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Kompanyon Cihaz Meneceri"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; tərəfindən idarə ediləcək <xliff:g id="PROFILE_NAME">%1$s</xliff:g> seçin"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"<xliff:g id="PROFILE_NAME">%2$s</xliff:g> profilinizin &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tərəfindən idarə olunmasını ayarlayın - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> profilinizi idarə etmək üçün <xliff:g id="APP_NAME_0">%1$s</xliff:g> tələb olunur. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> qoşulu olduqda <xliff:g id="APP_NAME2">%3$s</xliff:g> <xliff:g id="PERMISSIONS">%4$s</xliff:g> bölməsinə giriş əldə edəcək."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Bəli"</string>
<string name="consent_no" msgid="1335543792857823917">"Xeyr, çox sağolun"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
index 3f067227fa47..a0e52989c964 100644
--- a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Menadžer pridruženog uređaja"</string>
<string name="chooser_title" msgid="2262294130493605839">"Odaberite profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kojim će upravljati aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Podesite aplikaciju &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da upravlja profilom <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> je neophodna za upravljanje profilom <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> će dobiti pristup dozvolama za <xliff:g id="PERMISSIONS">%4$s</xliff:g> dok je <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> povezan."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Da"</string>
<string name="consent_no" msgid="1335543792857823917">"Ne, hvala"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml
index 25e235c98106..96a513dff683 100644
--- a/packages/CompanionDeviceManager/res/values-be/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-be/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Менеджар спадарожнай прылады"</string>
<string name="chooser_title" msgid="2262294130493605839">"Выберыце прыладу (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), якой будзе кіраваць праграма &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"прылада"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Дазвольце праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; кіраваць прыладай \"<xliff:g id="PROFILE_NAME">%2$s</xliff:g>\" – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Для кіравання прыладай \"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>\" патрабуецца праграма \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\". Калі прылада \"<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>\" будзе падключана, <xliff:g id="APP_NAME2">%3$s</xliff:g> атрымае наступныя дазволы: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Так"</string>
<string name="consent_no" msgid="1335543792857823917">"Не, дзякуй"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-bg/strings.xml b/packages/CompanionDeviceManager/res/values-bg/strings.xml
index 264ce27b76d6..3775dbe87b38 100644
--- a/packages/CompanionDeviceManager/res/values-bg/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bg/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Изберете устройство (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), което да се управлява от &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Задайте &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да управлява устройството ви (<xliff:g id="PROFILE_NAME">%2$s</xliff:g>) – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"За управление на <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> се изисква <xliff:g id="APP_NAME_0">%1$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> ще получи достъп до <xliff:g id="PERMISSIONS">%4$s</xliff:g>, докато устройството (<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>) е свързано."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Да"</string>
<string name="consent_no" msgid="1335543792857823917">"Не, благодаря"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-bn/strings.xml b/packages/CompanionDeviceManager/res/values-bn/strings.xml
index 65f92c908b86..1e8fd0be40c3 100644
--- a/packages/CompanionDeviceManager/res/values-bn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bn/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> বেছে নিন যেটি &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ম্যানেজ করবে"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইস"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"আপনার <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ম্যানেজ করার জন্য &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; সেট করুন"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>-কে আপনার <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>.ম্যানেজ করতে দিতে হবে। <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> কানেক্ট করা হলে <xliff:g id="APP_NAME2">%3$s</xliff:g> <xliff:g id="PERMISSIONS">%4$s</xliff:g> অ্যাক্সেস করতে পারবে।"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"হ্যাঁ"</string>
<string name="consent_no" msgid="1335543792857823917">"না থাক"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-bs/strings.xml b/packages/CompanionDeviceManager/res/values-bs/strings.xml
index f8e24b7a1cf4..133aea35753e 100644
--- a/packages/CompanionDeviceManager/res/values-bs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bs/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Prateći upravitelj uređaja"</string>
<string name="chooser_title" msgid="2262294130493605839">"Odaberite uređaj <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kojim će upravljati aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Postavite aplikaciju &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da upravlja vašim uređajem <xliff:g id="PROFILE_NAME">%2$s</xliff:g> — &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Potrebna je aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> za upravljanje uređajem <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. Aplikacija <xliff:g id="APP_NAME2">%3$s</xliff:g> će dobiti pristup uslugama <xliff:g id="PERMISSIONS">%4$s</xliff:g> dok je uređaj <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> povezan."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Da"</string>
<string name="consent_no" msgid="1335543792857823917">"Ne, hvala"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ca/strings.xml b/packages/CompanionDeviceManager/res/values-ca/strings.xml
index ae8ca9f7efab..cf26b08c949b 100644
--- a/packages/CompanionDeviceManager/res/values-ca/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ca/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Gestor de dispositius complementaris"</string>
<string name="chooser_title" msgid="2262294130493605839">"Tria un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> perquè el gestioni &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositiu"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Defineix que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gestioni el teu <xliff:g id="PROFILE_NAME">%2$s</xliff:g> (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;)"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Cal <xliff:g id="APP_NAME_0">%1$s</xliff:g> per gestionar el teu <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> tindrà accés als permisos <xliff:g id="PERMISSIONS">%4$s</xliff:g> mentre el <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> estigui connectat."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Sí"</string>
<string name="consent_no" msgid="1335543792857823917">"No, gràcies"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-cs/strings.xml b/packages/CompanionDeviceManager/res/values-cs/strings.xml
index 675bd2945382..389ccd0ccc95 100644
--- a/packages/CompanionDeviceManager/res/values-cs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-cs/strings.xml
@@ -19,8 +19,9 @@
<string name="app_label" msgid="4470785958457506021">"Správce doprovodných zařízení"</string>
<string name="chooser_title" msgid="2262294130493605839">"Vyberte zařízení <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, které chcete spravovat pomocí aplikace &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"zařízení"</string>
+ <string name="profile_name_watch" msgid="576290739483672360">"hodinky"</string>
<string name="confirmation_title" msgid="4751119145078041732">"Nastavit aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ke správě tohoto zařízení: <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Ke správě zařízení <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> je potřeba aplikace <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Dokud bude zařízení <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> připojeno, bude mít aplikace <xliff:g id="APP_NAME2">%3$s</xliff:g> přístup k těmto oprávněním: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <string name="profile_summary" msgid="2009764182871566255">"Ke správě profilu <xliff:g id="PROFILE_NAME">%2$s</xliff:g> je potřeba aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%3$s</xliff:g>"</string>
<string name="consent_yes" msgid="4055438216605487056">"Ano"</string>
<string name="consent_no" msgid="1335543792857823917">"Ne, díky"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-da/strings.xml b/packages/CompanionDeviceManager/res/values-da/strings.xml
index a6720fca2df7..30a331a9e699 100644
--- a/packages/CompanionDeviceManager/res/values-da/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-da/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Medfølgende enhedshåndtering"</string>
<string name="chooser_title" msgid="2262294130493605839">"Vælg den enhed (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), som skal administreres af &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"enhed"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Angiv &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; til administration af: <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> er nødvendig for at administrere: <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> får adgang til <xliff:g id="PERMISSIONS">%4$s</xliff:g>, mens <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> er forbundet."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ja"</string>
<string name="consent_no" msgid="1335543792857823917">"Nej tak"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml
index eb2631f2f425..ead68e3ba18e 100644
--- a/packages/CompanionDeviceManager/res/values-de/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-de/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Begleitgerät-Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Gerät (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) auswählen, das von &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; verwaltet werden soll"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"Gerät"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; zum Verwalten deines Geräts (<xliff:g id="PROFILE_NAME">%2$s</xliff:g>) festlegen – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ist erforderlich, um dein Gerät (<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>) zu verwalten. <xliff:g id="APP_NAME2">%3$s</xliff:g> erhält Zugriff auf <xliff:g id="PERMISSIONS">%4$s</xliff:g>, während eine Verbindung mit <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> besteht."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ja"</string>
<string name="consent_no" msgid="1335543792857823917">"Nein danke"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-el/strings.xml b/packages/CompanionDeviceManager/res/values-el/strings.xml
index cb31866cc36f..4867a8ed98e6 100644
--- a/packages/CompanionDeviceManager/res/values-el/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-el/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Διαχείριση συνοδευτικής εφαρμογής"</string>
<string name="chooser_title" msgid="2262294130493605839">"Επιλέξτε ένα προφίλ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> για διαχείριση από την εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"συσκευή"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Ορίστε μια εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; για διαχείριση του προφίλ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Η εφαρμογή <xliff:g id="APP_NAME_0">%1$s</xliff:g> απαιτείται για τη διαχείριση του προφίλ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. Η εφαρμογή <xliff:g id="APP_NAME2">%3$s</xliff:g> θα έχει πρόσβαση στις άδειες <xliff:g id="PERMISSIONS">%4$s</xliff:g> ενώ είναι συνδεδεμένο το προφίλ <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ναι"</string>
<string name="consent_no" msgid="1335543792857823917">"Όχι, ευχαριστώ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
index a30c199fa2d1..a0e50917fdc1 100644
--- a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Set &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage your <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> is needed to manage your <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> will get access to <xliff:g id="PERMISSIONS">%4$s</xliff:g> while the <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> is connected."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Yes"</string>
<string name="consent_no" msgid="1335543792857823917">"No, thanks"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
index a30c199fa2d1..a0e50917fdc1 100644
--- a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Set &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage your <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> is needed to manage your <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> will get access to <xliff:g id="PERMISSIONS">%4$s</xliff:g> while the <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> is connected."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Yes"</string>
<string name="consent_no" msgid="1335543792857823917">"No, thanks"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
index a30c199fa2d1..a0e50917fdc1 100644
--- a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Set &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage your <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> is needed to manage your <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> will get access to <xliff:g id="PERMISSIONS">%4$s</xliff:g> while the <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> is connected."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Yes"</string>
<string name="consent_no" msgid="1335543792857823917">"No, thanks"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
index a30c199fa2d1..a0e50917fdc1 100644
--- a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Set &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage your <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> is needed to manage your <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> will get access to <xliff:g id="PERMISSIONS">%4$s</xliff:g> while the <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> is connected."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Yes"</string>
<string name="consent_no" msgid="1335543792857823917">"No, thanks"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
index ea39d0a6c01a..f3c4b1dcb434 100644
--- a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
@@ -19,8 +19,9 @@
<string name="app_label" msgid="4470785958457506021">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎Companion Device Manager‎‏‎‎‏‎"</string>
<string name="chooser_title" msgid="2262294130493605839">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎Choose a ‎‏‎‎‏‏‎<xliff:g id="PROFILE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to be managed by &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;‎‏‎‎‏‎"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎device‎‏‎‎‏‎"</string>
+ <string name="profile_name_watch" msgid="576290739483672360">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎watch‎‏‎‎‏‎"</string>
<string name="confirmation_title" msgid="4751119145078041732">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎Set &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to manage your ‎‏‎‎‏‏‎<xliff:g id="PROFILE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ - &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%3$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;‎‏‎‎‏‎"</string>
- <string name="profile_summary" msgid="3167701603666642104">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is needed to manage your ‎‏‎‎‏‏‎<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎. ‎‏‎‎‏‏‎<xliff:g id="APP_NAME2">%3$s</xliff:g>‎‏‎‎‏‏‏‎ will get access to ‎‏‎‎‏‏‎<xliff:g id="PERMISSIONS">%4$s</xliff:g>‎‏‎‎‏‏‏‎ while the ‎‏‎‎‏‏‎<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>‎‏‎‎‏‏‏‎ is connected.‎‏‎‎‏‎"</string>
+ <string name="profile_summary" msgid="2009764182871566255">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is needed to manage your ‎‏‎‎‏‏‎<xliff:g id="PROFILE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎. ‎‏‎‎‏‏‎<xliff:g id="PRIVILEGES_DISCPLAIMER">%3$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="consent_yes" msgid="4055438216605487056">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎Yes‎‏‎‎‏‎"</string>
<string name="consent_no" msgid="1335543792857823917">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎No thanks‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
index 63097dc786ff..5780fb407524 100644
--- a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Administrador de dispositivo complementario"</string>
<string name="chooser_title" msgid="2262294130493605839">"Elige un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para que &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; lo administre"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Configura &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; para administrar <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Se requiere <xliff:g id="APP_NAME_0">%1$s</xliff:g> para administrar tu <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> accederá a <xliff:g id="PERMISSIONS">%4$s</xliff:g> mientras tu <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> esté conectado."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Sí"</string>
<string name="consent_no" msgid="1335543792857823917">"No, gracias"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml
index 784c30d48e36..78cfa5a74a67 100644
--- a/packages/CompanionDeviceManager/res/values-es/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Gestor de dispositivos complementario"</string>
<string name="chooser_title" msgid="2262294130493605839">"Elige un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para gestionarlo con &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Haz que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gestione tu <xliff:g id="PROFILE_NAME">%2$s</xliff:g> &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Se necesita <xliff:g id="APP_NAME_0">%1$s</xliff:g> para gestionar tu <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. Mientras tu <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> esté conectado, <xliff:g id="APP_NAME2">%3$s</xliff:g> tendrá acceso a lo siguiente: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Sí"</string>
<string name="consent_no" msgid="1335543792857823917">"No, gracias"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-et/strings.xml b/packages/CompanionDeviceManager/res/values-et/strings.xml
index b5058701cc8a..3f29da0caaa0 100644
--- a/packages/CompanionDeviceManager/res/values-et/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-et/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Kaasseadme haldur"</string>
<string name="chooser_title" msgid="2262294130493605839">"Valige seade <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, mida haldab rakendus &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"seade"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Määrake rakendus &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; haldama teie seadet <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> on vajalik teie seadme <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> haldamiseks. <xliff:g id="APP_NAME2">%3$s</xliff:g> saab juurdepääsuload (<xliff:g id="PERMISSIONS">%4$s</xliff:g>), kui seade <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> on ühendatud."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Jah"</string>
<string name="consent_no" msgid="1335543792857823917">"Tänan, ei"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml
index 826556da33de..30907a2fabf7 100644
--- a/packages/CompanionDeviceManager/res/values-eu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Gailu osagarriaren kudeatzailea"</string>
<string name="chooser_title" msgid="2262294130493605839">"Aukeratu &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; aplikazioak kudeatu beharreko <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"gailua"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Konfiguratu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; <xliff:g id="PROFILE_NAME">%2$s</xliff:g> (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;) kudea dezan"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> erabili behar duzu <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> kudeatzeko. <xliff:g id="APP_NAME2">%3$s</xliff:g> aplikazioak <xliff:g id="PERMISSIONS">%4$s</xliff:g> atzitu ahalko ditu <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> konektatuta dagoen bitartean."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Bai"</string>
<string name="consent_no" msgid="1335543792857823917">"Ez"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml
index 66eafc3f320f..9e1ecb195f61 100644
--- a/packages/CompanionDeviceManager/res/values-fa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"مدیر دستگاه مرتبط"</string>
<string name="chooser_title" msgid="2262294130493605839">"‏انتخاب <xliff:g id="PROFILE_NAME">%1$s</xliff:g> برای مدیریت کردن با &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>‏&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"دستگاه"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"‏تنظیم &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; برای مدیریت کردن <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>‏&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"برای مدیریت کردن <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> به <xliff:g id="APP_NAME_0">%1$s</xliff:g> نیاز دارید. وقتی <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> متصل باشد، <xliff:g id="APP_NAME2">%3$s</xliff:g> به <xliff:g id="PERMISSIONS">%4$s</xliff:g> دسترسی پیدا خواهد کرد."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"بله"</string>
<string name="consent_no" msgid="1335543792857823917">"نه متشکرم"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-fi/strings.xml b/packages/CompanionDeviceManager/res/values-fi/strings.xml
index d4a20d9421f1..4a1f13fd9346 100644
--- a/packages/CompanionDeviceManager/res/values-fi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fi/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Valitse <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, jota &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; hallinnoi"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"laite"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Aseta &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; profiilin (<xliff:g id="PROFILE_NAME">%2$s</xliff:g>) hallinnoijaksi – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> tarvitaan profiilin (<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>) hallinnointiin. <xliff:g id="APP_NAME2">%3$s</xliff:g> saa käyttöluvat (<xliff:g id="PERMISSIONS">%4$s</xliff:g>), kun <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> on yhdistetty."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Kyllä"</string>
<string name="consent_no" msgid="1335543792857823917">"Ei kiitos"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
index e91ccf4de04f..ce5e262d867a 100644
--- a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Gestionnaire d\'appareil compagnon"</string>
<string name="chooser_title" msgid="2262294130493605839">"Choisissez un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qui sera géré par &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Utiliser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pour gérer votre <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"L\'application <xliff:g id="APP_NAME_0">%1$s</xliff:g> est requise pour gérer votre <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> aura accès à <xliff:g id="PERMISSIONS">%4$s</xliff:g> lorsque <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> est connecté."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Oui"</string>
<string name="consent_no" msgid="1335543792857823917">"Non merci"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-fr/strings.xml b/packages/CompanionDeviceManager/res/values-fr/strings.xml
index 756727a7f3f9..e15639b032ec 100644
--- a/packages/CompanionDeviceManager/res/values-fr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Gestionnaire d\'appareils associés"</string>
<string name="chooser_title" msgid="2262294130493605839">"Sélectionner le/la <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qui sera géré(e) par &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Définir &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pour la gestion de votre <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> est requis pour gérer votre <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> aura accès aux <xliff:g id="PERMISSIONS">%4$s</xliff:g> lorsque le/la <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> sera connecté(e)."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Oui"</string>
<string name="consent_no" msgid="1335543792857823917">"Non, merci"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-gl/strings.xml b/packages/CompanionDeviceManager/res/values-gl/strings.xml
index 7849e42a5bf1..1205e46933ac 100644
--- a/packages/CompanionDeviceManager/res/values-gl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gl/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Xestor de dispositivos complementarios"</string>
<string name="chooser_title" msgid="2262294130493605839">"Escolle un perfil (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) para que o xestione a aplicación &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Define a aplicación &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; para a xestión do teu perfil (<xliff:g id="PROFILE_NAME">%2$s</xliff:g>): &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Necesítase a aplicación <xliff:g id="APP_NAME_0">%1$s</xliff:g> para xestionar o teu perfil (<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>). <xliff:g id="APP_NAME2">%3$s</xliff:g> terá acceso a varios permisos (<xliff:g id="PERMISSIONS">%4$s</xliff:g>) mentres o perfil (<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>) estea conectado."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Si"</string>
<string name="consent_no" msgid="1335543792857823917">"Non, grazas"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-gu/strings.xml b/packages/CompanionDeviceManager/res/values-gu/strings.xml
index 1f1edd14b967..e99a3cdef2e3 100644
--- a/packages/CompanionDeviceManager/res/values-gu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gu/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"કમ્પેનિયન ડિવાઇસ મેનેજર"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; દ્વારા મેનેજ કરવા માટે કોઈ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> પસંદ કરો"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ડિવાઇસ"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"તમારા <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;ને મેનેજ કરવા માટે &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; સેટ કરો"</string>
- <string name="profile_summary" msgid="3167701603666642104">"તમારા <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>ને મેનેજ કરવા માટે <xliff:g id="APP_NAME_0">%1$s</xliff:g> જરૂરી છે. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> જ્યારે કનેક્ટેડ હોય ત્યારે <xliff:g id="APP_NAME2">%3$s</xliff:g>ને <xliff:g id="PERMISSIONS">%4$s</xliff:g>નો ઍક્સેસ મળશે."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"હા"</string>
<string name="consent_no" msgid="1335543792857823917">"ના, આભાર"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml
index 6e280b551b24..80c0d953f6d0 100644
--- a/packages/CompanionDeviceManager/res/values-hi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"सहयोगी डिवाइस मैनेजर"</string>
<string name="chooser_title" msgid="2262294130493605839">"कोई <xliff:g id="PROFILE_NAME">%1$s</xliff:g> चुनें, ताकि उसे &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; की मदद से प्रबंधित किया जा सके"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"डिवाइस"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"अपने <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; को प्रबंधित करने के लिए, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को सेट करें"</string>
- <string name="profile_summary" msgid="3167701603666642104">"आपके <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> को प्रबंधित करने के लिए, <xliff:g id="APP_NAME_0">%1$s</xliff:g> की ज़रूरत है. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> के कनेक्ट होने पर, <xliff:g id="APP_NAME2">%3$s</xliff:g> को <xliff:g id="PERMISSIONS">%4$s</xliff:g> का ऐक्सेस मिल जाएगा."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"हां"</string>
<string name="consent_no" msgid="1335543792857823917">"नहीं, रहने दें"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-hr/strings.xml b/packages/CompanionDeviceManager/res/values-hr/strings.xml
index beacbfdf38b9..b574ff690ac1 100644
--- a/packages/CompanionDeviceManager/res/values-hr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hr/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Odaberite profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kojim će upravljati aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Postavite aplikaciju &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da upravlja vašim profilom <xliff:g id="PROFILE_NAME">%2$s</xliff:g> –- &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Potrebna je <xliff:g id="APP_NAME_0">%1$s</xliff:g> za upravljanje vašim profilom <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. Aplikacija <xliff:g id="APP_NAME2">%3$s</xliff:g> dobit će pristup dopuštenju za <xliff:g id="PERMISSIONS">%4$s</xliff:g> dok je povezan profil <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Da"</string>
<string name="consent_no" msgid="1335543792857823917">"Ne, hvala"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-hu/strings.xml b/packages/CompanionDeviceManager/res/values-hu/strings.xml
index cd2900642b9b..b271b122a58e 100644
--- a/packages/CompanionDeviceManager/res/values-hu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hu/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Társeszközök kezelője"</string>
<string name="chooser_title" msgid="2262294130493605839">"A(z) &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; alkalmazással kezelni kívánt <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kiválasztása"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"eszköz"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"A(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; alkalmazás beállítása a(z) <xliff:g id="PROFILE_NAME">%2$s</xliff:g> (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;) kezelésére"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Szükség van a(z) <xliff:g id="APP_NAME_0">%1$s</xliff:g> alkalmazásra a(z) <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> kezeléséhez. Amíg csatlakoztatva van a(z) <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>, a(z) <xliff:g id="APP_NAME2">%3$s</xliff:g> hozzáférést kap a következőkhöz: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Igen"</string>
<string name="consent_no" msgid="1335543792857823917">"Nem"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-hy/strings.xml b/packages/CompanionDeviceManager/res/values-hy/strings.xml
index b0037aa74c2d..e8656907bf9a 100644
--- a/packages/CompanionDeviceManager/res/values-hy/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hy/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Ընտրեք <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ը, որը պետք է կառավարվի &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; հավելվածի կողմից"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"սարք"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Ընտրեք &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածը որպես <xliff:g id="PROFILE_NAME">%2$s</xliff:g>ի կառավարիչ․ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Ձեր <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>ը կառավարելու համար անհրաժեշտ է <xliff:g id="APP_NAME_0">%1$s</xliff:g> հավելվածը։ Երբ <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>ը միացված լինի, <xliff:g id="APP_NAME2">%3$s</xliff:g> հավելվածին հասանելի կլինեն՝ <xliff:g id="PERMISSIONS">%4$s</xliff:g>։"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Այո"</string>
<string name="consent_no" msgid="1335543792857823917">"Ոչ, շնորհակալություն"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-in/strings.xml b/packages/CompanionDeviceManager/res/values-in/strings.xml
index cc05490981b4..2d4fd4a5e6e4 100644
--- a/packages/CompanionDeviceManager/res/values-in/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-in/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Pengelola Perangkat Pendamping"</string>
<string name="chooser_title" msgid="2262294130493605839">"Pilih <xliff:g id="PROFILE_NAME">%1$s</xliff:g> untuk dikelola oleh &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"perangkat"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Tetapkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengelola <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> diperlukan untuk mengelola <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> akan mendapatkan akses ke <xliff:g id="PERMISSIONS">%4$s</xliff:g> saat <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> terhubung."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ya"</string>
<string name="consent_no" msgid="1335543792857823917">"Tidak"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-is/strings.xml b/packages/CompanionDeviceManager/res/values-is/strings.xml
index d3ada7427553..8698bfb5ea35 100644
--- a/packages/CompanionDeviceManager/res/values-is/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-is/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Stjórnun fylgdartækja"</string>
<string name="chooser_title" msgid="2262294130493605839">"Velja <xliff:g id="PROFILE_NAME">%1$s</xliff:g> sem &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; á að stjórna"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"tæki"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Veita &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; stjórn á <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> er krafist til að stjórna <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> fær aðgang að <xliff:g id="PERMISSIONS">%4$s</xliff:g> þegar <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> er tengt."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Já"</string>
<string name="consent_no" msgid="1335543792857823917">"Nei, takk"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-it/strings.xml b/packages/CompanionDeviceManager/res/values-it/strings.xml
index 2632509278e1..beb1482f77c3 100644
--- a/packages/CompanionDeviceManager/res/values-it/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-it/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Gestione dispositivi companion"</string>
<string name="chooser_title" msgid="2262294130493605839">"Scegli un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> che sia gestito da &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Configura &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; per gestire il tuo <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"È richiesta l\'app <xliff:g id="APP_NAME_0">%1$s</xliff:g> per gestire il tuo <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> avrà accesso a <xliff:g id="PERMISSIONS">%4$s</xliff:g> quando <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> è connesso."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Sì"</string>
<string name="consent_no" msgid="1335543792857823917">"No, grazie"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-iw/strings.xml b/packages/CompanionDeviceManager/res/values-iw/strings.xml
index ae9d6f483150..33950eb373c7 100644
--- a/packages/CompanionDeviceManager/res/values-iw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-iw/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"ניהול מכשיר מותאם"</string>
<string name="chooser_title" msgid="2262294130493605839">"‏בחירה של <xliff:g id="PROFILE_NAME">%1$s</xliff:g> לניהול באמצעות &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"מכשיר"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"‏הגדרה של &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; לניהול <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"האפליקציה <xliff:g id="APP_NAME_0">%1$s</xliff:g> נדרשת לניהול של <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. האפליקציה <xliff:g id="APP_NAME2">%3$s</xliff:g> תקבל גישה אל <xliff:g id="PERMISSIONS">%4$s</xliff:g> כאשר <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> מחובר."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"כן"</string>
<string name="consent_no" msgid="1335543792857823917">"לא תודה"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ja/strings.xml b/packages/CompanionDeviceManager/res/values-ja/strings.xml
index 3fb0140bb702..b50c56a33ebf 100644
--- a/packages/CompanionDeviceManager/res/values-ja/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ja/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"コンパニオン デバイス マネージャ"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; の管理対象となる <xliff:g id="PROFILE_NAME">%1$s</xliff:g> の選択"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"デバイス"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; で <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; を管理するよう設定する"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> を管理するために <xliff:g id="APP_NAME_0">%1$s</xliff:g> が必要です。<xliff:g id="PROFILE_NAME2">%5$s</xliff:g> の接続中に、<xliff:g id="APP_NAME2">%3$s</xliff:g> が <xliff:g id="PERMISSIONS">%4$s</xliff:g> にアクセスします。"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"はい"</string>
<string name="consent_no" msgid="1335543792857823917">"いいえ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ka/strings.xml b/packages/CompanionDeviceManager/res/values-ka/strings.xml
index 5b36106f3baf..4ab0abdf4ac8 100644
--- a/packages/CompanionDeviceManager/res/values-ka/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ka/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"კომპანიონი მოწყობილობების მენეჯერი"</string>
<string name="chooser_title" msgid="2262294130493605839">"აირჩიეთ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, რომელიც უნდა მართოს &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;-მა"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"მოწყობილობა"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"დააყენეთ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;, რომ მართოს თქვენი <xliff:g id="PROFILE_NAME">%2$s</xliff:g> — &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"თქვენი <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>-ის სამართავად საჭიროა <xliff:g id="APP_NAME_0">%1$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> მიიღებს წვდომას <xliff:g id="PERMISSIONS">%4$s</xliff:g>-ზე, სანამ <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> დაკავშირებული იქნება."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"დიახ"</string>
<string name="consent_no" msgid="1335543792857823917">"არა, გმადლობთ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-kk/strings.xml b/packages/CompanionDeviceManager/res/values-kk/strings.xml
index 6ff3f830e2db..fcfe030ddb0e 100644
--- a/packages/CompanionDeviceManager/res/values-kk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kk/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; арқылы басқарылатын <xliff:g id="PROFILE_NAME">%1$s</xliff:g> құрылғысын таңдаңыз"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"құрылғы"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; (<xliff:g id="PROFILE_NAME">%2$s</xliff:g>) құрылғысын басқаруға рұқсат беру"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> құрылғысын басқару үшін <xliff:g id="APP_NAME_0">%1$s</xliff:g> қолданбасы керек. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> құрылғысы жалғанған кезде<xliff:g id="APP_NAME2">%3$s</xliff:g> қолданбасы мына параметрлерді пайдалана алады: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Иә"</string>
<string name="consent_no" msgid="1335543792857823917">"Жоқ, рақмет"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-km/strings.xml b/packages/CompanionDeviceManager/res/values-km/strings.xml
index cdcebada0709..e70800445139 100644
--- a/packages/CompanionDeviceManager/res/values-km/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-km/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"កម្មវិធី​គ្រប់​គ្រង​ឧបករណ៍ដៃគូ"</string>
<string name="chooser_title" msgid="2262294130493605839">"ជ្រើសរើស <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ដើម្បីឱ្យស្ថិតក្រោម​ការគ្រប់គ្រងរបស់ &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ឧបករណ៍"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"កំណត់ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ដើម្បីគ្រប់គ្រង <xliff:g id="PROFILE_NAME">%2$s</xliff:g> របស់អ្នក - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"ចាំបាច់ត្រូវមាន <xliff:g id="APP_NAME_0">%1$s</xliff:g> ដើម្បីគ្រប់គ្រង <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> របស់អ្នក។ <xliff:g id="APP_NAME2">%3$s</xliff:g> នឹងអាចចូលប្រើ <xliff:g id="PERMISSIONS">%4$s</xliff:g> នៅពេលភ្ជាប់ <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>។"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"បាទ/ចាស"</string>
<string name="consent_no" msgid="1335543792857823917">"ទេ អរគុណ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-kn/strings.xml b/packages/CompanionDeviceManager/res/values-kn/strings.xml
index 47cf76cd1a11..f4ae18f77847 100644
--- a/packages/CompanionDeviceManager/res/values-kn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kn/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"ಕಂಪ್ಯಾನಿಯನ್ ಸಾಧನ ನಿರ್ವಾಹಕರು"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ಮೂಲಕ ನಿರ್ವಹಿಸಬೇಕಾದ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ಸಾಧನ"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"ನಿಮ್ಮ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ಅನ್ನು ನಿರ್ವಹಿಸಲು, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಅನ್ನು ನಿರ್ವಹಿಸಿ"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> ಅನ್ನು ನಿರ್ವಹಿಸಲು, <xliff:g id="APP_NAME_0">%1$s</xliff:g> ಅಗತ್ಯವಿದೆ. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> ಕನೆಕ್ಟ್ ಆದಾಗ, <xliff:g id="PERMISSIONS">%4$s</xliff:g> ಗೆ <xliff:g id="APP_NAME2">%3$s</xliff:g> ಪ್ರವೇಶವನ್ನು ಪಡೆಯುತ್ತದೆ."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"ಹೌದು"</string>
<string name="consent_no" msgid="1335543792857823917">"ಬೇಡ, ಧನ್ಯವಾದಗಳು"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml
index f29041389686..299d586045e8 100644
--- a/packages/CompanionDeviceManager/res/values-ko/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"부속 기기 관리자"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;에서 관리할 <xliff:g id="PROFILE_NAME">%1$s</xliff:g>을(를) 선택"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"기기"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;에서 <xliff:g id="PROFILE_NAME">%2$s</xliff:g>(&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;)을(를) 관리하도록 설정"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>을(를) 관리하려면 <xliff:g id="APP_NAME_0">%1$s</xliff:g> 앱이 필요합니다. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>이(가) 연결되어 있는 동안 <xliff:g id="APP_NAME2">%3$s</xliff:g> 앱이 <xliff:g id="PERMISSIONS">%4$s</xliff:g>에 액세스할 수 있습니다."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"예"</string>
<string name="consent_no" msgid="1335543792857823917">"취소"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml
index 9cce298b528c..35ee34db59f7 100644
--- a/packages/CompanionDeviceManager/res/values-ky/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; тарабынан башкарылсын"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"түзмөк"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; түзмөгүңүздү башкарсын"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> профилиңизди башкаруу үчүн <xliff:g id="APP_NAME_0">%1$s</xliff:g> керек. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> туташып турганда <xliff:g id="APP_NAME2">%3$s</xliff:g> колдонмосунун төмөнкүлөргө уруксаты болот: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ооба"</string>
<string name="consent_no" msgid="1335543792857823917">"Жок, рахмат"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-lo/strings.xml b/packages/CompanionDeviceManager/res/values-lo/strings.xml
index 5fcbf7dfd802..a27bc15cc850 100644
--- a/packages/CompanionDeviceManager/res/values-lo/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lo/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"ຕົວຈັດການອຸປະກອນປະກອບ"</string>
<string name="chooser_title" msgid="2262294130493605839">"ເລືອກ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ເພື່ອໃຫ້ຖືກຈັດການໂດຍ &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ອຸປະກອນ"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"ຕັ້ງ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ເພື່ອຈັດການ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ຂອງທ່ານ"</string>
- <string name="profile_summary" msgid="3167701603666642104">"ຕ້ອງໃຊ້ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ເພື່ອຈັດການ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> ຂອງທ່ານ. <xliff:g id="APP_NAME2">%3$s</xliff:g> ຈະໄດ້ຮັບສິດເຂົ້າເຖິງ <xliff:g id="PERMISSIONS">%4$s</xliff:g> ໃນເວລາເຊື່ອມຕໍ່ <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"ແມ່ນແລ້ວ"</string>
<string name="consent_no" msgid="1335543792857823917">"ບໍ່, ຂອບໃຈ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-lt/strings.xml b/packages/CompanionDeviceManager/res/values-lt/strings.xml
index 56930d3edf59..11510acad919 100644
--- a/packages/CompanionDeviceManager/res/values-lt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lt/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Jūsų <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, kurį valdys &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; (pasirinkite)"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"įrenginys"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Nustatyti, kad <xliff:g id="PROFILE_NAME">%2$s</xliff:g> &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; būtų valdomas programos &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Tam, kad būtų valdomas jūsų <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>, reikalinga programa „<xliff:g id="APP_NAME_0">%1$s</xliff:g>“. Kol prijungtas <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>, „<xliff:g id="APP_NAME2">%3$s</xliff:g>“ gaus prieigą prie šių elementų: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Taip"</string>
<string name="consent_no" msgid="1335543792857823917">"Ne, ačiū"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-lv/strings.xml b/packages/CompanionDeviceManager/res/values-lv/strings.xml
index a9d215157c52..6a85c836bb49 100644
--- a/packages/CompanionDeviceManager/res/values-lv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lv/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Palīgierīču pārzinis"</string>
<string name="chooser_title" msgid="2262294130493605839">"Profila (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) izvēle, ko pārvaldīt lietotnē &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ierīce"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Lietotnes &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; iestatīšana profila (<xliff:g id="PROFILE_NAME">%2$s</xliff:g> — &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;) pārvaldībai"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Lai pārvaldītu profilu (<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>), nepieciešama lietotne <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Kamēr profils (<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>) būs pievienots, lietotnei <xliff:g id="APP_NAME2">%3$s</xliff:g> tiks piešķirta piekļuve šādām atļaujām: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Jā"</string>
<string name="consent_no" msgid="1335543792857823917">"Nē, paldies"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml
index 5cc18c5b793b..6fed96bcdf6d 100644
--- a/packages/CompanionDeviceManager/res/values-mk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mk/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Изберете <xliff:g id="PROFILE_NAME">%1$s</xliff:g> со којшто ќе управува &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"уред"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Поставете ја &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да управува со <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> е потребна за да управува со <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> ќе добие пристап до <xliff:g id="PERMISSIONS">%4$s</xliff:g> додека <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> е поврзан."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Да"</string>
<string name="consent_no" msgid="1335543792857823917">"Не, фала"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ml/strings.xml b/packages/CompanionDeviceManager/res/values-ml/strings.xml
index b6734e8d1282..6b071cd54950 100644
--- a/packages/CompanionDeviceManager/res/values-ml/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ml/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"കമ്പാനിയൻ ഉപകരണ മാനേജർ"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ഉപയോഗിച്ച് മാനേജ് ചെയ്യുന്നതിന് ഒരു <xliff:g id="PROFILE_NAME">%1$s</xliff:g> തിരഞ്ഞെടുക്കുക"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ഉപകരണം"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"നിങ്ങളുടെ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> മാനേജ് ചെയ്യുന്നതിന് &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; സജ്ജീകരിക്കുക - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> എന്ന ആപ്പിന് നിങ്ങളുടെ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> മാനേജ് ചെയ്യേണ്ടതുണ്ട്. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> കണക്റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ <xliff:g id="APP_NAME2">%3$s</xliff:g> എന്ന ആപ്പിന് <xliff:g id="PERMISSIONS">%4$s</xliff:g> എന്നിവയിലേക്ക് ആക്‌സസ് ലഭിക്കും."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"വേണം"</string>
<string name="consent_no" msgid="1335543792857823917">"വേണ്ട"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-mn/strings.xml b/packages/CompanionDeviceManager/res/values-mn/strings.xml
index cd4fdbf572c3..4d048cb81ad9 100644
--- a/packages/CompanionDeviceManager/res/values-mn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mn/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;-н удирдах<xliff:g id="PROFILE_NAME">%1$s</xliff:g>-г сонгоно уу"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"төхөөрөмж"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"<xliff:g id="PROFILE_NAME">%2$s</xliff:g>-аа удирдахын тулд &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-г тохируулна уу - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Таны <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>-г удирдахын тулд <xliff:g id="APP_NAME_0">%1$s</xliff:g> шаардлагатай. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> холбогдсон үед <xliff:g id="APP_NAME2">%3$s</xliff:g> нь <xliff:g id="PERMISSIONS">%4$s</xliff:g>-д хандах эрхтэй болно."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Тийм"</string>
<string name="consent_no" msgid="1335543792857823917">"Үгүй, баярлалаа"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-mr/strings.xml b/packages/CompanionDeviceManager/res/values-mr/strings.xml
index 65bf262d5bcf..68f9109762fe 100644
--- a/packages/CompanionDeviceManager/res/values-mr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mr/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"सहयोगी डिव्हाइस व्यवस्थापक"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; द्वारे व्यवस्थापित करण्यासाठी <xliff:g id="PROFILE_NAME">%1$s</xliff:g> निवडा"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"डिव्हाइस"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"तुमची <xliff:g id="PROFILE_NAME">%2$s</xliff:g> व्यवस्थापित करण्यासाठी &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; सेट करा - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"तुमची <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> व्यवस्थापित करण्यासाठी <xliff:g id="APP_NAME_0">%1$s</xliff:g> आवश्यक आहे. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> कनेक्ट केलेली असताना <xliff:g id="APP_NAME2">%3$s</xliff:g> ला <xliff:g id="PERMISSIONS">%4$s</xliff:g> चा अ‍ॅक्सेस मिळेल."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"होय"</string>
<string name="consent_no" msgid="1335543792857823917">"नाही, नको"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ms/strings.xml b/packages/CompanionDeviceManager/res/values-ms/strings.xml
index d17041f3b6cb..1188922607b9 100644
--- a/packages/CompanionDeviceManager/res/values-ms/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ms/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Pengurus Peranti Rakan"</string>
<string name="chooser_title" msgid="2262294130493605839">"Pilih <xliff:g id="PROFILE_NAME">%1$s</xliff:g> untuk diurus oleh &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"peranti"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Tetapkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengurus <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; anda"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> diperlukan untuk mengurus <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> anda. <xliff:g id="APP_NAME2">%3$s</xliff:g> akan mendapat akses kepada <xliff:g id="PERMISSIONS">%4$s</xliff:g> semasa <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> disambungkan."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ya"</string>
<string name="consent_no" msgid="1335543792857823917">"Tidak perlu"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-my/strings.xml b/packages/CompanionDeviceManager/res/values-my/strings.xml
index 23f165a9259c..b16869dece36 100644
--- a/packages/CompanionDeviceManager/res/values-my/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-my/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"တွဲဖက်ကိရိယာ မန်နေဂျာ"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; က စီမံခန့်ခွဲရန် <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ကို ရွေးချယ်ပါ"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"စက်"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"သင်၏ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ကို စီမံခန့်ခွဲရန် &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ကို သတ်မှတ်ပါ"</string>
- <string name="profile_summary" msgid="3167701603666642104">"သင်၏ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> ကို စီမံခန့်ခွဲရန် <xliff:g id="APP_NAME_0">%1$s</xliff:g> ကို လိုအပ်ပါသည်။ <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> ကို ချိတ်ဆက်ထားစဉ် <xliff:g id="APP_NAME2">%3$s</xliff:g> သည် <xliff:g id="PERMISSIONS">%4$s</xliff:g> ကို ဝင်သုံးခွင့်ရပါမည်။"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Yes"</string>
<string name="consent_no" msgid="1335543792857823917">"မလိုပါ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml
index 090f2a20820c..cac087f45d69 100644
--- a/packages/CompanionDeviceManager/res/values-nb/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Velg <xliff:g id="PROFILE_NAME">%1$s</xliff:g> som skal administreres av &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Angi &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; for å administrere <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> kreves for å administrere <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> får tilgang til <xliff:g id="PERMISSIONS">%4$s</xliff:g> når <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> er tilkoblet."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ja"</string>
<string name="consent_no" msgid="1335543792857823917">"Nei takk"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml
index e885674fb2db..e390161bb22a 100644
--- a/packages/CompanionDeviceManager/res/values-ne/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"सहयोगी यन्त्रको प्रबन्धक"</string>
<string name="chooser_title" msgid="2262294130493605839">"आफूले &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; प्रयोग गरी व्यवस्थापन गर्न चाहेको <xliff:g id="PROFILE_NAME">%1$s</xliff:g> चयन गर्नुहोस्"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"यन्त्र"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"आफ्नो <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; व्यवस्थापन गर्न &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; तोक्नुहोस्"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> व्यवस्थापन गर्न <xliff:g id="APP_NAME_0">%1$s</xliff:g> इन्स्टल गर्नु पर्ने हुन्छ। <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> कनेक्ट भएका बेला <xliff:g id="APP_NAME2">%3$s</xliff:g> ले <xliff:g id="PERMISSIONS">%4$s</xliff:g> प्रयोग गर्ने अनुमति प्राप्त गर्ने छ।"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"अँ"</string>
<string name="consent_no" msgid="1335543792857823917">"सहमत छुइनँ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml
index 5a7fb3a1bb4f..2153770e169d 100644
--- a/packages/CompanionDeviceManager/res/values-nl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Een <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kiezen om te beheren met &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"apparaat"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; instellen om je <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; te beheren"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Je hebt <xliff:g id="APP_NAME_0">%1$s</xliff:g> nodig om je <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> te beheren. <xliff:g id="APP_NAME2">%3$s</xliff:g> krijgt toegang tot <xliff:g id="PERMISSIONS">%4$s</xliff:g> terwijl je <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> is verbonden."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ja"</string>
<string name="consent_no" msgid="1335543792857823917">"Nee, bedankt"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-or/strings.xml b/packages/CompanionDeviceManager/res/values-or/strings.xml
index 03fae5c5c01c..d1aa50b6c30f 100644
--- a/packages/CompanionDeviceManager/res/values-or/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-or/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"ସହଯୋଗୀ ଡିଭାଇସ୍ ପରିଚାଳକ"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ଦ୍ୱାରା ପରିଚାଳିତ ହେବା ପାଇଁ ଏକ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>କୁ ବାଛନ୍ତୁ"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ଡିଭାଇସ୍"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"ଆପଣଙ୍କ <xliff:g id="PROFILE_NAME">%2$s</xliff:g>କୁ ପରିଚାଳନା କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ସେଟ୍ କରନ୍ତୁ - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"ଆପଣଙ୍କ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>କୁ ପରିଚାଳନା କରିବା ପାଇଁ <xliff:g id="APP_NAME_0">%1$s</xliff:g>ର ଆବଶ୍ୟକତା ଅଛି। <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> ସଂଯୁକ୍ତ ହୋଇଥିବା ସମୟରେ <xliff:g id="APP_NAME2">%3$s</xliff:g> <xliff:g id="PERMISSIONS">%4$s</xliff:g>କୁ ଆକ୍ସେସ୍ ପାଇବ।"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"ହଁ"</string>
<string name="consent_no" msgid="1335543792857823917">"ନା, ଧନ୍ୟବାଦ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pa/strings.xml b/packages/CompanionDeviceManager/res/values-pa/strings.xml
index 33135b2488c5..ff211f2550d5 100644
--- a/packages/CompanionDeviceManager/res/values-pa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pa/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"ਸੰਬੰਧੀ ਡੀਵਾਈਸ ਪ੍ਰਬੰਧਕ"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਜਾਣ ਲਈ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ਚੁਣੋ"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"ਡੀਵਾਈਸ"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡਾ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਸੈੱਟ ਕਰੋ"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ਨੂੰ ਤੁਹਾਡਾ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> ਕਨੈਕਟ ਕੀਤੇ ਹੋਣ \'ਤੇ <xliff:g id="APP_NAME2">%3$s</xliff:g> ਨੂੰ <xliff:g id="PERMISSIONS">%4$s</xliff:g> ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਹੋ ਜਾਵੇਗੀ।"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"ਹਾਂ"</string>
<string name="consent_no" msgid="1335543792857823917">"ਨਹੀਂ ਧੰਨਵਾਦ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml
index a82837030f23..b16d0458055a 100644
--- a/packages/CompanionDeviceManager/res/values-pl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Menedżer urządzeń towarzyszących"</string>
<string name="chooser_title" msgid="2262294130493605839">"Wybierz profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, którym ma zarządzać aplikacja &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"urządzenie"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Ustaw aplikację &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; do zarządzania profilem <xliff:g id="PROFILE_NAME">%2$s</xliff:g> na urządzeniu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Aplikacja <xliff:g id="APP_NAME_0">%1$s</xliff:g> jest wymagana do zarządzania profilem <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. Kiedy profil <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> będzie połączony, <xliff:g id="APP_NAME2">%3$s</xliff:g> będzie mieć te uprawnienia: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Tak"</string>
<string name="consent_no" msgid="1335543792857823917">"Nie, dziękuję"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
index 4258e705e7d1..40f9d2d7310e 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Gerenciador de dispositivos complementar"</string>
<string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerenciado pelo app &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Defina o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; como gerenciador do seu <xliff:g id="PROFILE_NAME">%2$s</xliff:g> (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;)"</string>
- <string name="profile_summary" msgid="3167701603666642104">"O app <xliff:g id="APP_NAME_0">%1$s</xliff:g> é necessário para gerenciar seu <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> terá acesso a <xliff:g id="PERMISSIONS">%4$s</xliff:g> enquanto o <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> estiver conectado."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Sim"</string>
<string name="consent_no" msgid="1335543792857823917">"Agora não"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
index 45b03d604a64..745d1630dd86 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
@@ -19,8 +19,9 @@
<string name="app_label" msgid="4470785958457506021">"Gestor de dispositivos associados"</string>
<string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerido pela app &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
+ <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string>
<string name="confirmation_title" msgid="4751119145078041732">"Defina a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; para gerir o seu <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"A app <xliff:g id="APP_NAME_0">%1$s</xliff:g> é necessária para gerir o seu <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. A app <xliff:g id="APP_NAME2">%3$s</xliff:g> terá acesso a <xliff:g id="PERMISSIONS">%4$s</xliff:g> enquanto o <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> estiver associado."</string>
+ <string name="profile_summary" msgid="2009764182871566255">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> é necessária para gerir o seu <xliff:g id="PROFILE_NAME">%2$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%3$s</xliff:g>"</string>
<string name="consent_yes" msgid="4055438216605487056">"Sim"</string>
<string name="consent_no" msgid="1335543792857823917">"Não, obrigado"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt/strings.xml b/packages/CompanionDeviceManager/res/values-pt/strings.xml
index 4258e705e7d1..40f9d2d7310e 100644
--- a/packages/CompanionDeviceManager/res/values-pt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Gerenciador de dispositivos complementar"</string>
<string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerenciado pelo app &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Defina o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; como gerenciador do seu <xliff:g id="PROFILE_NAME">%2$s</xliff:g> (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;)"</string>
- <string name="profile_summary" msgid="3167701603666642104">"O app <xliff:g id="APP_NAME_0">%1$s</xliff:g> é necessário para gerenciar seu <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> terá acesso a <xliff:g id="PERMISSIONS">%4$s</xliff:g> enquanto o <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> estiver conectado."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Sim"</string>
<string name="consent_no" msgid="1335543792857823917">"Agora não"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml
index 060e9965f2f9..6040adf969f3 100644
--- a/packages/CompanionDeviceManager/res/values-ro/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Manager de dispozitiv Companion"</string>
<string name="chooser_title" msgid="2262294130493605839">"Alegeți un profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> pe care să îl gestioneze &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispozitiv"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Setați &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pentru a vă gestiona profilul <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> este necesară pentru a vă gestiona profilul <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> va primi acces la <xliff:g id="PERMISSIONS">%4$s</xliff:g> în timp ce profilul <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> este conectat."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Da"</string>
<string name="consent_no" msgid="1335543792857823917">"Nu, mulțumesc"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ru/strings.xml b/packages/CompanionDeviceManager/res/values-ru/strings.xml
index 7982507c434e..9939a8255d0b 100644
--- a/packages/CompanionDeviceManager/res/values-ru/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ru/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Управление подключенными устройствами"</string>
<string name="chooser_title" msgid="2262294130493605839">"Выберите устройство (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), которым будет управлять приложение &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Разрешите приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; управлять устройством &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; (<xliff:g id="PROFILE_NAME">%2$s</xliff:g>)"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Приложение \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" необходимо для управления устройством (<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>). При подключении к устройству (<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>) приложение \"<xliff:g id="APP_NAME2">%3$s</xliff:g>\" получит доступ к следующему: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Да"</string>
<string name="consent_no" msgid="1335543792857823917">"Нет"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-si/strings.xml b/packages/CompanionDeviceManager/res/values-si/strings.xml
index 8bbc1a6827cb..6e6b0293cfa8 100644
--- a/packages/CompanionDeviceManager/res/values-si/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-si/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"සහායක උපාංග කළමනාකරු"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; මගින් කළමනාකරණය කරනු ලැබීමට <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ක් තෝරන්න"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"උපාංගය"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ඔබගේ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> කළමනාකරණය කිරීමට සකසන්න - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ඔබගේ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> කළමනාකරණය කිරීමට අවශ්‍යයි. <xliff:g id="APP_NAME2">%3$s</xliff:g> හට <xliff:g id="PERMISSIONS">%4$s</xliff:g> වෙත ප්‍රවේශය <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> සම්බන්ධිත අතරතුර ලැබෙනු ඇත."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"ඔව්"</string>
<string name="consent_no" msgid="1335543792857823917">"එපා, ස්තුතියි"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml
index 1037a9693da2..520aa0900e4d 100644
--- a/packages/CompanionDeviceManager/res/values-sk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Správca sprievodných zariadení"</string>
<string name="chooser_title" msgid="2262294130493605839">"Vyberte profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, ktorý bude spravovať aplikácia &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"zariadenie"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Nastavte aplikáciu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;, aby spravovala profil <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Na správu profilu <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> je potrebná aplikácia <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Kým bude profil <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> pripojený, <xliff:g id="APP_NAME2">%3$s</xliff:g> získa prístup k povoleniam <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Áno"</string>
<string name="consent_no" msgid="1335543792857823917">"Nie, vďaka"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sl/strings.xml b/packages/CompanionDeviceManager/res/values-sl/strings.xml
index f2d4c6fb03d0..f60cab8e4710 100644
--- a/packages/CompanionDeviceManager/res/values-sl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sl/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Upravitelj spremljevalnih naprav"</string>
<string name="chooser_title" msgid="2262294130493605839">"Izbira naprave <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, ki jo bo upravljala aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"naprava"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Nastavitev aplikacije &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;, ki bo upravljala napravo <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Za upravljanje naprave <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> potrebujete aplikacijo <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Ko je naprava <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> povezana, bo aplikaciji <xliff:g id="APP_NAME2">%3$s</xliff:g> omogočen dostop do teh dovoljenj: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Da"</string>
<string name="consent_no" msgid="1335543792857823917">"Ne, hvala"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sq/strings.xml b/packages/CompanionDeviceManager/res/values-sq/strings.xml
index c9336b3b4433..4c308e8c5b67 100644
--- a/packages/CompanionDeviceManager/res/values-sq/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sq/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Menaxheri i pajisjes shoqëruese"</string>
<string name="chooser_title" msgid="2262294130493605839">"Zgjidh një profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> që do të menaxhohet nga &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"pajisja"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Cakto &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; që të menaxhojë profilin tënd <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Nevojitet <xliff:g id="APP_NAME_0">%1$s</xliff:g> për të menaxhuar profilin tënd <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> do të marrë qasje në <xliff:g id="PERMISSIONS">%4$s</xliff:g> ndërkohë që është lidhur profili <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Po"</string>
<string name="consent_no" msgid="1335543792857823917">"Jo, faleminderit"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sr/strings.xml b/packages/CompanionDeviceManager/res/values-sr/strings.xml
index 5298194bc422..da08d879940f 100644
--- a/packages/CompanionDeviceManager/res/values-sr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sr/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Менаџер придруженог уређаја"</string>
<string name="chooser_title" msgid="2262294130493605839">"Одаберите профил <xliff:g id="PROFILE_NAME">%1$s</xliff:g> којим ће управљати апликација &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"уређај"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Подесите апликацију &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да управља профилом <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Апликација <xliff:g id="APP_NAME_0">%1$s</xliff:g> је неопходна за управљање профилом <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> ће добити приступ дозволама за <xliff:g id="PERMISSIONS">%4$s</xliff:g> док је <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> повезан."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Да"</string>
<string name="consent_no" msgid="1335543792857823917">"Не, хвала"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sv/strings.xml b/packages/CompanionDeviceManager/res/values-sv/strings.xml
index caacba098208..a73cbfa85e40 100644
--- a/packages/CompanionDeviceManager/res/values-sv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sv/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Välj en <xliff:g id="PROFILE_NAME">%1$s</xliff:g> för hantering av &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Konfigurera &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; för att hantera din <xliff:g id="PROFILE_NAME">%2$s</xliff:g> – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> krävs för att hantera din <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. <xliff:g id="APP_NAME2">%3$s</xliff:g> får åtkomst till <xliff:g id="PERMISSIONS">%4$s</xliff:g> medan <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> är ansluten."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ja"</string>
<string name="consent_no" msgid="1335543792857823917">"Nej tack"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sw/strings.xml b/packages/CompanionDeviceManager/res/values-sw/strings.xml
index ae8ade7ef075..5865ec97bbb6 100644
--- a/packages/CompanionDeviceManager/res/values-sw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sw/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Kidhibiti cha Vifaa Visaidizi"</string>
<string name="chooser_title" msgid="2262294130493605839">"Chagua <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ili idhibitiwe na &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"kifaa"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Weka &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ili udhibiti <xliff:g id="PROFILE_NAME">%2$s</xliff:g> yako - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> linahitajika ili kudhibiti <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> wako. <xliff:g id="APP_NAME2">%3$s</xliff:g> itapata uwezo wa kufikia <xliff:g id="PERMISSIONS">%4$s</xliff:g> wakati <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> imeunganishwa."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ndiyo"</string>
<string name="consent_no" msgid="1335543792857823917">"Hapana"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ta/strings.xml b/packages/CompanionDeviceManager/res/values-ta/strings.xml
index 373ed4543cc9..f9d640128e9c 100644
--- a/packages/CompanionDeviceManager/res/values-ta/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ta/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"கம்பேனியன் சாதன நிர்வாகி"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ஆப்ஸ் நிர்வகிக்கக்கூடிய <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ஐத் தேர்ந்தெடுங்கள்"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"சாதனம்"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"<xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; ஐ நிர்வகிக்க &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அமையுங்கள்"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> ஐ நிர்வகிக்க <xliff:g id="APP_NAME_0">%1$s</xliff:g> ஆப்ஸ் வேண்டும். <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> இணைக்கப்பட்டதும் <xliff:g id="PERMISSIONS">%4$s</xliff:g> ஆகியவற்றுக்கான அணுகலை <xliff:g id="APP_NAME2">%3$s</xliff:g> ஆப்ஸ் பெறும்."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"ஆம்"</string>
<string name="consent_no" msgid="1335543792857823917">"வேண்டாம்"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml
index f73e7136b5f0..82616cc8bc19 100644
--- a/packages/CompanionDeviceManager/res/values-te/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-te/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"సహచర పరికర మేనేజర్"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ద్వారా మేనేజ్ చేయబడటానికి ఒక <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ను ఎంచుకోండి"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"పరికరం"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"మీ <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;ను మేనేజ్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ను సెటప్ చేయండి"</string>
- <string name="profile_summary" msgid="3167701603666642104">"మీ <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>ను మేనేజ్ చేయడానికి <xliff:g id="APP_NAME_0">%1$s</xliff:g> అవసరం ఉంది. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> కనెక్ట్ అయినప్పుడు <xliff:g id="APP_NAME2">%3$s</xliff:g>, <xliff:g id="PERMISSIONS">%4$s</xliff:g>కు యాక్సెస్‌ను పొందుతుంది."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"అవును"</string>
<string name="consent_no" msgid="1335543792857823917">"వద్దు, ధన్యవాదాలు"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-th/strings.xml b/packages/CompanionDeviceManager/res/values-th/strings.xml
index 8c1848a1e582..77a9fff1f2fc 100644
--- a/packages/CompanionDeviceManager/res/values-th/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-th/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"เลือก<xliff:g id="PROFILE_NAME">%1$s</xliff:g>ที่จะให้มีการจัดการโดย &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"อุปกรณ์"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"ตั้งค่า &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ให้จัดการ<xliff:g id="PROFILE_NAME">%2$s</xliff:g>ของคุณ - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"ต้องใช้ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ในการจัดการ<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> <xliff:g id="APP_NAME2">%3$s</xliff:g> จะได้รับสิทธิ์เข้าถึง<xliff:g id="PERMISSIONS">%4$s</xliff:g>ในขณะที่มีการเชื่อมต่อ<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"ใช่"</string>
<string name="consent_no" msgid="1335543792857823917">"ไม่เป็นไร"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-tl/strings.xml b/packages/CompanionDeviceManager/res/values-tl/strings.xml
index 8fcc3d27d5d5..6d6264236e46 100644
--- a/packages/CompanionDeviceManager/res/values-tl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tl/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Kasamang Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Pumili ng <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para pamahalaan ng &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Itakda ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; para pamahalaan ang iyong <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Kailangan ang <xliff:g id="APP_NAME_0">%1$s</xliff:g> para pamahalaan ang iyong <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>. Magkakaroon ng access ang <xliff:g id="APP_NAME2">%3$s</xliff:g> sa <xliff:g id="PERMISSIONS">%4$s</xliff:g> habang nakakonekta ang <xliff:g id="PROFILE_NAME2">%5$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Oo"</string>
<string name="consent_no" msgid="1335543792857823917">"Huwag na lang"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-tr/strings.xml b/packages/CompanionDeviceManager/res/values-tr/strings.xml
index 255eca50d2b2..2c30ea743d8c 100644
--- a/packages/CompanionDeviceManager/res/values-tr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tr/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; tarafından yönetilecek bir <xliff:g id="PROFILE_NAME">%1$s</xliff:g> seçin"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasını, <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; cihazınızı yönetecek şekilde ayarlayın"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>, <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> yönetimi için gereklidir. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> bağlıyken <xliff:g id="APP_NAME2">%3$s</xliff:g>, şunlara erişebilecek: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Evet"</string>
<string name="consent_no" msgid="1335543792857823917">"Hayır, teşekkürler"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-uk/strings.xml b/packages/CompanionDeviceManager/res/values-uk/strings.xml
index b5827f2c78ad..f68fd9230c71 100644
--- a/packages/CompanionDeviceManager/res/values-uk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uk/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Диспетчер супутніх пристроїв"</string>
<string name="chooser_title" msgid="2262294130493605839">"Виберіть <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, яким керуватиме додаток &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"пристрій"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Налаштуйте додаток &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;, щоб керувати своїм пристроєм &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; (<xliff:g id="PROFILE_NAME">%2$s</xliff:g>)"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Щоб керувати своїм пристроєм (<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>), вам потрібен додаток <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Коли <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> буде підключено, додаток <xliff:g id="APP_NAME2">%3$s</xliff:g> отримає такі дозволи на доступ: <xliff:g id="PERMISSIONS">%4$s</xliff:g>."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Так"</string>
<string name="consent_no" msgid="1335543792857823917">"Ні, дякую"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml
index 2bbffdcb7c2d..967b7f9b5a25 100644
--- a/packages/CompanionDeviceManager/res/values-ur/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"ساتھی آلہ مینیجر"</string>
<string name="chooser_title" msgid="2262294130493605839">"‏&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; کے ذریعے نظم کئے جانے کیلئے <xliff:g id="PROFILE_NAME">%1$s</xliff:g> کو منتخب کریں"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"آلہ"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"‏اپنے <xliff:g id="PROFILE_NAME">%2$s</xliff:g> کا نظم کرنے کے لیے &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کو سیٹ کریں - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"آپ کے <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> کا نظم کرنے کے لیے <xliff:g id="APP_NAME_0">%1$s</xliff:g> کی ضرورت ہے۔ <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> کے منسلک ہونے پر <xliff:g id="APP_NAME2">%3$s</xliff:g> <xliff:g id="PERMISSIONS">%4$s</xliff:g> تک رسائی حاصل کرے گا۔"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"ہاں"</string>
<string name="consent_no" msgid="1335543792857823917">"نہیں شکریہ"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-uz/strings.xml b/packages/CompanionDeviceManager/res/values-uz/strings.xml
index 96c49f2fed3c..c8c4b22c51df 100644
--- a/packages/CompanionDeviceManager/res/values-uz/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uz/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; boshqaradigan <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qurilmasini tanlang"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"qurilma"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"<xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; qurilmalarini boshqarish uchun &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasini sozlang"</string>
- <string name="profile_summary" msgid="3167701603666642104">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ilovasi <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> qurilmasini boshqarish uchun kerak. <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> qurilmasiga <xliff:g id="APP_NAME2">%3$s</xliff:g> ilovasi ulansa, u quyidagi ruxsatlarni oladi: <xliff:g id="PERMISSIONS">%4$s</xliff:g>"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Ha"</string>
<string name="consent_no" msgid="1335543792857823917">"Kerak emas"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-vi/strings.xml b/packages/CompanionDeviceManager/res/values-vi/strings.xml
index d67db4141fe9..f0234a4e7d9f 100644
--- a/packages/CompanionDeviceManager/res/values-vi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-vi/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
<string name="chooser_title" msgid="2262294130493605839">"Chọn một <xliff:g id="PROFILE_NAME">%1$s</xliff:g> sẽ do &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; quản lý"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"thiết bị"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Đặt &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; để quản lý <xliff:g id="PROFILE_NAME">%2$s</xliff:g> của bạn – &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"Cần có <xliff:g id="APP_NAME_0">%1$s</xliff:g> để quản lý <xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> của bạn. <xliff:g id="APP_NAME2">%3$s</xliff:g> sẽ có quyền truy cập vào <xliff:g id="PERMISSIONS">%4$s</xliff:g> trong khi <xliff:g id="PROFILE_NAME2">%5$s</xliff:g> được kết nối."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Có"</string>
<string name="consent_no" msgid="1335543792857823917">"Không, cảm ơn"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
index a1abd98dfa1b..caf232169267 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"配套设备管理器"</string>
<string name="chooser_title" msgid="2262294130493605839">"选择要由&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"设备"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"设为由&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;管理您的<xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"若要管理<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>,您需要使用<xliff:g id="APP_NAME_0">%1$s</xliff:g>。在已连接<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>的情况下,<xliff:g id="APP_NAME2">%3$s</xliff:g>将能够访问<xliff:g id="PERMISSIONS">%4$s</xliff:g>。"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"好"</string>
<string name="consent_no" msgid="1335543792857823917">"不用了"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
index 57d2173a2d2a..5ec64a513844 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"隨附裝置管理員"</string>
<string name="chooser_title" msgid="2262294130493605839">"選擇由 &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; 管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"設定 &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; 來管理您的 <xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"必須使用 <xliff:g id="APP_NAME_0">%1$s</xliff:g> 來管理您的<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>。連結<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>後,<xliff:g id="APP_NAME2">%3$s</xliff:g> 將可以存取<xliff:g id="PERMISSIONS">%4$s</xliff:g>。"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"是"</string>
<string name="consent_no" msgid="1335543792857823917">"不用了,謝謝"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
index c9a2fd85edcc..b8c2ed0f952a 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"隨附裝置管理員"</string>
<string name="chooser_title" msgid="2262294130493605839">"選擇要讓「<xliff:g id="APP_NAME">%2$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"授權讓「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;管理你的<xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"如要管理你的<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g>,必須使用「<xliff:g id="APP_NAME_0">%1$s</xliff:g>」。與<xliff:g id="PROFILE_NAME2">%5$s</xliff:g>連線時,「<xliff:g id="APP_NAME2">%3$s</xliff:g>」將有權存取你的<xliff:g id="PERMISSIONS">%4$s</xliff:g>。"</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"是"</string>
<string name="consent_no" msgid="1335543792857823917">"不用了,謝謝"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-zu/strings.xml b/packages/CompanionDeviceManager/res/values-zu/strings.xml
index c811037bd24c..7df0869f19c7 100644
--- a/packages/CompanionDeviceManager/res/values-zu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zu/strings.xml
@@ -19,8 +19,11 @@
<string name="app_label" msgid="4470785958457506021">"Isiphathi sedivayisi esihambisanayo"</string>
<string name="chooser_title" msgid="2262294130493605839">"Khetha i-<xliff:g id="PROFILE_NAME">%1$s</xliff:g> ezophathwa yi-&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
<string name="profile_name_generic" msgid="6851028682723034988">"idivayisi"</string>
+ <!-- no translation found for profile_name_watch (576290739483672360) -->
+ <skip />
<string name="confirmation_title" msgid="4751119145078041732">"Setha i-&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukuba iphathe i-<xliff:g id="PROFILE_NAME">%2$s</xliff:g> - &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;"</string>
- <string name="profile_summary" msgid="3167701603666642104">"I-<xliff:g id="APP_NAME_0">%1$s</xliff:g> iyadingeka ukuphatha i-<xliff:g id="PROFILE_NAME_1">%2$s</xliff:g> yakho. I-<xliff:g id="APP_NAME2">%3$s</xliff:g> izothola ukufinyelela ku-<xliff:g id="PERMISSIONS">%4$s</xliff:g> kuyilapho i-<xliff:g id="PROFILE_NAME2">%5$s</xliff:g> ixhunyiwe."</string>
+ <!-- no translation found for profile_summary (2009764182871566255) -->
+ <skip />
<string name="consent_yes" msgid="4055438216605487056">"Yebo"</string>
<string name="consent_no" msgid="1335543792857823917">"Cha ngiyabonga"</string>
</resources>
diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml
index 77d252d65a42..eb95466580fc 100644
--- a/packages/InputDevices/res/values-eu/strings.xml
+++ b/packages/InputDevices/res/values-eu/strings.xml
@@ -48,6 +48,6 @@
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijandarra"</string>
<string name="keyboard_layout_polish" msgid="1121588624094925325">"Poloniarra"</string>
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Bielorrusiera"</string>
- <string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongoliera"</string>
+ <string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongoliarra"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgiera"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index defbf54ccb10..6f4f72aae8ca 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF (diensverskaffer-wi-fi)"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobiele data is af"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nie gestel om data te gebruik nie"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Geen foon nie."</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 1326c5190a79..3f5df34b07b0 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"የተንቀሳቃሽ ስልክ ውሂብ ጠፍቷል"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"ውሂብን ለመጠቀም አልተቀናበረም"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"ምንም ስልክ የለም።"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 702a41948eb2..0351d946c05c 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -580,8 +580,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"شبكة الجيل الرابع أو أحدث"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+‎"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"تم إيقاف بيانات الجوال"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"لم يتم الضبط على استخدام البيانات"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"ليست هناك إشارة بالهاتف."</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index c5dbda907cef..0f7db8f1e966 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"এলটিই"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"এলটিই+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"ম’বাইল ডেটা অফ অৱস্থাত আছে"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"ডেটা ব্যৱহাৰ কৰিবলৈ ছেট কৰা নাই"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"ফ\'নত ছিগনেল নাই৷"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index b18b1c416588..0855d17e8c70 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobil data deaktivdir"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Data istifadə etmək üçün ayarlanmayıb"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Telefon yoxdur."</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index d92f171bd049..3386fe8649ea 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -577,8 +577,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"WiFi mobilnog operatera"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobilni podaci su isključeni"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nije podešeno za korišćenje podataka"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Nema telefona."</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 57d9a554fef0..6ac2172496c4 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -578,8 +578,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мабільная перадача даных выключана"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Не зададзена для выкарыстання даных"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Няма тэлефона."</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 4d4b392f1feb..19ed5bdd5688 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мобилните данни са изключени"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Не е зададено да използва данни"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Няма телефон."</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 88fb83f3b295..b0e9342c19c6 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"মোবাইল ডেটা বন্ধ করা হয়েছে"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"ডেটা ব্যবহার করার জন্য সেট করা নেই"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"কোনো ফোনের সংকেত নেই৷"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 6925d044f6c9..9377624d6d26 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -577,8 +577,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Prijenos podataka na mobilnoj mreži je isključen"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nije postavljeno za korištenje podataka"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Nema telefonskog signala."</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index dd3a8118510a..a2a7770e7db7 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"S\'han desactivat les dades mòbils"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"No s\'ha definit per utilitzar dades"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"No hi ha senyal de telèfon."</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 6b8914d457dc..4db4d5c81e3f 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -578,8 +578,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Wi-Fi operátora"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobilní data jsou vypnuta"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nenastaveno k využití dat"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Žádná telefonní síť."</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index c8b4e2b5d42c..b76afa5c42d6 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobildata er deaktiveret"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Ikke indstillet til at anvende data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Ingen telefon."</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index eb87a585cfdd..c608a629a80d 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Τα δεδομένα κινητής τηλεφωνίας απενεργοποιήθηκαν"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Δεν ρυθμίστηκε ώστε να χρησιμοποιεί δεδομένα"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Δεν υπάρχει τηλέφωνο."</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index ad16c89d3871..e67c3d1ddc5a 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobile data off"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Not set to use data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"No phone."</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 451590847147..b0830fc40e2e 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobile data off"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Not set to use data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"No phone."</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index ad16c89d3871..e67c3d1ddc5a 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobile data off"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Not set to use data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"No phone."</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index ad16c89d3871..e67c3d1ddc5a 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobile data off"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Not set to use data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"No phone."</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index f8903bb23877..4c0af75fada6 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎4G+‎‏‎‎‏‎"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎LTE‎‏‎‎‏‎"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎LTE+‎‏‎‎‏‎"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎CWF‎‏‎‎‏‎"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‏‎‎‏‎‎Mobile data off‎‏‎‎‏‎"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‏‎Not set to use data‎‏‎‎‏‎"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‏‎No phone.‎‏‎‎‏‎"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 26cffd20a0e7..9ae77819029b 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Datos móviles desactivados"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"No se configuró para usar datos"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Sin teléfono"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 5a58a20fb63b..203726a5d557 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Datos desactiv."</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"No está establecido para usar los datos"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Sin teléfono"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 2d5d0b5f4eb3..379ed6cb9065 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobiilne andmeside on väljas"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Ei ole andmeside kasutamiseks seadistatud"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Telefonisignaal puudub"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index ae99c010ec39..cb598e523100 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+‎"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+‎"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"داده تلفن همراه خاموش است"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"برای استفاده از داده تنظیم نشده است"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"بدون تلفن."</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 6dd3a21db0fd..31dfe1829133 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Operaattorin Wi-Fi"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobiilidata poistettu käytöstä"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Ei käytä dataa"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Ei puhelinverkkoyhteyttä."</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index cf8ec408106b..46bd71b9b382 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"મોબાઇલ ડેટા બંધ છે"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"ડેટાનો ઉપયોગ કરવાનું સેટ કર્યું નથી"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"કોઈ ફોન નથી."</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index ddcfc5804ba5..9cae3112cd48 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"एलटीई"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"मोबाइल डेटा बंद है"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"डेटा इस्तेमाल करने के लिए सेट नहीं किया गया है"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"कोई फ़ोन नहीं."</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index f7d2bec35406..83bb2d1e7732 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -577,8 +577,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G i više"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobilni su podaci isključeni"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nije postavljeno za upotrebu podataka"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Nema telefona."</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 883e2a42ea93..9f184c7052f5 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Szolgáltatói Wi-Fi"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobiladatok kikapcsolva"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nincs beállítva az adathasználat"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Nincs telefon."</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index de9e4dd87dcf..cd6cbf3bc396 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Բջջային ինտերնետն անջատված է"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Բջջային ինտերնետն ըստ կանխադրման չի օգտագործվում"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Հեռախոս չկա:"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index e4f56e6e45da..3b8091872562 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Kuota nonaktif"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Tidak disetel untuk menggunakan data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Tidak dapat melakukan panggilan."</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index d5d828928097..ce9e66522aaf 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Wi-Fi símafyrirtækis (CWF)"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Slökkt á farsímagögnum"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Ekki stillt á að nota gögn"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Ekkert símasamband."</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 55c03b6fbe08..93b24a0bf066 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Wi-Fi operatore"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Dati mobili disattivati"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Non impostato per l\'utilizzo dei dati"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Nessun telefono."</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 6bbfa16d6597..ab678092dd9c 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -578,8 +578,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"+4G"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"+LTE"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"‏Wi-Fi של הספק"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"חבילת הגלישה כבויה"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"לא מוגדרת לשימוש בנתונים"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"אין טלפון."</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index d97926b8ae76..08133056c408 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"მობილური ინტერნეტი გამორთულია"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"არ არის დაყენებული მონაცემების გამოყენებისთვის"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"ტელეფონი არ არის."</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 6cceef600759..16ee9c00fa18 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -359,7 +359,7 @@
<string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU жөндеу қабаттарын қосу"</string>
<string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"GPU жөндеу қабаттарының жүктелуіне рұқсат ету"</string>
<string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Жеткізушілерді журналға тіркеу"</string>
- <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Қате туралы есепте қызмет көрсетушінің құрылғыға қатысты қосымша ақпаратын қамту. Мұнда жеке ақпарат көрсетілуі, батарея шығыны артуы және/немесе қосымша жад пайдаланылуы мүмкін."</string>
+ <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Қате туралы есепте жеткізушінің құрылғыға қатысты қосымша ақпараты қамтылады. Мұнда жеке ақпарат көрсетілуі, батарея шығыны артуы және/немесе қосымша жад пайдаланылуы мүмкін."</string>
<string name="window_animation_scale_title" msgid="5236381298376812508">"Терезе анимациясының өлшемі"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Ауысу анимациясының өлшемі"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Аниматор ұзақтығы"</string>
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мобильдік деректер өшірулі"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Деректерді пайдалануға реттелмеген."</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Телефон жоқ."</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index f069d1530c0c..5b47381758f7 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"ទិន្នន័យ​ទូរសព្ទចល័ត​បានបិទ"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"មិនបានកំណត់​ឱ្យប្រើ​ទិន្នន័យ​ទេ"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"គ្មាន​ទូរស័ព្ទ។"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 3841e3bec853..fd63dcb343ae 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"ಡೇಟಾ ಬಳಸಲು ಹೊಂದಿಸಲಾಗಿಲ್ಲ"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"ಯಾವುದೇ ಫೋನ್ ಇಲ್ಲ."</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 75b731b18fdd..a9c3f316f4c2 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G 이상"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"모바일 데이터 꺼짐"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"데이터를 사용하도록 설정되지 않음"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"휴대전화의 신호가 없습니다."</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 115937677c2d..bc3656f0846f 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мобилдик Интернет өчүрүлгөн"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Дайындарды колдонуу үчүн жөндөлгөн эмес"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Телефон сигналы жок."</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 3e3f3176d423..8408c93459a6 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"ປິດອິນເຕີເນັດມືຖືແລ້ວ"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"ບໍ່ໄດ້ຕັ້ງໃຫ້ໃຊ້ອິນເຕີເນັດ"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"ບໍ່ມີໂທລະສັບ."</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 279980be8c77..1dcfcf7bbb36 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -578,8 +578,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobiliojo ryšio duomenys išjungti"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nenustatyta naudoti duomenis"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Nėra telefono."</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index f36adc6b7bb1..3d9b78acf6ed 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -577,8 +577,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobilie dati izslēgti"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nav iestatīts datu lietošanai"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Nav tālruņa."</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 31e5b7c9f275..0674f118c04b 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Wi-Fi на операторот"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мобилниот интернет е исклучен"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Не е поставен да користи интернет"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Нема сигнал."</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 6ce0a7dee163..f13cb0b03884 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мобайл дата унтраалттай байна"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Дата ашиглахаар тохируулаагүй"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Утас байхгүй."</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index c1a246f2dd74..f5be76ebd228 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -168,7 +168,7 @@
<string name="tts_play_example_summary" msgid="634044730710636383">"उच्चार संश्लेषणाचे एक छोटेसे प्रात्यक्षिक प्ले करा"</string>
<string name="tts_install_data_title" msgid="1829942496472751703">"व्हॉइस डेटा इंस्टॉल करा"</string>
<string name="tts_install_data_summary" msgid="3608874324992243851">"उच्चार संश्लेषणासाठी आवश्यक आवाज डेटा इंस्टॉल करा"</string>
- <string name="tts_engine_security_warning" msgid="3372432853837988146">"हे उच्चार संश्लेषण इंजिन पासवर्ड आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक मजकुरासह, बोलला जाणारा सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. हे <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> इंजिनवरून येते. या उच्चार संश्लेषण इंजिनचा वापर सक्षम करायचा?"</string>
+ <string name="tts_engine_security_warning" msgid="3372432853837988146">"हे उच्चार संश्लेषण इंजीन पासवर्ड आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक मजकुरासह, बोलला जाणारा सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. हे <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> इंजीनवरून येते. या उच्चार संश्लेषण इंजीनचा वापर सक्षम करायचा?"</string>
<string name="tts_engine_network_required" msgid="8722087649733906851">"या भाषेस टेक्‍स्‍ट टू स्‍पीचसाठी एका नेटवर्क कनेक्शनची आवश्यकता आहे."</string>
<string name="tts_default_sample_string" msgid="6388016028292967973">"हे उच्चार संश्लेषणाचे एक उदाहरण आहे"</string>
<string name="tts_status_title" msgid="8190784181389278640">"डीफॉल्ट भाषा स्थिती"</string>
@@ -177,8 +177,8 @@
<string name="tts_status_not_supported" msgid="2702997696245523743">"<xliff:g id="LOCALE">%1$s</xliff:g> समर्थित नाही"</string>
<string name="tts_status_checking" msgid="8026559918948285013">"तपासत आहे..."</string>
<string name="tts_engine_settings_title" msgid="7849477533103566291">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g> साठी सेटिंग्ज"</string>
- <string name="tts_engine_settings_button" msgid="477155276199968948">"इंजिन सेटिंग्ज लाँच करा"</string>
- <string name="tts_engine_preference_section_title" msgid="3861562305498624904">"प्राधान्य इंजिन"</string>
+ <string name="tts_engine_settings_button" msgid="477155276199968948">"इंजीन सेटिंग्ज लाँच करा"</string>
+ <string name="tts_engine_preference_section_title" msgid="3861562305498624904">"प्राधान्य इंजीन"</string>
<string name="tts_general_section_title" msgid="8919671529502364567">"सामान्य"</string>
<string name="tts_reset_speech_pitch_title" msgid="7149398585468413246">"उच्चार पिच रीसेट करा"</string>
<string name="tts_reset_speech_pitch_summary" msgid="6822904157021406449">"डीफॉल्टवर मजकूर ज्या पिचवर बोलला जातो तो रीसेट करा."</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 61374e8b25ba..1dcb3cfd349d 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"မိုဘိုင်းဒေတာ ပိတ်ထားသည်"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"ဒေတာအသုံးပြုရန် သတ်မှတ်မထားပါ"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"ဖုန်းလိုင်းမရှိပါ။"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index fe6204bdd434..13f69c1b793e 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobildata er slått av"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Ikke konfigurert til å bruke data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Ingen telefon."</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index b7ea8a09c6e4..718ce5de62f8 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobiele data uit"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Gebruik van gegevens is niet ingesteld"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Geen telefoonsignaal."</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index fc26f5906309..f24b52bb409c 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Dados móveis desativados"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Sem configuração para uso de dados"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Sem telefone."</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 7ff1ba4a9f92..42ad0fece020 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"WFO"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Dados móveis desativados"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Não definido para utilizar dados"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Sem telefone."</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index fc26f5906309..f24b52bb409c 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Dados móveis desativados"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Sem configuração para uso de dados"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Sem telefone."</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index be0193ce9a1e..0743fe99056c 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -577,8 +577,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Rețeaua Wi‑Fi a operatorului"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Date mobile dezactivate"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nu este setat pentru a folosi datele"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Nu există semnal pentru telefon."</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index fad3591d7b36..d19438aceb16 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -578,8 +578,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мобильный Интернет отключен"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Мобильный Интернет по умолчанию не используется."</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Сигнал телефонной сети отсутствует."</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 69a918a898be..15fe8c8370e8 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"ජංගම දත්ත ක්‍රියාවිරහිතයි"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"දත්ත භාවිත කිරීමට සකසා නැත"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"දුරකථනයක් නැත."</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index f98237c27537..ee53b7cfbcec 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -578,8 +578,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Wi‑Fi operátora"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobilné dáta sú vypnuté"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Nie je nastavené na používanie dát"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Žiadna telefónna sieť."</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 710fbdb14901..66d33a7bf51a 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -578,8 +578,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Omrežje Wi‑Fi operaterja"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Prenos podatkov v mobilnem omrežju je izklopljen"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Ni nastavljeno za uporabo prenosa podatkov"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Ni telefona."</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index d134f8ad5c3e..ce74b84aa1e4 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -577,8 +577,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"WiFi мобилног оператера"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мобилни подаци су искључени"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Није подешено за коришћење података"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Нема телефона."</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index e90a915c81b3..eacb7a80cdb8 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Operatörens Wi-Fi"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobildata har inaktiverats"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Inte inställd på mobildata"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Ingen telefon."</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 653beef22c5c..e7045a72b51b 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Umezima data ya mtandao wa simu"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Haijawekewa mipangilio ya kutumia data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Hakuna simu"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index b75818a873b0..06c7ccb98120 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"மொபைல் டேட்டா ஆஃப் செய்யப்பட்டது"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"தரவை உபயோகிக்க அமைக்கப்படவில்லை"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"சிக்னல் இல்லை."</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index a010c1072884..6316452511b4 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"เน็ตมือถือปิดอยู่"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"ไม่ได้ตั้งค่าให้ใช้อินเทอร์เน็ตมือถือ"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"ไม่มีสัญญาณโทรศัพท์"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 4485384d8880..0aabbe5f96ab 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Naka-off ang mobile data"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Hindi nakatakdang gumamit ng data"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Walang telepono."</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 081a11515bd0..44c8f13acb96 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobil veri kapalı"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Veri kullanmak üzere ayarlanmadı"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Telefon sinyali yok."</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index b4e533d39f3a..7851111910d2 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -578,8 +578,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"Мережа Wi-Fi оператора"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Мобільне передавання даних вимкнено"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Не вибрано для використання даних"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Немає сигналу телефону."</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 4787aeb90a7c..c2a96c6a810e 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Mobil internet yoqilmagan"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Maʼlumotlardan foydalanish uchun sozlanmagan"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Signal yo‘q."</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index df975b316b8a..259642466187 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Đã tắt dữ liệu di động"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Chưa được đặt để sử dụng dữ liệu"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Không có điện thoại nào."</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index e1b6047793d1..60afd6d8352f 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"移动数据网络已关闭"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"未设置为使用移动数据"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"没有手机信号。"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index e095afd2f3f7..925f73870ea3 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"流動網絡供應商 Wi-Fi"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"流動數據已關閉"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"未設定至可使用資料"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"沒有電話訊號。"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index a1dc7f1515b7..e40d3519788d 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"行動數據已關閉"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"並未設為使用行動數據"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"沒有電話訊號。"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index a04f47cfc629..c304c14f6073 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -576,8 +576,7 @@
<string name="data_connection_4g_plus" msgid="5194902328408751020">"4G+"</string>
<string name="data_connection_lte" msgid="7675461204366364124">"I-LTE"</string>
<string name="data_connection_lte_plus" msgid="6643158654804916653">"I-LTE+"</string>
- <!-- no translation found for data_connection_carrier_wifi (2250268321065848954) -->
- <skip />
+ <string name="data_connection_carrier_wifi" msgid="2250268321065848954">"I-CWF"</string>
<string name="cell_data_off_content_description" msgid="2280700839891636498">"Idatha yeselula ivaliwe"</string>
<string name="not_default_data_content_description" msgid="6517068332106592887">"Akusethiwe ukuze kusetshenziswe idatha"</string>
<string name="accessibility_no_phone" msgid="2687419663127582503">"Ayikho ifoni."</string>
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 53e67e153c74..fbc71f100b40 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -264,7 +264,6 @@ public class SecureSettingsValidators {
VALIDATORS.put(Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.EMERGENCY_GESTURE_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.EMERGENCY_GESTURE_SOUND_ENABLED, BOOLEAN_VALIDATOR);
- VALIDATORS.put(Secure.EMERGENCY_GESTURE_CALL_NUMBER, NONE_NEGATIVE_LONG_VALIDATOR);
VALIDATORS.put(Secure.ADAPTIVE_CONNECTIVITY_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(
Secure.ASSIST_HANDLES_LEARNING_TIME_ELAPSED_MILLIS, NONE_NEGATIVE_LONG_VALIDATOR);
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index e22f2649d540..07a5a4455f27 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -742,7 +742,6 @@ public class SettingsBackupTest {
Settings.Secure.SKIP_GESTURE,
Settings.Secure.SILENCE_GESTURE,
Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE,
- Settings.Secure.EMERGENCY_GESTURE_CALL_NUMBER,
Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE,
Settings.Secure.FACE_UNLOCK_RE_ENROLL,
Settings.Secure.TAP_GESTURE,
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index a1bb66ea640a..72997845f11c 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -383,6 +383,9 @@
<!-- Permission required for CTS tests to enable/disable rate limiting toasts. -->
<uses-permission android:name="android.permission.MANAGE_TOAST_RATE_LIMITING" />
+ <!-- Permission required for CTS to test sensor privacy behavior -->
+ <uses-permission android:name="android.permission.MANAGE_SENSOR_PRIVACY" />
+
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/SystemUI/res/layout/people_space_small_avatar_tile.xml b/packages/SystemUI/res/layout/people_space_small_avatar_tile.xml
index 5aa05334539b..03589d34efd2 100644
--- a/packages/SystemUI/res/layout/people_space_small_avatar_tile.xml
+++ b/packages/SystemUI/res/layout/people_space_small_avatar_tile.xml
@@ -168,6 +168,7 @@
</LinearLayout>
</LinearLayout>
<LinearLayout
+ android:id="@+id/content_background"
android:background="@drawable/people_space_content_background"
android:layout_gravity="center"
android:layout_width="match_parent"
@@ -187,7 +188,8 @@
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:visibility="gone"/>
+ android:visibility="gone"
+ android:scaleType="centerCrop"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 0beb286b6f63..317e0e89118b 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nuwe gebruiker"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nie gekoppel nie"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Geen netwerk nie"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi af"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index f56e84ae1606..b7b24db814b4 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"አዲስ ተጠቃሚ"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"በይነመረብ"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"አልተገናኘም"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ምንም አውታረ መረብ የለም"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi ጠፍቷል"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index aaaf7788c5c3..ca823eda6e60 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -358,6 +358,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"مستخدم جديد"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"الإنترنت"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ليست متصلة"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"لا تتوفر شبكة"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"‏إيقاف Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 7e3e3cb04280..8e6fd519f05f 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -353,7 +353,12 @@
<string name="quick_settings_user_title" msgid="8673045967216204537">"ব্যৱহাৰকাৰী"</string>
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"নতুন ব্যৱহাৰকাৰী"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"ৱাই-ফাই"</string>
- <!-- no translation found for quick_settings_internet_label (6603068555872455463) -->
+ <string name="quick_settings_internet_label" msgid="6603068555872455463">"ইণ্টাৰনেট"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
<skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"সংযোগ হৈ থকা নাই"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"নেটৱৰ্ক নাই"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 6c22cc34b83e..d9a2ae17f1b4 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Yeni istifadəçi"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"İnternet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Bağlantı yoxdur"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Şəbəkə yoxdur"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi sönülüdür"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 2f3d6d28526e..ef3a1cf27515 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -355,6 +355,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Novi korisnik"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"WiFi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Veza nije uspostavljena"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nema mreže"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"WiFi je isključen"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 925e86a8916b..a1804d12ab76 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Новы карыстальнік"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Інтэрнэт"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Няма падключэння"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Няма сеткi"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi адключаны"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 6a683c742931..6b59b2484f6f 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Нов потребител"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Интернет"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Няма връзка"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Няма мрежа"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi е изключен"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 953ec006016b..a6344d0c45b0 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"নতুন ব্যবহারকারী"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"ওয়াই-ফাই"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"ইন্টারনেট"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"সংযুক্ত নয়"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"কোনো নেটওয়ার্ক নেই"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"ওয়াই-ফাই বন্ধ"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 6bf185230602..0dc97fabeae1 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -355,6 +355,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Novi korisnik"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"WiFi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nije povezano"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nema mreže"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"WiFi je isključen"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 71105cc55b50..bd5815a6c675 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Usuari nou"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Desconnectat"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"No hi ha cap xarxa"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi desconnectada"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 65e676737ca2..41a33ef0d51b 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nový uživatel"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nepřipojeno"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Žádná síť"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi vypnuta"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index e50aa57e70cb..3d8b027396dc 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Ny bruger"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Ikke forbundet"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Intet netværk"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi slået fra"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 3cdebf9c80d9..a0e535fb4ca2 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Neuer Nutzer"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"WLAN"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nicht verbunden"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Kein Netz"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"WLAN aus"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index c6ae7f4b0c51..13dafa019f72 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Νέος χρήστης"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Διαδίκτυο"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Μη συνδεδεμένο"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Κανένα δίκτυο"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi ανενεργό"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index ea25ec6e771c..dcee89d5ef4b 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"New user"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Not Connected"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"No Network"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Off"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index a373a5c0061d..3217d1c058ad 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"New user"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Not Connected"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"No Network"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Off"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index ea25ec6e771c..dcee89d5ef4b 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"New user"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Not Connected"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"No Network"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Off"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index ea25ec6e771c..dcee89d5ef4b 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"New user"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Not Connected"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"No Network"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Off"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 101d11245ffc..00fa58477291 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎New user‎‏‎‎‏‎"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎‎Wi-Fi‎‏‎‎‏‎"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎Internet‎‏‎‎‏‎"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎Not Connected‎‏‎‎‏‎"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎No Network‎‏‎‎‏‎"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎Wi-Fi Off‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 1fc1609c7dcc..a552c7647333 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Usuario nuevo"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Sin conexión"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Sin red"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi desactivada"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index dd36a64812ab..4277c6316922 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nuevo usuario"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"No conectado"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"No hay red."</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi desactivado"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index fb27be994265..64299318c819 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Uus kasutaja"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"WiFi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Ühendus puudub"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Võrku pole"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"WiFi-ühendus on väljas"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index d8b21c633dfa..664ae9816066 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Erabiltzaile berria"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wifia"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Konektatu gabe"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Ez dago sarerik"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi konexioa desaktibatuta"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index df306f83e16e..578fe887619d 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"کاربر جدید"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"اینترنت"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"متصل نیست"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"شبکه‌ای موجود نیست"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"‏Wi-Fi خاموش است"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 4e0af373f572..d73b2eb7b1ac 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Uusi käyttäjä"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Ei yhteyttä"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Ei verkkoa"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi-yhteys pois käytöstä"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 8c944a4a0e0f..df0e36c7d364 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nouvel utilisateur"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Non connecté"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Aucun réseau"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi désactivé"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 7ad239dc4ee2..64a232874f42 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nouvel utilisateur"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Non connecté"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Aucun réseau"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi désactivé"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 145b3c06b387..75db845b2e0f 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Novo usuario"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wifi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Non conectada"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Non hai rede"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wifi desactivada"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index ea7af17dcb6a..c0d2557a45a6 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"નવો વપરાશકર્તા"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"વાઇ-ફાઇ"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"ઇન્ટરનેટ"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"કનેક્ટ થયેલ નથી"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"કોઈ નેટવર્ક નથી"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"વાઇ-ફાઇ બંધ"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index a8bed5b26401..0bfa5aef27c6 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"नया उपयोगकर्ता"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"वाई-फ़ाई"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"इंटरनेट"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"कनेक्ट नहीं है"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"कोई नेटवर्क नहीं"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"वाई-फ़ाई बंद"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 4ffa5b2e04ff..33d0534d47c6 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -355,6 +355,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Novi korisnik"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nije povezano"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nema mreže"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi isključen"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index cff5b0dc65b3..22b8fde2ff51 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Új felhasználó"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nincs kapcsolat"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nincs hálózat"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi kikapcsolva"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 91ffe7308a91..5e51c627f88b 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Նոր օգտատեր"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Ինտերնետ"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Միացված չէ"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Ցանց չկա"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi-ը անջատված է"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index f9e7397993dc..9a217ce0c966 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Pengguna baru"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Tidak Terhubung"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Tidak Ada Jaringan"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Mati"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index db5dac43a42a..3f8e8fb68c06 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nýr notandi"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Engin tenging"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Ekkert net"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Slökkt á Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 86e65bbc3629..72cc5aadefd1 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nuovo utente"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Non connessa"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nessuna rete"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi disattivato"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 8548dae09ee2..d8c148aada43 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"משתמש חדש"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"אינטרנט"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"אין חיבור"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"אין רשת"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"‏Wi-Fi כבוי"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 6cd560854960..40a93231f3a1 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"新しいユーザー"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"インターネット"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"接続されていません"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ネットワークなし"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi OFF"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 52d9f0e77451..6ab551015704 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"ახალი მომხმარებელი"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"ინტერნეტი"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"არ არის დაკავშირებული."</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ქსელი არ არის"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi გამორთულია"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index fcf87434ad3b..bda2f1a6b6c4 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Жаңа пайдаланушы"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Интернет"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Жалғанбаған"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Желі жоқ"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi өшірулі"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index e92bf9bda905..275a73a59155 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"អ្នកប្រើ​ថ្មី"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"អ៊ីនធឺណិត"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"មិន​បាន​តភ្ជាប់"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"គ្មាន​បណ្ដាញ"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"វ៉ាយហ្វាយ​បានបិទ"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index d7a0adc85935..778ccca0c8cf 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"ಹೊಸ ಬಳಕೆದಾರರು"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"ವೈ-ಫೈ"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"ಇಂಟರ್ನೆಟ್"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ಸಂಪರ್ಕಗೊಂಡಿಲ್ಲ"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ನೆಟ್‌ವರ್ಕ್ ಇಲ್ಲ"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"ವೈ-ಫೈ ಆಫ್"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 54bcfb978ac9..e602ede4e1ad 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"신규 사용자"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"인터넷"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"연결되어 있지 않음"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"네트워크가 연결되지 않음"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi 꺼짐"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index d513380f9355..0a2e8aeb9e02 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Жаңы колдонуучу"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Интернет"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Байланышкан жок"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Желе жок"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi өчүк"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 7e595cd83176..0f320a50b88b 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"ຜູ່ໃຊ້ໃໝ່"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi​-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"ອິນເຕີເນັດ"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ບໍ່ໄດ້ເຊື່ອມຕໍ່"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ບໍ່ມີເຄືອຂ່າຍ"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi​-Fi ປິດ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index e0c27a96de44..29f615eb022b 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Naujas naudotojas"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internetas"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Neprisijungta"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Tinklo nėra"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"„Wi-Fi“ išjungta"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index ff36f51b5603..f209ba836e0a 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -355,6 +355,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Jauns lietotājs"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internets"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nav izveidots savienojums"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nav tīkla"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi ir izslēgts"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 203d8b90ae52..001e6a0514a9 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Нов корисник"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Интернет"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Не е поврзано"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Нема мрежа"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi е исклучено"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 77925ae0c268..e2ca3bbc61c7 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"പുതിയ ഉപയോക്താവ്"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"വൈഫൈ"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"ഇന്റർനെറ്റ്"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"കണ‌ക്റ്റ് ചെയ്‌തിട്ടില്ല"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"നെറ്റ്‌വർക്ക് ഒന്നുമില്ല"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"വൈഫൈ ഓഫുചെയ്യുക"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index c772294a6bdf..0b1a1ff35120 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Шинэ хэрэглэгч"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Интернэт"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Холбогдоогүй"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Сүлжээгүй"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi унтарсан"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 965b8958b458..9ed6bb345c6d 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -353,7 +353,12 @@
<string name="quick_settings_user_title" msgid="8673045967216204537">"वापरकर्ता"</string>
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"नवीन वापरकर्ता"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"वाय-फाय"</string>
- <!-- no translation found for quick_settings_internet_label (6603068555872455463) -->
+ <string name="quick_settings_internet_label" msgid="6603068555872455463">"इंटरनेट"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
<skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"कनेक्ट केले नाही"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"नेटवर्क नाही"</string>
@@ -456,11 +461,9 @@
<string name="accessibility_multi_user_switch_quick_contact" msgid="4504508915324898576">"प्रोफाईल दर्शवा"</string>
<string name="user_add_user" msgid="4336657383006913022">"वापरकर्ता जोडा"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"नवीन वापरकर्ता"</string>
- <!-- no translation found for guest_exit_guest_dialog_title (2034481024623462357) -->
- <skip />
+ <string name="guest_exit_guest_dialog_title" msgid="2034481024623462357">"अतिथी सत्र संपायचे का?"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"या सत्रातील सर्व अ‍ॅप्स आणि डेटा हटवला जाईल."</string>
- <!-- no translation found for guest_exit_guest_dialog_remove (8533184512885775423) -->
- <skip />
+ <string name="guest_exit_guest_dialog_remove" msgid="8533184512885775423">"सत्र संपवा"</string>
<string name="guest_wipe_session_title" msgid="7147965814683990944">"अतिथी, तुमचे पुन्‍हा स्‍वागत आहे!"</string>
<string name="guest_wipe_session_message" msgid="3393823610257065457">"तुम्ही तुमचे सत्र सुरू ठेवू इच्छिता?"</string>
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"येथून सुरू करा"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index d3e360147d0f..81c15b066290 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Pengguna baharu"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Tidak Disambungkan"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Tiada Rangkaian"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Dimatikan"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 0c1f9cbbc060..6bccb33550ad 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"အသုံးပြုသူ အသစ်"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"အင်တာနက်"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ချိတ်ဆက်မထားပါ"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ကွန်ရက်မရှိပါ"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"ဝိုင်ဖိုင်ပိတ်ရန်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 565e7fea215d..90defaa3561d 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Ny bruker"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internett"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Ikke tilkoblet"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Ingen nettverk"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi er av"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 9d95cf042dad..0e86b94d58de 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"नयाँ प्रयोगकर्ता"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"इन्टरनेट"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"जोडिएको छैन"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"नेटवर्क छैन"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi बन्द"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index f598fa3fae09..a216c499844c 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nieuwe gebruiker"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wifi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Niet verbonden"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Geen netwerk"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wifi uit"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 1e07dd4b785e..ed38d141cb04 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -353,7 +353,12 @@
<string name="quick_settings_user_title" msgid="8673045967216204537">"ୟୁଜର୍‌"</string>
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"ୱାଇ-ଫାଇ"</string>
- <!-- no translation found for quick_settings_internet_label (6603068555872455463) -->
+ <string name="quick_settings_internet_label" msgid="6603068555872455463">"ଇଣ୍ଟରନେଟ୍"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
<skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ନେଟ୍‌ୱର୍କ ନାହିଁ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 7d5bc96830a5..3026a18cdde5 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -353,7 +353,12 @@
<string name="quick_settings_user_title" msgid="8673045967216204537">"ਵਰਤੋਂਕਾਰ"</string>
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"ਵਾਈ-ਫਾਈ"</string>
- <!-- no translation found for quick_settings_internet_label (6603068555872455463) -->
+ <string name="quick_settings_internet_label" msgid="6603068555872455463">"ਇੰਟਰਨੈੱਟ"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
<skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ਕੋਈ ਨੈੱਟਵਰਕ ਨਹੀਂ"</string>
@@ -456,11 +461,9 @@
<string name="accessibility_multi_user_switch_quick_contact" msgid="4504508915324898576">"ਪ੍ਰੋਫਾਈਲ ਦਿਖਾਓ"</string>
<string name="user_add_user" msgid="4336657383006913022">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
- <!-- no translation found for guest_exit_guest_dialog_title (2034481024623462357) -->
- <skip />
+ <string name="guest_exit_guest_dialog_title" msgid="2034481024623462357">"ਕੀ ਮਹਿਮਾਨ ਸੈਸ਼ਨ ਸਮਾਪਤ ਕਰਨਾ ਹੈ?"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ਇਸ ਸੈਸ਼ਨ ਵਿੱਚ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string>
- <!-- no translation found for guest_exit_guest_dialog_remove (8533184512885775423) -->
- <skip />
+ <string name="guest_exit_guest_dialog_remove" msgid="8533184512885775423">"ਸੈਸ਼ਨ ਸਮਾਪਤ ਕਰੋ"</string>
<string name="guest_wipe_session_title" msgid="7147965814683990944">"ਮਹਿਮਾਨ, ਫਿਰ ਤੁਹਾਡਾ ਸੁਆਗਤ ਹੈ!"</string>
<string name="guest_wipe_session_message" msgid="3393823610257065457">"ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਸੈਸ਼ਨ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"ਸ਼ੁਰੂ ਕਰੋ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 561e70dd14cb..12422e9851d7 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nowy użytkownik"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Brak połączenia"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Brak sieci"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi wyłączone"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 7fe53d348e15..0d65c0130c6e 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Novo usuário"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Não conectado"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Sem rede"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi desligado"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index dd154e8ad684..0932a96819a8 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Novo utilizador"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Não Ligado"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Sem Rede"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Desligado"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 7fe53d348e15..0d65c0130c6e 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Novo usuário"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Não conectado"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Sem rede"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi desligado"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 317fc098d522..e1819451aba5 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -355,6 +355,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Utilizator nou"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Neconectată"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nicio rețea"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi deconectat"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index bbb014e82b07..5d08e3a79f62 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Новый пользователь"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Интернет"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Нет соединения"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Нет сети"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi выкл."</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index a7a2bb7dbbff..7230a06f5eba 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"නව පරිශීලකයා"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"අන්තර්ජාලය"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"සම්බන්ධ වී නොමැත"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ජාලයක් නැත"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi අක්‍රියයි"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 7eb5297a43f1..1454884e14da 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nový používateľ"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi‑Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nepripojené"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Žiadna sieť"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Sieť Wi‑Fi je vypnutá"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 6d23f26a6c8d..2cecff72906a 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nov uporabnik"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Povezava ni vzpostavljena"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Ni omrežja"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi izklopljen"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 7e89b93cec82..3179e99e9b8f 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Përdorues i ri"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Nuk është i lidhur"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nuk ka rrjet"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi është i çaktivizuar"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index af5175c2bbf6..ea862bc6061c 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -355,6 +355,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Нови корисник"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"WiFi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Интернет"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Веза није успостављена"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Нема мреже"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"WiFi је искључен"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 41bca7c90b32..66685e9dda2b 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Ny användare"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Ej ansluten"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Inget nätverk"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi av"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index f122013cc150..1563c768ef16 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Mtumiaji mpya"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Intaneti"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Haijaunganishwa"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Hakuna Mtandao"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Imezimwa"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index c076a031b93f..a54b1a26d75c 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"புதியவர்"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"வைஃபை"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"இணையம்"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"இணைக்கப்படவில்லை"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"நெட்வொர்க் இல்லை"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"வைஃபையை முடக்கு"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index fca51077d06f..01c3d7d15549 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"కొత్త వినియోగదారు"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"ఇంటర్నెట్"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"కనెక్ట్ చేయబడలేదు"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"నెట్‌వర్క్ లేదు"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi ఆఫ్‌లో ఉంది"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index c909d379dedc..e51c3082d095 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"ผู้ใช้ใหม่"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"อินเทอร์เน็ต"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ไม่ได้เชื่อมต่อ"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ไม่มีเครือข่าย"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"ปิด WiFi"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 2e75fa3de905..7b8070b2e102 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Bagong user"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Hindi Nakakonekta"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Walang Network"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Naka-off ang Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 98552b1b135d..f9e78c7bcdac 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Yeni kullanıcı"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Kablosuz"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"İnternet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Bağlı Değil"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Ağ yok"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Kablosuz Kapalı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index b70d36af64c2..72046e1c2eb7 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -356,6 +356,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Новий користувач"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Інтернет"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Не під’єднано."</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Немає мережі"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi вимкнено"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index bbadf6a7d5f1..9ccc133093f1 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"نیا صارف"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"انٹرنیٹ"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"مربوط نہیں ہے"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"کوئی نیٹ ورک نہیں ہے"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"‏Wi-Fi آف ہے"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index a20676dca577..67d801b4096e 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Yangi foydalanuvchi"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Ulanmagan"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Tarmoq mavjud emas"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi o‘chiq"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 5de7df6a5d69..1d836e897f60 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Người dùng mới"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Chưa được kết nối"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Không có mạng nào"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Tắt Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 7f3f3943e3c5..fa6a5109fbc5 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -63,9 +63,9 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"允许"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"不允许使用 USB 调试功能"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。"</string>
- <string name="wifi_debugging_title" msgid="7300007687492186076">"要允许在此网络上进行无线调试吗?"</string>
+ <string name="wifi_debugging_title" msgid="7300007687492186076">"要允许通过此网络上进行无线调试吗?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"网络名称 (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWLAN 地址 (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
- <string name="wifi_debugging_always" msgid="2968383799517975155">"在此网络上始终允许"</string>
+ <string name="wifi_debugging_always" msgid="2968383799517975155">"始终允许通过此网络进行调试"</string>
<string name="wifi_debugging_allow" msgid="4573224609684957886">"允许"</string>
<string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"不允许使用无线调试功能"</string>
<string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"目前已登录此设备的用户无法开启无线调试功能。要使用此功能,请切换为主要用户的帐号。"</string>
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"新用户"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"WLAN"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"互联网"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"未连接"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"无网络"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"WLAN:关闭"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 485f1cf786be..b69d09796aae 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"新使用者"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"互聯網"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"未連線"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"沒有網絡"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi 關閉"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 1edeacd1a843..2fb0b865625f 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"新使用者"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"網際網路"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"未連線"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"沒有網路"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi 已關閉"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 58baebc27cc6..e9e1a75c7fa4 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -354,6 +354,12 @@
<string name="quick_settings_user_new_user" msgid="3347905871336069666">"Umsebenzisi omusha"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"I-Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"I-inthanethi"</string>
+ <!-- no translation found for quick_settings_airplane_safe_label (2665758539772645899) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_available (1875138606855420438) -->
+ <skip />
+ <!-- no translation found for quick_settings_networks_unavailable (1167847013337940082) -->
+ <skip />
<string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Akuxhunyiwe"</string>
<string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Ayikho inethiwekhi"</string>
<string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"I-Wi-Fi icimile"</string>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
index 364403234e29..937c1df10315 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
@@ -92,6 +92,8 @@ public class QuickStepContract {
public static final int SYSUI_STATE_ONE_HANDED_ACTIVE = 1 << 16;
// Allow system gesture no matter the system bar(s) is visible or not
public static final int SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY = 1 << 17;
+ // The IME is showing
+ public static final int SYSUI_STATE_IME_SHOWING = 1 << 18;
@Retention(RetentionPolicy.SOURCE)
@IntDef({SYSUI_STATE_SCREEN_PINNING,
@@ -111,7 +113,8 @@ public class QuickStepContract {
SYSUI_STATE_BUBBLES_EXPANDED,
SYSUI_STATE_GLOBAL_ACTIONS_SHOWING,
SYSUI_STATE_ONE_HANDED_ACTIVE,
- SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY
+ SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY,
+ SYSUI_STATE_IME_SHOWING
})
public @interface SystemUiStateFlags {}
@@ -138,6 +141,7 @@ public class QuickStepContract {
str.add((flags & SYSUI_STATE_ONE_HANDED_ACTIVE) != 0 ? "one_handed_active" : "");
str.add((flags & SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY) != 0
? "allow_gesture" : "");
+ str.add((flags & SYSUI_STATE_IME_SHOWING) != 0 ? "ime_visible" : "");
return str.toString();
}
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
index 302a2620aac0..59e81cf96bb2 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
@@ -85,8 +85,8 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
}
private void initColors() {
- mLockScreenColors[0] = Utils.getColorAttr(getContext(),
- android.R.attr.textColorPrimary).getDefaultColor();
+ mLockScreenColors[0] = Utils.getColorAttrDefaultColor(getContext(),
+ com.android.systemui.R.attr.wallpaperTextColor);
mLockScreenColors[1] = mLockScreenColors[0]; // same color
mView.setColors(mDozingColors, mLockScreenColors);
mView.animateDoze(mIsDozing, false);
diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
index eea168ad16b3..39cbc90fba2d 100644
--- a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
+++ b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
@@ -26,9 +26,9 @@ import android.os.Looper
import android.os.Message
import android.os.UserHandle
import android.text.TextUtils
+import android.util.IndentingPrintWriter
import android.util.SparseArray
import com.android.internal.annotations.VisibleForTesting
-import com.android.internal.util.IndentingPrintWriter
import com.android.systemui.Dumpable
import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger
import com.android.systemui.dump.DumpManager
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 5d184efaa59e..a23b07c5d685 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -37,6 +37,7 @@ import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BA
import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
@@ -817,6 +818,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mNavigationBarView.setNavigationIconHints(hints);
}
checkBarModes();
+ updateSystemUiStateFlags(-1);
}
@Override
@@ -1315,6 +1317,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mSysUiFlagsContainer.setFlag(SYSUI_STATE_A11Y_BUTTON_CLICKABLE, clickable)
.setFlag(SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE, longClickable)
.setFlag(SYSUI_STATE_NAV_BAR_HIDDEN, !isNavBarWindowVisible())
+ .setFlag(SYSUI_STATE_IME_SHOWING,
+ (mNavigationIconHints & NAVIGATION_HINT_BACK_ALT) != 0)
.commitUpdate(mDisplayId);
registerAction(clickable, SystemActions.SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON);
registerAction(longClickable, SystemActions.SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER);
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
index 065920c9778b..a8761a63f6ad 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
@@ -80,6 +80,7 @@ public class PeopleSpaceActivity extends Activity {
INVALID_APPWIDGET_ID);
mShowSingleConversation = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.PEOPLE_SPACE_CONVERSATION_TYPE, 0) == 0;
+ setResult(RESULT_CANCELED);
// Finish the configuration activity immediately if a widget is added for multiple
// conversations. If the mAppWidgetId is INVALID, then the activity wasn't launched as a
// widget configuration activity.
@@ -151,10 +152,14 @@ public class PeopleSpaceActivity extends Activity {
private void finishActivity() {
if (PeopleSpaceUtils.DEBUG) Log.d(TAG, "Widget added!");
mUiEventLogger.log(PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_ADDED);
+ setActivityResult(RESULT_OK);
+ finish();
+ }
+
+ private void setActivityResult(int result) {
Intent resultValue = new Intent();
resultValue.putExtra(EXTRA_APPWIDGET_ID, mAppWidgetId);
- setResult(RESULT_OK, resultValue);
- finish();
+ setResult(result, resultValue);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
index 67d53fcd7285..8669a817dfc2 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
@@ -294,6 +294,7 @@ public class PeopleSpaceUtils {
)
);
views.setImageViewIcon(R.id.person_icon, tile.getUserIcon());
+ views.setBoolean(R.id.content_background, "setClipToOutline", true);
Intent activityIntent = new Intent(context, LaunchConversationActivity.class);
activityIntent.addFlags(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt
index f758db8a6ba4..9d52fe50a7d6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt
@@ -19,11 +19,11 @@ package com.android.systemui.statusbar
import android.app.ActivityManager
import android.content.res.Resources
import android.os.SystemProperties
+import android.util.IndentingPrintWriter
import android.util.MathUtils
import android.view.SurfaceControl
import android.view.ViewRootImpl
import androidx.annotation.VisibleForTesting
-import com.android.internal.util.IndentingPrintWriter
import com.android.systemui.Dumpable
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
index 01aa53f14550..ead6d32f3a7f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
@@ -21,6 +21,7 @@ import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.app.WallpaperManager
import android.os.SystemClock
+import android.util.IndentingPrintWriter
import android.util.Log
import android.util.MathUtils
import android.view.Choreographer
@@ -29,7 +30,6 @@ import androidx.annotation.VisibleForTesting
import androidx.dynamicanimation.animation.FloatPropertyCompat
import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
-import com.android.internal.util.IndentingPrintWriter
import com.android.systemui.Dumpable
import com.android.systemui.Interpolators
import com.android.systemui.dagger.SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
index e43130f1698b..1a2550b81878 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
@@ -642,9 +642,8 @@ public class NotificationConversationInfo extends LinearLayout implements
BUBBLE_PREFERENCE_SELECTED);
}
if (mBubblesManagerOptional.isPresent()) {
- post(() -> {
- mBubblesManagerOptional.get().onUserChangedImportance(mEntry);
- });
+ post(() -> mBubblesManagerOptional.get()
+ .onUserSetImportantConversation(mEntry));
}
}
mChannelToUpdate.setImportance(Math.max(
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 194776e09725..5e716716301a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -129,7 +129,6 @@ import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
-import com.android.systemui.util.InjectionInflationController;
import com.android.wm.shell.animation.FlingAnimationUtils;
import java.io.FileDescriptor;
@@ -266,8 +265,7 @@ public class NotificationPanelViewController extends PanelViewController {
&& mAuthController.getUdfpsRegion() != null
&& mAuthController.isUdfpsEnrolled(
KeyguardUpdateMonitor.getCurrentUser())) {
- LayoutInflater.from(mView.getContext())
- .inflate(R.layout.disabled_udfps_view, mView);
+ mLayoutInflater.inflate(R.layout.disabled_udfps_view, mView);
mDisabledUdfpsController = new DisabledUdfpsController(
mView.findViewById(R.id.disabled_udfps_view),
mStatusBarStateController,
@@ -279,7 +277,7 @@ public class NotificationPanelViewController extends PanelViewController {
}
};
- private final InjectionInflationController mInjectionInflationController;
+ private final LayoutInflater mLayoutInflater;
private final PowerManager mPowerManager;
private final AccessibilityManager mAccessibilityManager;
private final NotificationWakeUpCoordinator mWakeUpCoordinator;
@@ -523,7 +521,7 @@ public class NotificationPanelViewController extends PanelViewController {
@Inject
public NotificationPanelViewController(NotificationPanelView view,
@Main Resources resources,
- InjectionInflationController injectionInflationController,
+ LayoutInflater layoutInflater,
NotificationWakeUpCoordinator coordinator, PulseExpansionHandler pulseExpansionHandler,
DynamicPrivacyController dynamicPrivacyController,
KeyguardBypassController bypassController, FalsingManager falsingManager,
@@ -568,7 +566,7 @@ public class NotificationPanelViewController extends PanelViewController {
mKeyguardStatusViewComponentFactory = keyguardStatusViewComponentFactory;
mQSDetailDisplayer = qsDetailDisplayer;
mView.setWillNotDraw(!DEBUG);
- mInjectionInflationController = injectionInflationController;
+ mLayoutInflater = layoutInflater;
mFalsingManager = falsingManager;
mFalsingCollector = falsingCollector;
mPowerManager = powerManager;
@@ -774,8 +772,7 @@ public class NotificationPanelViewController extends PanelViewController {
KeyguardStatusView keyguardStatusView = mView.findViewById(R.id.keyguard_status_view);
int index = mView.indexOfChild(keyguardStatusView);
mView.removeView(keyguardStatusView);
- keyguardStatusView = (KeyguardStatusView) mInjectionInflationController.injectable(
- LayoutInflater.from(mView.getContext())).inflate(
+ keyguardStatusView = (KeyguardStatusView) mLayoutInflater.inflate(
R.layout.keyguard_status_view, mView, false);
mView.addView(keyguardStatusView, index);
@@ -786,8 +783,7 @@ public class NotificationPanelViewController extends PanelViewController {
index = mView.indexOfChild(mKeyguardBottomArea);
mView.removeView(mKeyguardBottomArea);
KeyguardBottomAreaView oldBottomArea = mKeyguardBottomArea;
- mKeyguardBottomArea = (KeyguardBottomAreaView) mInjectionInflationController.injectable(
- LayoutInflater.from(mView.getContext())).inflate(
+ mKeyguardBottomArea = (KeyguardBottomAreaView) mLayoutInflater.inflate(
R.layout.keyguard_bottom_area, mView, false);
mKeyguardBottomArea.initFrom(oldBottomArea);
mView.addView(mKeyguardBottomArea, index);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index ab96a6d26dfd..f1b3cc5866a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -370,13 +370,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
if (mKeyguardUpdateMonitor.needsSlowUnlockTransition() && mState == ScrimState.UNLOCKED) {
mAnimationDelay = StatusBar.FADE_KEYGUARD_START_DELAY;
scheduleUpdate();
- } else if ((!mDozeParameters.getAlwaysOn() && oldState == ScrimState.AOD)
+ } else if ((oldState == ScrimState.AOD // leaving doze
+ && (!mDozeParameters.getAlwaysOn() || mState == ScrimState.UNLOCKED))
|| (mState == ScrimState.AOD && !mDozeParameters.getDisplayNeedsBlanking())) {
// Scheduling a frame isn't enough when:
// • Leaving doze and we need to modify scrim color immediately
// • ColorFade will not kick-in and scrim cannot wait for pre-draw.
onPreDraw();
} else {
+ // Schedule a frame
scheduleUpdate();
}
@@ -1003,7 +1005,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
}
private void updateThemeColors() {
- if (mScrimBehind == null) return;
int background = Utils.getColorAttr(mScrimBehind.getContext(),
android.R.attr.colorBackgroundFloating).getDefaultColor();
int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor();
diff --git a/packages/SystemUI/src/com/android/systemui/util/ConvenienceExtensions.kt b/packages/SystemUI/src/com/android/systemui/util/ConvenienceExtensions.kt
index ff53a9ff3b0a..57b3f53c48fe 100644
--- a/packages/SystemUI/src/com/android/systemui/util/ConvenienceExtensions.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/ConvenienceExtensions.kt
@@ -16,8 +16,8 @@
package com.android.systemui.util
+import android.util.IndentingPrintWriter
import android.view.ViewGroup
-import com.android.internal.util.IndentingPrintWriter
import java.io.PrintWriter
/** [Sequence] that yields all of the direct children of this [ViewGroup] */
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
index 844f12e0c43e..bf823b4b22b8 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
@@ -615,12 +615,16 @@ public class BubblesManager implements Dumpable {
}
/**
- * When a notification is marked Priority, expand the stack if needed,
- * then (maybe create and) select the given bubble.
+ * When a notification is set as important, make it a bubble and expand the stack if
+ * it can bubble.
*
- * @param entry the notification for the bubble to show
+ * @param entry the important notification.
*/
- public void onUserChangedImportance(NotificationEntry entry) {
+ public void onUserSetImportantConversation(NotificationEntry entry) {
+ if (entry.getBubbleMetadata() == null) {
+ // No bubble metadata, nothing to do.
+ return;
+ }
try {
int flags = Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
flags |= Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE;
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
index a44fcec69e6a..1b5877f9da66 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
@@ -19,6 +19,7 @@ package com.android.systemui.wmshell;
import static android.os.Process.THREAD_PRIORITY_DISPLAY;
import android.animation.AnimationHandler;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
import android.content.Context;
import android.content.pm.LauncherApps;
@@ -71,6 +72,7 @@ import com.android.wm.shell.pip.PipUiEventLogger;
import com.android.wm.shell.pip.phone.PipAppOpsListener;
import com.android.wm.shell.pip.phone.PipTouchHandler;
import com.android.wm.shell.splitscreen.SplitScreen;
+import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.transition.Transitions;
import java.util.Optional;
@@ -310,8 +312,18 @@ public abstract class WMShellBaseModule {
@BindsOptionalOf
abstract LegacySplitScreen optionalLegacySplitScreen();
- @BindsOptionalOf
- abstract SplitScreen optionalSplitScreen();
+ @WMSingleton
+ @Provides
+ static Optional<SplitScreen> provideSplitScreen(ShellTaskOrganizer shellTaskOrganizer,
+ SyncTransactionQueue syncQueue, Context context,
+ RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
+ if (ActivityTaskManager.supportsSplitScreenMultiWindow(context)) {
+ return Optional.of(new SplitScreenController(shellTaskOrganizer, syncQueue, context,
+ rootTaskDisplayAreaOrganizer));
+ } else {
+ return Optional.empty();
+ }
+ }
@BindsOptionalOf
abstract AppPairs optionalAppPairs();
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
index ee761691a97d..8105250f0ca0 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
@@ -17,6 +17,7 @@
package com.android.systemui.wmshell;
import android.animation.AnimationHandler;
+import android.app.ActivityTaskManager;
import android.content.Context;
import android.view.IWindowManager;
@@ -89,15 +90,6 @@ public class WMShellModule {
@WMSingleton
@Provides
- static SplitScreen provideSplitScreen(ShellTaskOrganizer shellTaskOrganizer,
- SyncTransactionQueue syncQueue, Context context,
- RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
- return new SplitScreenController(shellTaskOrganizer, syncQueue, context,
- rootTaskDisplayAreaOrganizer);
- }
-
- @WMSingleton
- @Provides
static AppPairs provideAppPairs(ShellTaskOrganizer shellTaskOrganizer,
SyncTransactionQueue syncQueue, DisplayController displayController,
@ShellMainThread ShellExecutor mainExecutor) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
index d452861c31c0..aa7143e6c549 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
@@ -40,6 +40,7 @@ import android.os.PowerManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.DisplayMetrics;
+import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -84,7 +85,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.util.InjectionInflationController;
import com.android.wm.shell.animation.FlingAnimationUtils;
import org.junit.Before;
@@ -139,7 +139,7 @@ public class NotificationPanelViewTest extends SysuiTestCase {
@Mock
private NotificationPanelView mView;
@Mock
- private InjectionInflationController mInjectionInflationController;
+ private LayoutInflater mLayoutInflater;
@Mock
private DynamicPrivacyController mDynamicPrivacyController;
@Mock
@@ -264,7 +264,7 @@ public class NotificationPanelViewTest extends SysuiTestCase {
.thenReturn(mKeyguardStatusViewController);
mNotificationPanelViewController = new NotificationPanelViewController(mView,
mResources,
- mInjectionInflationController,
+ mLayoutInflater,
coordinator, expansionHandler, mDynamicPrivacyController, mKeyguardBypassController,
new FalsingManagerFake(), new FalsingCollectorFake(), mShadeController,
mNotificationLockscreenUserManager, mNotificationEntryManager,
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 25f7fb673ce7..b587f1b2599d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -15320,10 +15320,10 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
@GuardedBy("this")
void tempWhitelistForPendingIntentLocked(int callerPid, int callerUid, int targetUid,
- long duration, String tag) {
+ long duration, int type, String tag) {
if (DEBUG_WHITELISTS) {
Slog.d(TAG, "tempWhitelistForPendingIntentLocked(" + callerPid + ", " + callerUid + ", "
- + targetUid + ", " + duration + ")");
+ + targetUid + ", " + duration + ", " + type + ")");
}
synchronized (mPidsSelfLocked) {
@@ -15335,7 +15335,11 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (!pr.whitelistManager) {
if (checkPermission(CHANGE_DEVICE_IDLE_TEMP_WHITELIST, callerPid, callerUid)
- != PackageManager.PERMISSION_GRANTED) {
+ != PackageManager.PERMISSION_GRANTED
+ && checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callerPid, callerUid)
+ != PackageManager.PERMISSION_GRANTED
+ && checkPermission(START_FOREGROUND_SERVICES_FROM_BACKGROUND, callerPid,
+ callerUid) != PackageManager.PERMISSION_GRANTED) {
if (DEBUG_WHITELISTS) {
Slog.d(TAG, "tempWhitelistForPendingIntentLocked() for target " + targetUid
+ ": pid " + callerPid + " is not allowed");
@@ -15345,8 +15349,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- tempWhitelistUidLocked(targetUid, duration, tag,
- BroadcastOptions.TEMPORARY_WHITELIST_TYPE_FOREGROUND_SERVICE_ALLOWED);
+ tempWhitelistUidLocked(targetUid, duration, tag, type);
}
/**
@@ -15949,9 +15952,9 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken,
- long duration) {
+ long duration, int type) {
mPendingIntentController.setPendingIntentWhitelistDuration(target, whitelistToken,
- duration);
+ duration, type);
}
@Override
@@ -16367,10 +16370,10 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid,
- long duration, String tag) {
+ long duration, int type, String tag) {
synchronized (ActivityManagerService.this) {
ActivityManagerService.this.tempWhitelistForPendingIntentLocked(
- callerPid, callerUid, targetUid, duration, tag);
+ callerPid, callerUid, targetUid, duration, type, tag);
}
}
diff --git a/services/core/java/com/android/server/am/PendingIntentController.java b/services/core/java/com/android/server/am/PendingIntentController.java
index 2ae3d355a7ed..42172bf7e1df 100644
--- a/services/core/java/com/android/server/am/PendingIntentController.java
+++ b/services/core/java/com/android/server/am/PendingIntentController.java
@@ -301,13 +301,14 @@ public class PendingIntentController {
}
void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken,
- long duration) {
+ long duration, int type) {
if (!(target instanceof PendingIntentRecord)) {
Slog.w(TAG, "markAsSentFromNotification(): not a PendingIntentRecord: " + target);
return;
}
synchronized (mLock) {
- ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration);
+ ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration,
+ type);
}
}
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index fbfed34d1bf0..631b6327e7ad 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -24,6 +24,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NA
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.app.BroadcastOptions;
import android.app.PendingIntent;
import android.content.IIntentReceiver;
import android.content.IIntentSender;
@@ -37,6 +38,7 @@ import android.os.TransactionTooLargeException;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.Pair;
import android.util.Slog;
import android.util.TimeUtils;
@@ -61,7 +63,11 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
public final WeakReference<PendingIntentRecord> ref;
boolean sent = false;
boolean canceled = false;
- private ArrayMap<IBinder, Long> whitelistDuration;
+ /**
+ * Map IBinder to duration specified as Pair<Long, Integer>, Long is allowlist duration in
+ * milliseconds, Integer is allowlist type defined at {@link BroadcastOptions.TempAllowListType}
+ */
+ private ArrayMap<IBinder, Pair<Long, Integer>> mWhitelistDuration;
private RemoteCallbackList<IResultReceiver> mCancelCallbacks;
private ArraySet<IBinder> mAllowBgActivityStartsForActivitySender = new ArraySet<>();
private ArraySet<IBinder> mAllowBgActivityStartsForBroadcastSender = new ArraySet<>();
@@ -215,16 +221,16 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
ref = new WeakReference<>(this);
}
- void setWhitelistDurationLocked(IBinder whitelistToken, long duration) {
+ void setWhitelistDurationLocked(IBinder whitelistToken, long duration, int type) {
if (duration > 0) {
- if (whitelistDuration == null) {
- whitelistDuration = new ArrayMap<>();
+ if (mWhitelistDuration == null) {
+ mWhitelistDuration = new ArrayMap<>();
}
- whitelistDuration.put(whitelistToken, duration);
- } else if (whitelistDuration != null) {
- whitelistDuration.remove(whitelistToken);
- if (whitelistDuration.size() <= 0) {
- whitelistDuration = null;
+ mWhitelistDuration.put(whitelistToken, new Pair(duration, type));
+ } else if (mWhitelistDuration != null) {
+ mWhitelistDuration.remove(whitelistToken);
+ if (mWhitelistDuration.size() <= 0) {
+ mWhitelistDuration = null;
}
}
@@ -292,7 +298,7 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
if (intent != null) intent.setDefusable(true);
if (options != null) options.setDefusable(true);
- Long duration = null;
+ Pair<Long, Integer> duration = null;
Intent finalIntent = null;
Intent[] allIntents = null;
String[] allResolvedTypes = null;
@@ -341,8 +347,8 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
mergedOptions.setCallerOptions(opts);
}
- if (whitelistDuration != null) {
- duration = whitelistDuration.get(whitelistToken);
+ if (mWhitelistDuration != null) {
+ duration = mWhitelistDuration.get(whitelistToken);
}
if (key.type == ActivityManager.INTENT_SENDER_ACTIVITY
@@ -370,24 +376,19 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
int res = START_SUCCESS;
try {
if (duration != null) {
- int procState = controller.mAmInternal.getUidProcessState(callingUid);
- if (!ActivityManager.isProcStateBackground(procState)) {
- StringBuilder tag = new StringBuilder(64);
- tag.append("pendingintent:");
- UserHandle.formatUid(tag, callingUid);
- tag.append(":");
- if (finalIntent.getAction() != null) {
- tag.append(finalIntent.getAction());
- } else if (finalIntent.getComponent() != null) {
- finalIntent.getComponent().appendShortString(tag);
- } else if (finalIntent.getData() != null) {
- tag.append(finalIntent.getData().toSafeString());
- }
- controller.mAmInternal.tempWhitelistForPendingIntent(callingPid, callingUid,
- uid, duration, tag.toString());
- } else {
- Slog.w(TAG, "Not doing whitelist " + this + ": caller state=" + procState);
+ StringBuilder tag = new StringBuilder(64);
+ tag.append("pendingintent:");
+ UserHandle.formatUid(tag, callingUid);
+ tag.append(":");
+ if (finalIntent.getAction() != null) {
+ tag.append(finalIntent.getAction());
+ } else if (finalIntent.getComponent() != null) {
+ finalIntent.getComponent().appendShortString(tag);
+ } else if (finalIntent.getData() != null) {
+ tag.append(finalIntent.getData().toSafeString());
}
+ controller.mAmInternal.tempWhitelistForPendingIntent(callingPid, callingUid,
+ uid, duration.first, duration.second, tag.toString());
}
boolean sendFinish = finishedReceiver != null;
@@ -532,16 +533,18 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
pw.print(prefix); pw.print("sent="); pw.print(sent);
pw.print(" canceled="); pw.println(canceled);
}
- if (whitelistDuration != null) {
+ if (mWhitelistDuration != null) {
pw.print(prefix);
pw.print("whitelistDuration=");
- for (int i = 0; i < whitelistDuration.size(); i++) {
+ for (int i = 0; i < mWhitelistDuration.size(); i++) {
if (i != 0) {
pw.print(", ");
}
- pw.print(Integer.toHexString(System.identityHashCode(whitelistDuration.keyAt(i))));
+ pw.print(Integer.toHexString(System.identityHashCode(mWhitelistDuration.keyAt(i))));
pw.print(":");
- TimeUtils.formatDuration(whitelistDuration.valueAt(i), pw);
+ TimeUtils.formatDuration(mWhitelistDuration.valueAt(i).first, pw);
+ pw.print("/");
+ pw.print(mWhitelistDuration.valueAt(i).second);
}
pw.println();
}
@@ -569,15 +572,18 @@ public final class PendingIntentRecord extends IIntentSender.Stub {
}
sb.append(' ');
sb.append(key.typeName());
- if (whitelistDuration != null) {
+ if (mWhitelistDuration != null) {
sb.append( " (whitelist: ");
- for (int i = 0; i < whitelistDuration.size(); i++) {
+ for (int i = 0; i < mWhitelistDuration.size(); i++) {
if (i != 0) {
sb.append(",");
}
- sb.append(Integer.toHexString(System.identityHashCode(whitelistDuration.keyAt(i))));
+ sb.append(Integer.toHexString(System.identityHashCode(
+ mWhitelistDuration.keyAt(i))));
sb.append(":");
- TimeUtils.formatDuration(whitelistDuration.valueAt(i), sb);
+ TimeUtils.formatDuration(mWhitelistDuration.valueAt(i).first, sb);
+ sb.append("/");
+ sb.append(mWhitelistDuration.valueAt(i).second);
}
sb.append(")");
}
diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java
index 67419428e4d7..fa503889f26f 100644
--- a/services/core/java/com/android/server/biometrics/Utils.java
+++ b/services/core/java/com/android/server/biometrics/Utils.java
@@ -52,7 +52,6 @@ import android.hardware.biometrics.SensorProperties;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.os.Binder;
import android.os.Build;
-import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -62,7 +61,7 @@ import android.util.Slog;
import com.android.internal.R;
import com.android.internal.widget.LockPatternUtils;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import java.util.List;
@@ -409,7 +408,7 @@ public class Utils {
return hasPermission && keyguardPackage != null && keyguardPackage.equals(clientPackage);
}
- public static String getClientName(@Nullable ClientMonitor<?> client) {
+ public static String getClientName(@Nullable BaseClientMonitor<?> client) {
return client != null ? client.getClass().getSimpleName() : "null";
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
index 9898d7676178..c662df252971 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
@@ -29,10 +29,10 @@ import android.os.Vibrator;
import android.util.Slog;
/**
- * Abstract {@link ClientMonitor} subclass that operations eligible/interested in acquisition
+ * Abstract {@link BaseClientMonitor} subclass that operations eligible/interested in acquisition
* messages should extend.
*/
-public abstract class AcquisitionClient<T> extends ClientMonitor<T> implements Interruptable {
+public abstract class AcquisitionClient<T> extends BaseClientMonitor<T> implements Interruptable {
private static final String TAG = "Biometrics/AcquisitionClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java
index bbd652357888..7c9fe38c6add 100644
--- a/services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java
@@ -31,7 +31,8 @@ import java.util.NoSuchElementException;
* the current client. Subclasses are responsible for coordinating the interaction with
* the biometric's HAL for the specific action (e.g. authenticate, enroll, enumerate, etc.).
*/
-public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinder.DeathRecipient {
+public abstract class BaseClientMonitor<T> extends LoggableMonitor
+ implements IBinder.DeathRecipient {
private static final String TAG = "Biometrics/ClientMonitor";
protected static final boolean DEBUG = true;
@@ -49,7 +50,7 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
*
* @param clientMonitor Reference of the ClientMonitor that is starting.
*/
- default void onClientStarted(@NonNull ClientMonitor<?> clientMonitor) {}
+ default void onClientStarted(@NonNull BaseClientMonitor<?> clientMonitor) {}
/**
* Invoked when the ClientMonitor operation is complete. This abstracts away asynchronous
@@ -60,7 +61,8 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
* @param clientMonitor Reference of the ClientMonitor that finished.
* @param success True if the operation completed successfully.
*/
- default void onClientFinished(@NonNull ClientMonitor<?> clientMonitor, boolean success) {}
+ default void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor,
+ boolean success) {}
}
/**
@@ -102,7 +104,7 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
* @param statsAction One of {@link BiometricsProtoEnums} ACTION_* constants
* @param statsClient One of {@link BiometricsProtoEnums} CLIENT_* constants
*/
- public ClientMonitor(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
+ public BaseClientMonitor(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
@Nullable IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
@NonNull String owner, int cookie, int sensorId, int statsModality, int statsAction,
int statsClient) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
index b430521a2885..fecc6f0fa45e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
@@ -44,8 +44,8 @@ import java.util.List;
import java.util.Locale;
/**
- * A scheduler for biometric HAL operations. Maintains a queue of {@link ClientMonitor} operations,
- * without caring about its implementation details. Operations may perform one or more
+ * A scheduler for biometric HAL operations. Maintains a queue of {@link BaseClientMonitor}
+ * operations, without caring about its implementation details. Operations may perform one or more
* interactions with the HAL before finishing.
*/
public class BiometricScheduler {
@@ -88,7 +88,7 @@ public class BiometricScheduler {
static final int STATE_WAITING_FOR_COOKIE = 4;
/**
- * The {@link ClientMonitor.Callback} has been invoked and the client is finished.
+ * The {@link BaseClientMonitor.Callback} has been invoked and the client is finished.
*/
static final int STATE_FINISHED = 5;
@@ -101,20 +101,20 @@ public class BiometricScheduler {
@Retention(RetentionPolicy.SOURCE)
@interface OperationState {}
- @NonNull final ClientMonitor<?> clientMonitor;
- @Nullable final ClientMonitor.Callback mClientCallback;
- @OperationState int state;
+ @NonNull final BaseClientMonitor<?> mClientMonitor;
+ @Nullable final BaseClientMonitor.Callback mClientCallback;
+ @OperationState int mState;
- Operation(@NonNull ClientMonitor<?> clientMonitor,
- @Nullable ClientMonitor.Callback callback) {
- this.clientMonitor = clientMonitor;
+ Operation(@NonNull BaseClientMonitor<?> clientMonitor,
+ @Nullable BaseClientMonitor.Callback callback) {
+ this.mClientMonitor = clientMonitor;
this.mClientCallback = callback;
- state = STATE_WAITING_IN_QUEUE;
+ mState = STATE_WAITING_IN_QUEUE;
}
@Override
public String toString() {
- return clientMonitor + ", State: " + state;
+ return mClientMonitor + ", State: " + mState;
}
}
@@ -134,10 +134,10 @@ public class BiometricScheduler {
@Override
public void run() {
- if (operation.state != Operation.STATE_FINISHED) {
+ if (operation.mState != Operation.STATE_FINISHED) {
Slog.e(tag, "[Watchdog Triggered]: " + operation);
- operation.clientMonitor.mCallback
- .onClientFinished(operation.clientMonitor, false /* success */);
+ operation.mClientMonitor.mCallback
+ .onClientFinished(operation.mClientMonitor, false /* success */);
}
}
}
@@ -186,9 +186,9 @@ public class BiometricScheduler {
// Internal callback, notified when an operation is complete. Notifies the requester
// that the operation is complete, before performing internal scheduler work (such as
// starting the next client).
- public class InternalCallback implements ClientMonitor.Callback {
+ public class InternalCallback implements BaseClientMonitor.Callback {
@Override
- public void onClientStarted(@NonNull ClientMonitor<?> clientMonitor) {
+ public void onClientStarted(@NonNull BaseClientMonitor<?> clientMonitor) {
Slog.d(getTag(), "[Started] " + clientMonitor);
if (mCurrentOperation.mClientCallback != null) {
mCurrentOperation.mClientCallback.onClientStarted(clientMonitor);
@@ -196,7 +196,7 @@ public class BiometricScheduler {
}
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor, boolean success) {
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor, boolean success) {
mHandler.post(() -> {
if (mCurrentOperation == null) {
Slog.e(getTag(), "[Finishing] " + clientMonitor
@@ -205,14 +205,14 @@ public class BiometricScheduler {
return;
}
- if (clientMonitor != mCurrentOperation.clientMonitor) {
+ if (clientMonitor != mCurrentOperation.mClientMonitor) {
Slog.e(getTag(), "[Ignoring Finish] " + clientMonitor + " does not match"
- + " current: " + mCurrentOperation.clientMonitor);
+ + " current: " + mCurrentOperation.mClientMonitor);
return;
}
Slog.d(getTag(), "[Finishing] " + clientMonitor + ", success: " + success);
- mCurrentOperation.state = Operation.STATE_FINISHED;
+ mCurrentOperation.mState = Operation.STATE_FINISHED;
if (mCurrentOperation.mClientCallback != null) {
mCurrentOperation.mClientCallback.onClientFinished(clientMonitor, success);
@@ -220,7 +220,7 @@ public class BiometricScheduler {
if (mGestureAvailabilityDispatcher != null) {
mGestureAvailabilityDispatcher.markSensorActive(
- mCurrentOperation.clientMonitor.getSensorId(), false /* active */);
+ mCurrentOperation.mClientMonitor.getSensorId(), false /* active */);
}
mCurrentOperation = null;
@@ -276,11 +276,11 @@ public class BiometricScheduler {
}
mCurrentOperation = mPendingOperations.poll();
- final ClientMonitor<?> currentClient = mCurrentOperation.clientMonitor;
+ final BaseClientMonitor<?> currentClient = mCurrentOperation.mClientMonitor;
// If the operation at the front of the queue has been marked for cancellation, send
// ERROR_CANCELED. No need to start this client.
- if (mCurrentOperation.state == Operation.STATE_WAITING_IN_QUEUE_CANCELING) {
+ if (mCurrentOperation.mState == Operation.STATE_WAITING_IN_QUEUE_CANCELING) {
Slog.d(getTag(), "[Now Cancelling] " + mCurrentOperation);
if (!(currentClient instanceof Interruptable)) {
throw new IllegalStateException("Mis-implemented client or scheduler, "
@@ -295,9 +295,9 @@ public class BiometricScheduler {
}
if (mGestureAvailabilityDispatcher != null
- && mCurrentOperation.clientMonitor instanceof AcquisitionClient) {
+ && mCurrentOperation.mClientMonitor instanceof AcquisitionClient) {
mGestureAvailabilityDispatcher.markSensorActive(
- mCurrentOperation.clientMonitor.getSensorId(),
+ mCurrentOperation.mClientMonitor.getSensorId(),
true /* active */);
}
@@ -305,7 +305,7 @@ public class BiometricScheduler {
// to arrive at the head of the queue, before pinging it to start.
final boolean shouldStartNow = currentClient.getCookie() == 0;
if (shouldStartNow) {
- if (mCurrentOperation.clientMonitor.getFreshDaemon() == null) {
+ if (mCurrentOperation.mClientMonitor.getFreshDaemon() == null) {
// Note down current length of queue
final int pendingOperationsLength = mPendingOperations.size();
final Operation lastOperation = mPendingOperations.peekLast();
@@ -315,10 +315,10 @@ public class BiometricScheduler {
// For current operations, 1) unableToStart, which notifies the caller-side, then
// 2) notify operation's callback, to notify applicable system service that the
// operation failed.
- mCurrentOperation.clientMonitor.unableToStart();
+ mCurrentOperation.mClientMonitor.unableToStart();
if (mCurrentOperation.mClientCallback != null) {
- mCurrentOperation.mClientCallback
- .onClientFinished(mCurrentOperation.clientMonitor, false /* success */);
+ mCurrentOperation.mClientCallback.onClientFinished(
+ mCurrentOperation.mClientMonitor, false /* success */);
}
// Then for each operation currently in the pending queue at the time of this
@@ -331,9 +331,9 @@ public class BiometricScheduler {
+ ", expected length: " + pendingOperationsLength);
break;
}
- operation.clientMonitor.unableToStart();
+ operation.mClientMonitor.unableToStart();
if (operation.mClientCallback != null) {
- operation.mClientCallback.onClientFinished(operation.clientMonitor,
+ operation.mClientCallback.onClientFinished(operation.mClientMonitor,
false /* success */);
}
Slog.w(getTag(), "[Aborted Operation] " + operation);
@@ -347,7 +347,7 @@ public class BiometricScheduler {
} else {
Slog.d(getTag(), "[Starting] " + mCurrentOperation);
currentClient.start(getInternalCallback());
- mCurrentOperation.state = Operation.STATE_STARTED;
+ mCurrentOperation.mState = Operation.STATE_STARTED;
}
} else {
try {
@@ -356,7 +356,7 @@ public class BiometricScheduler {
Slog.e(getTag(), "Remote exception when contacting BiometricService", e);
}
Slog.d(getTag(), "Waiting for cookie before starting: " + mCurrentOperation);
- mCurrentOperation.state = Operation.STATE_WAITING_FOR_COOKIE;
+ mCurrentOperation.mState = Operation.STATE_WAITING_FOR_COOKIE;
}
}
@@ -378,13 +378,14 @@ public class BiometricScheduler {
Slog.e(getTag(), "Current operation is null");
return;
}
- if (mCurrentOperation.state != Operation.STATE_WAITING_FOR_COOKIE) {
- if (mCurrentOperation.state == Operation.STATE_WAITING_IN_QUEUE_CANCELING) {
+ if (mCurrentOperation.mState != Operation.STATE_WAITING_FOR_COOKIE) {
+ if (mCurrentOperation.mState == Operation.STATE_WAITING_IN_QUEUE_CANCELING) {
Slog.d(getTag(), "Operation was marked for cancellation, cancelling now: "
+ mCurrentOperation);
// This should trigger the internal onClientFinished callback, which clears the
// operation and starts the next one.
- final Interruptable interruptable = (Interruptable) mCurrentOperation.clientMonitor;
+ final Interruptable interruptable =
+ (Interruptable) mCurrentOperation.mClientMonitor;
interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_CANCELED,
0 /* vendorCode */);
return;
@@ -394,55 +395,55 @@ public class BiometricScheduler {
return;
}
}
- if (mCurrentOperation.clientMonitor.getCookie() != cookie) {
+ if (mCurrentOperation.mClientMonitor.getCookie() != cookie) {
Slog.e(getTag(), "Mismatched cookie for operation: " + mCurrentOperation
+ ", received: " + cookie);
return;
}
- if (mCurrentOperation.clientMonitor.getFreshDaemon() == null) {
+ if (mCurrentOperation.mClientMonitor.getFreshDaemon() == null) {
Slog.e(getTag(), "[Unable To Start] Prepared client: " + mCurrentOperation);
// This is BiometricPrompt trying to auth but something's wrong with the HAL.
- mCurrentOperation.clientMonitor.unableToStart();
+ mCurrentOperation.mClientMonitor.unableToStart();
if (mCurrentOperation.mClientCallback != null) {
- mCurrentOperation.mClientCallback.onClientFinished(mCurrentOperation.clientMonitor,
+ mCurrentOperation.mClientCallback.onClientFinished(mCurrentOperation.mClientMonitor,
false /* success */);
}
mCurrentOperation = null;
startNextOperationIfIdle();
} else {
Slog.d(getTag(), "[Starting] Prepared client: " + mCurrentOperation);
- mCurrentOperation.state = Operation.STATE_STARTED;
- mCurrentOperation.clientMonitor.start(getInternalCallback());
+ mCurrentOperation.mState = Operation.STATE_STARTED;
+ mCurrentOperation.mClientMonitor.start(getInternalCallback());
}
}
/**
- * Adds a {@link ClientMonitor} to the pending queue
+ * Adds a {@link BaseClientMonitor} to the pending queue
*
* @param clientMonitor operation to be scheduled
*/
- public void scheduleClientMonitor(@NonNull ClientMonitor<?> clientMonitor) {
+ public void scheduleClientMonitor(@NonNull BaseClientMonitor<?> clientMonitor) {
scheduleClientMonitor(clientMonitor, null /* clientFinishCallback */);
}
/**
- * Adds a {@link ClientMonitor} to the pending queue
+ * Adds a {@link BaseClientMonitor} to the pending queue
*
* @param clientMonitor operation to be scheduled
* @param clientCallback optional callback, invoked when the client is finished, but
* before it has been removed from the queue.
*/
- public void scheduleClientMonitor(@NonNull ClientMonitor<?> clientMonitor,
- @Nullable ClientMonitor.Callback clientCallback) {
+ public void scheduleClientMonitor(@NonNull BaseClientMonitor<?> clientMonitor,
+ @Nullable BaseClientMonitor.Callback clientCallback) {
// Mark any interruptable pending clients as canceling. Once they reach the head of the
// queue, the scheduler will send ERROR_CANCELED and skip the operation.
for (Operation operation : mPendingOperations) {
- if (operation.clientMonitor instanceof Interruptable
- && operation.state != Operation.STATE_WAITING_IN_QUEUE_CANCELING) {
+ if (operation.mClientMonitor instanceof Interruptable
+ && operation.mState != Operation.STATE_WAITING_IN_QUEUE_CANCELING) {
Slog.d(getTag(), "New client incoming, marking pending client as canceling: "
- + operation.clientMonitor);
- operation.state = Operation.STATE_WAITING_IN_QUEUE_CANCELING;
+ + operation.mClientMonitor);
+ operation.mState = Operation.STATE_WAITING_IN_QUEUE_CANCELING;
}
}
@@ -451,8 +452,8 @@ public class BiometricScheduler {
+ ", new queue size: " + mPendingOperations.size());
// If the current operation is cancellable, start the cancellation process.
- if (mCurrentOperation != null && mCurrentOperation.clientMonitor instanceof Interruptable
- && mCurrentOperation.state == Operation.STATE_STARTED) {
+ if (mCurrentOperation != null && mCurrentOperation.mClientMonitor instanceof Interruptable
+ && mCurrentOperation.mState == Operation.STATE_STARTED) {
Slog.d(getTag(), "[Cancelling Interruptable]: " + mCurrentOperation);
cancelInternal(mCurrentOperation);
}
@@ -465,25 +466,25 @@ public class BiometricScheduler {
Slog.e(getTag(), "cancelInternal invoked on non-current operation: " + operation);
return;
}
- if (!(operation.clientMonitor instanceof Interruptable)) {
+ if (!(operation.mClientMonitor instanceof Interruptable)) {
Slog.w(getTag(), "Operation not interruptable: " + operation);
return;
}
- if (operation.state == Operation.STATE_STARTED_CANCELING) {
+ if (operation.mState == Operation.STATE_STARTED_CANCELING) {
Slog.w(getTag(), "Cancel already invoked for operation: " + operation);
return;
}
- if (operation.state == Operation.STATE_WAITING_FOR_COOKIE) {
+ if (operation.mState == Operation.STATE_WAITING_FOR_COOKIE) {
Slog.w(getTag(), "Skipping cancellation for non-started operation: " + operation);
// We can set it to null immediately, since the HAL was never notified to start.
mCurrentOperation = null;
startNextOperationIfIdle();
return;
}
- Slog.d(getTag(), "[Cancelling] Current client: " + operation.clientMonitor);
- final Interruptable interruptable = (Interruptable) operation.clientMonitor;
+ Slog.d(getTag(), "[Cancelling] Current client: " + operation.mClientMonitor);
+ final Interruptable interruptable = (Interruptable) operation.mClientMonitor;
interruptable.cancel();
- operation.state = Operation.STATE_STARTED_CANCELING;
+ operation.mState = Operation.STATE_STARTED_CANCELING;
// Add a watchdog. If the HAL does not acknowledge within the timeout, we will
// forcibly finish this client.
@@ -500,8 +501,8 @@ public class BiometricScheduler {
Slog.e(getTag(), "Unable to cancel enrollment, null operation");
return;
}
- final boolean isEnrolling = mCurrentOperation.clientMonitor instanceof EnrollClient;
- final boolean tokenMatches = mCurrentOperation.clientMonitor.getToken() == token;
+ final boolean isEnrolling = mCurrentOperation.mClientMonitor instanceof EnrollClient;
+ final boolean tokenMatches = mCurrentOperation.mClientMonitor.getToken() == token;
if (!isEnrolling || !tokenMatches) {
Slog.w(getTag(), "Not cancelling enrollment, isEnrolling: " + isEnrolling
+ " tokenMatches: " + tokenMatches);
@@ -521,8 +522,8 @@ public class BiometricScheduler {
return;
}
final boolean isAuthenticating =
- mCurrentOperation.clientMonitor instanceof AuthenticationConsumer;
- final boolean tokenMatches = mCurrentOperation.clientMonitor.getToken() == token;
+ mCurrentOperation.mClientMonitor instanceof AuthenticationConsumer;
+ final boolean tokenMatches = mCurrentOperation.mClientMonitor.getToken() == token;
if (!isAuthenticating || !tokenMatches) {
Slog.w(getTag(), "Not cancelling authentication"
+ ", current operation : " + mCurrentOperation
@@ -536,11 +537,11 @@ public class BiometricScheduler {
/**
* @return the current operation
*/
- public ClientMonitor<?> getCurrentClient() {
+ public BaseClientMonitor<?> getCurrentClient() {
if (mCurrentOperation == null) {
return null;
}
- return mCurrentOperation.clientMonitor;
+ return mCurrentOperation.mClientMonitor;
}
public int getCurrentPendingCount() {
diff --git a/services/core/java/com/android/server/biometrics/sensors/EnumerateConsumer.java b/services/core/java/com/android/server/biometrics/sensors/EnumerateConsumer.java
index 8ad9e6ad2ed2..07a4d117cb5a 100644
--- a/services/core/java/com/android/server/biometrics/sensors/EnumerateConsumer.java
+++ b/services/core/java/com/android/server/biometrics/sensors/EnumerateConsumer.java
@@ -19,8 +19,8 @@ package com.android.server.biometrics.sensors;
import android.hardware.biometrics.BiometricAuthenticator;
/**
- * Interface that {@link ClientMonitor} subclasses eligible/interested in enumerate callbacks should
- * implement.
+ * Interface that {@link BaseClientMonitor} subclasses eligible/interested in enumerate callbacks
+ * should implement.
*/
public interface EnumerateConsumer {
/**
diff --git a/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java
index bac944fca1de..7f01fdac608f 100644
--- a/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/GenerateChallengeClient.java
@@ -23,7 +23,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
-public abstract class GenerateChallengeClient<T> extends ClientMonitor<T> {
+public abstract class GenerateChallengeClient<T> extends BaseClientMonitor<T> {
private static final String TAG = "GenerateChallengeClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java
index e738d17f5f17..edc7edccaf7b 100644
--- a/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java
@@ -39,7 +39,7 @@ import java.util.Map;
* {@link #onRemoved(BiometricAuthenticator.Identifier, int)} returns true/
*/
public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Identifier, T>
- extends ClientMonitor<T> implements EnumerateConsumer, RemovalConsumer {
+ extends BaseClientMonitor<T> implements EnumerateConsumer, RemovalConsumer {
private static final String TAG = "Biometrics/InternalCleanupClient";
@@ -60,11 +60,11 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
private final BiometricUtils<S> mBiometricUtils;
private final Map<Integer, Long> mAuthenticatorIds;
private final List<S> mEnrolledList;
- private ClientMonitor<T> mCurrentTask;
+ private BaseClientMonitor<T> mCurrentTask;
private final Callback mEnumerateCallback = new Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor, boolean success) {
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor, boolean success) {
final List<BiometricAuthenticator.Identifier> unknownHALTemplates =
((InternalEnumerateClient<T>) mCurrentTask).getUnknownHALTemplates();
@@ -88,7 +88,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
private final Callback mRemoveCallback = new Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor, boolean success) {
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor, boolean success) {
mCallback.onClientFinished(InternalCleanupClient.this, success);
}
};
diff --git a/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java b/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java
index e07f71298d13..176e49c15716 100644
--- a/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java
@@ -31,7 +31,7 @@ import java.util.List;
/**
* Internal class to help clean up unknown templates in the HAL and Framework
*/
-public abstract class InternalEnumerateClient<T> extends ClientMonitor<T>
+public abstract class InternalEnumerateClient<T> extends BaseClientMonitor<T>
implements EnumerateConsumer {
private static final String TAG = "Biometrics/InternalEnumerateClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/Interruptable.java b/services/core/java/com/android/server/biometrics/sensors/Interruptable.java
index 28e0117afd36..70d9b26f4af1 100644
--- a/services/core/java/com/android/server/biometrics/sensors/Interruptable.java
+++ b/services/core/java/com/android/server/biometrics/sensors/Interruptable.java
@@ -19,7 +19,7 @@ package com.android.server.biometrics.sensors;
import android.annotation.NonNull;
/**
- * Interface that {@link ClientMonitor} subclasses eligible/interested in error callbacks should
+ * Interface that {@link BaseClientMonitor} subclasses eligible/interested in error callbacks should
* implement.
*/
public interface Interruptable {
@@ -37,10 +37,10 @@ public interface Interruptable {
/**
* Notifies the client that it needs to finish before
- * {@link ClientMonitor#start(ClientMonitor.Callback)} was invoked. This usually happens
+ * {@link BaseClientMonitor#start(BaseClientMonitor.Callback)} was invoked. This usually happens
* if the client is still waiting in the pending queue and got notified that a subsequent
* operation is preempting it.
* @param callback invoked when the operation is completed.
*/
- void cancelWithoutStarting(@NonNull ClientMonitor.Callback callback);
+ void cancelWithoutStarting(@NonNull BaseClientMonitor.Callback callback);
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java
index fe946cb0189d..93728d0a8c47 100644
--- a/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java
@@ -20,6 +20,9 @@ import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricsProtoEnums;
+import android.hardware.biometrics.IInvalidationCallback;
+import android.os.RemoteException;
+import android.util.Slog;
import java.util.Map;
@@ -28,24 +31,31 @@ import java.util.Map;
* {@link InvalidationRequesterClient} for more info.
*/
public abstract class InvalidationClient<S extends BiometricAuthenticator.Identifier, T>
- extends ClientMonitor<T> {
+ extends BaseClientMonitor<T> {
- private final BiometricUtils<S> mUtils;
- private final Map<Integer, Long> mAuthenticatorIds;
+ private static final String TAG = "InvalidationClient";
+
+ @NonNull private final Map<Integer, Long> mAuthenticatorIds;
+ @NonNull private final IInvalidationCallback mInvalidationCallback;
public InvalidationClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
- int userId, int sensorId, @NonNull BiometricUtils<S> utils,
- @NonNull Map<Integer, Long> authenticatorIds) {
+ int userId, int sensorId, @NonNull Map<Integer, Long> authenticatorIds,
+ @NonNull IInvalidationCallback callback) {
super(context, lazyDaemon, null /* token */, null /* listener */, userId,
context.getOpPackageName(), 0 /* cookie */, sensorId,
BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
BiometricsProtoEnums.CLIENT_UNKNOWN);
- mUtils = utils;
mAuthenticatorIds = authenticatorIds;
+ mInvalidationCallback = callback;
}
public void onAuthenticatorIdInvalidated(long newAuthenticatorId) {
mAuthenticatorIds.put(getTargetUserId(), newAuthenticatorId);
+ try {
+ mInvalidationCallback.onCompleted();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Remote exception", e);
+ }
mCallback.onClientFinished(this, true /* success */);
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java b/services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java
index d95fa236fcef..e16b2f81bc5f 100644
--- a/services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/InvalidationRequesterClient.java
@@ -56,7 +56,7 @@ import android.hardware.biometrics.IInvalidationCallback;
* the framework should re-start the invalidation process described above.
*/
public abstract class InvalidationRequesterClient<S extends BiometricAuthenticator.Identifier, T>
- extends ClientMonitor<T> {
+ extends BaseClientMonitor<T> {
private final BiometricManager mBiometricManager;
@NonNull private final BiometricUtils<S> mUtils;
diff --git a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java
index f79abd59dbb4..cec6dde751a6 100644
--- a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java
@@ -31,7 +31,7 @@ import java.util.Map;
* A class to keep track of the remove state for a given client.
*/
public abstract class RemovalClient<S extends BiometricAuthenticator.Identifier, T>
- extends ClientMonitor<T> implements RemovalConsumer {
+ extends BaseClientMonitor<T> implements RemovalConsumer {
private static final String TAG = "Biometrics/RemovalClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/RemovalConsumer.java b/services/core/java/com/android/server/biometrics/sensors/RemovalConsumer.java
index 0aba7e420cfb..82fa1647ae18 100644
--- a/services/core/java/com/android/server/biometrics/sensors/RemovalConsumer.java
+++ b/services/core/java/com/android/server/biometrics/sensors/RemovalConsumer.java
@@ -20,8 +20,8 @@ import android.annotation.Nullable;
import android.hardware.biometrics.BiometricAuthenticator;
/**
- * Interface that {@link ClientMonitor} subclasses eligible/interested in removal callbacks should
- * implement.
+ * Interface that {@link BaseClientMonitor} subclasses eligible/interested in removal callbacks
+ * should implement.
*/
public interface RemovalConsumer {
/**
diff --git a/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java
index 5deb8fa26639..35cbcc00ee44 100644
--- a/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/RevokeChallengeClient.java
@@ -21,7 +21,7 @@ import android.content.Context;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.os.IBinder;
-public abstract class RevokeChallengeClient<T> extends ClientMonitor<T> {
+public abstract class RevokeChallengeClient<T> extends BaseClientMonitor<T> {
public RevokeChallengeClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
@NonNull IBinder token, @NonNull String owner, int sensorId) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java
index c27b6e5a4b7d..acf0f08096aa 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetAuthenticatorIdClient.java
@@ -23,11 +23,11 @@ import android.hardware.biometrics.face.ISession;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import java.util.Map;
-class FaceGetAuthenticatorIdClient extends ClientMonitor<ISession> {
+class FaceGetAuthenticatorIdClient extends BaseClientMonitor<ISession> {
private static final String TAG = "FaceGetAuthenticatorIdClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java
index 9c6438ecd014..855ee1dbf52f 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClient.java
@@ -18,13 +18,13 @@ package com.android.server.biometrics.sensors.face.aidl;
import android.annotation.NonNull;
import android.content.Context;
+import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.face.ISession;
import android.hardware.face.Face;
import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.sensors.InvalidationClient;
-import com.android.server.biometrics.sensors.face.FaceUtils;
import java.util.Map;
@@ -33,8 +33,8 @@ public class FaceInvalidationClient extends InvalidationClient<Face, ISession> {
public FaceInvalidationClient(@NonNull Context context,
@NonNull LazyDaemon<ISession> lazyDaemon, int userId, int sensorId,
- @NonNull FaceUtils utils, @NonNull Map<Integer, Long> authenticatorIds) {
- super(context, lazyDaemon, userId, sensorId, utils, authenticatorIds);
+ @NonNull Map<Integer, Long> authenticatorIds, @NonNull IInvalidationCallback callback) {
+ super(context, lazyDaemon, userId, sensorId, authenticatorIds, callback);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
index cec1cb8654fc..058bcf669a3a 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
@@ -20,10 +20,10 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
-import android.app.IActivityTaskManager;
import android.app.TaskStackListener;
import android.content.Context;
import android.content.pm.UserInfo;
+import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.SensorProps;
@@ -44,7 +44,7 @@ import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.PerformanceTracker;
@@ -73,7 +73,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
@NonNull private final String mHalInstanceName;
@NonNull @VisibleForTesting
final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports
- @NonNull private final ClientMonitor.LazyDaemon<IFace> mLazyDaemon;
+ @NonNull private final BaseClientMonitor.LazyDaemon<IFace> mLazyDaemon;
@NonNull private final Handler mHandler;
@NonNull private final LockoutResetDispatcher mLockoutResetDispatcher;
@NonNull private final UsageStats mUsageStats;
@@ -87,7 +87,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
public void onTaskStackChanged() {
mHandler.post(() -> {
for (int i = 0; i < mSensors.size(); i++) {
- final ClientMonitor<?> client = mSensors.valueAt(i).getScheduler()
+ final BaseClientMonitor<?> client = mSensors.valueAt(i).getScheduler()
.getCurrentClient();
if (!(client instanceof AuthenticationClient)) {
Slog.e(getTag(), "Task stack changed for client: " + client);
@@ -181,7 +181,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
return mDaemon;
}
- private void scheduleForSensor(int sensorId, @NonNull ClientMonitor<?> client) {
+ private void scheduleForSensor(int sensorId, @NonNull BaseClientMonitor<?> client) {
if (!mSensors.contains(sensorId)) {
throw new IllegalStateException("Unable to schedule client: " + client
+ " for sensor: " + sensorId);
@@ -189,8 +189,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client);
}
- private void scheduleForSensor(int sensorId, @NonNull ClientMonitor<?> client,
- ClientMonitor.Callback callback) {
+ private void scheduleForSensor(int sensorId, @NonNull BaseClientMonitor<?> client,
+ BaseClientMonitor.Callback callback) {
if (!mSensors.contains(sensorId)) {
throw new IllegalStateException("Unable to schedule client: " + client
+ " for sensor: " + sensorId);
@@ -269,6 +269,32 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
}
@Override
+ public void scheduleInvalidateAuthenticatorId(int sensorId, int userId,
+ @NonNull IInvalidationCallback callback) {
+ mHandler.post(() -> {
+ final IFace daemon = getHalInstance();
+ if (daemon == null) {
+ Slog.e(getTag(), "Null daemon during scheduleInvalidateAuthenticatorId: "
+ + sensorId);
+ return;
+ }
+
+ try {
+ if (!mSensors.get(sensorId).hasSessionForUser(userId)) {
+ createNewSessionWithoutHandler(daemon, sensorId, userId);
+ }
+
+ final FaceInvalidationClient client = new FaceInvalidationClient(mContext,
+ mSensors.get(sensorId).getLazySession(), userId, sensorId,
+ mSensors.get(sensorId).getAuthenticatorIds(), callback);
+ mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client);
+ } catch (RemoteException e) {
+ Slog.e(getTag(), "Remote exception", e);
+ }
+ });
+ }
+
+ @Override
public int getLockoutModeForUser(int sensorId, int userId) {
return mSensors.get(sensorId).getLockoutCache().getLockoutModeForUser(userId);
}
@@ -362,9 +388,9 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
opPackageName, FaceUtils.getInstance(sensorId), disabledFeatures,
ENROLL_TIMEOUT_SEC, previewSurface, sensorId, maxTemplatesPerUser);
- scheduleForSensor(sensorId, client, new ClientMonitor.Callback() {
+ scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor,
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor,
boolean success) {
if (success) {
scheduleLoadAuthenticatorIdsForUser(sensorId, userId);
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java
index 5b1f5465ea0a..7edeb7b73a81 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceResetLockoutClient.java
@@ -26,7 +26,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.LockoutCache;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -36,7 +36,7 @@ import com.android.server.biometrics.sensors.LockoutTracker;
* Updates the framework's lockout cache and notifies clients such as Keyguard when lockout is
* cleared.
*/
-public class FaceResetLockoutClient extends ClientMonitor<ISession> {
+public class FaceResetLockoutClient extends BaseClientMonitor<ISession> {
private static final String TAG = "FaceResetLockoutClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
index f9e31063e595..90df726ee03c 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
@@ -45,8 +45,8 @@ import com.android.server.biometrics.UserStateProto;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.AuthenticationConsumer;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
-import com.android.server.biometrics.sensors.ClientMonitor;
import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.Interruptable;
import com.android.server.biometrics.sensors.LockoutCache;
@@ -73,7 +73,7 @@ public class Sensor implements IBinder.DeathRecipient {
@NonNull private final BiometricScheduler mScheduler;
@NonNull private final LockoutCache mLockoutCache;
@NonNull private final Map<Integer, Long> mAuthenticatorIds;
- @NonNull private final ClientMonitor.LazyDaemon<ISession> mLazySession;
+ @NonNull private final BaseClientMonitor.LazyDaemon<ISession> mLazySession;
@Nullable private Session mCurrentSession;
static class Session {
@@ -136,7 +136,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onChallengeGenerated(long challenge) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FaceGenerateChallengeClient)) {
Slog.e(mTag, "onChallengeGenerated for wrong client: "
+ Utils.getClientName(client));
@@ -152,7 +152,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onChallengeRevoked(long challenge) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FaceRevokeChallengeClient)) {
Slog.e(mTag, "onChallengeRevoked for wrong client: "
+ Utils.getClientName(client));
@@ -168,7 +168,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onAcquired(byte info, int vendorCode) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AcquisitionClient)) {
Slog.e(mTag, "onAcquired for non-acquisition client: "
+ Utils.getClientName(client));
@@ -183,7 +183,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onError(byte error, int vendorCode) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
Slog.d(mTag, "onError"
+ ", client: " + Utils.getClientName(client)
+ ", error: " + error
@@ -206,7 +206,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onEnrollmentProgress(int enrollmentId, int remaining) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FaceEnrollClient)) {
Slog.e(mTag, "onEnrollmentProgress for non-enroll client: "
+ Utils.getClientName(client));
@@ -226,7 +226,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onAuthenticationSucceeded(int enrollmentId, HardwareAuthToken hat) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AuthenticationConsumer)) {
Slog.e(mTag, "onAuthenticationSucceeded for non-authentication consumer: "
+ Utils.getClientName(client));
@@ -248,7 +248,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onAuthenticationFailed() {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AuthenticationConsumer)) {
Slog.e(mTag, "onAuthenticationFailed for non-authentication consumer: "
+ Utils.getClientName(client));
@@ -266,7 +266,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onLockoutTimed(long durationMillis) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof LockoutConsumer)) {
Slog.e(mTag, "onLockoutTimed for non-lockout consumer: "
+ Utils.getClientName(client));
@@ -281,7 +281,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onLockoutPermanent() {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof LockoutConsumer)) {
Slog.e(mTag, "onLockoutPermanent for non-lockout consumer: "
+ Utils.getClientName(client));
@@ -296,7 +296,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onLockoutCleared() {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FaceResetLockoutClient)) {
Slog.e(mTag, "onLockoutCleared for non-resetLockout client: "
+ Utils.getClientName(client));
@@ -316,7 +316,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onEnrollmentsEnumerated(int[] enrollmentIds) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof EnumerateConsumer)) {
Slog.e(mTag, "onEnrollmentsEnumerated for non-enumerate consumer: "
+ Utils.getClientName(client));
@@ -339,7 +339,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onEnrollmentsRemoved(int[] enrollmentIds) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof RemovalConsumer)) {
Slog.e(mTag, "onRemoved for non-removal consumer: "
+ Utils.getClientName(client));
@@ -361,7 +361,7 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onAuthenticatorIdRetrieved(long authenticatorId) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FaceGetAuthenticatorIdClient)) {
Slog.e(mTag, "onAuthenticatorIdRetrieved for wrong consumer: "
+ Utils.getClientName(client));
@@ -376,7 +376,17 @@ public class Sensor implements IBinder.DeathRecipient {
@Override
public void onAuthenticatorIdInvalidated(long newAuthenticatorId) {
- // TODO(b/159667191)
+ mHandler.post(() -> {
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
+ if (!(client instanceof FaceInvalidationClient)) {
+ Slog.e(mTag, "onAuthenticatorIdInvalidated for wrong consumer: "
+ + Utils.getClientName(client));
+ return;
+ }
+
+ final FaceInvalidationClient invalidationClient = (FaceInvalidationClient) client;
+ invalidationClient.onAuthenticatorIdInvalidated(newAuthenticatorId);
+ });
}
}
@@ -400,7 +410,7 @@ public class Sensor implements IBinder.DeathRecipient {
};
}
- @NonNull ClientMonitor.LazyDaemon<ISession> getLazySession() {
+ @NonNull BaseClientMonitor.LazyDaemon<ISession> getLazySession() {
return mLazySession;
}
@@ -481,7 +491,7 @@ public class Sensor implements IBinder.DeathRecipient {
public void binderDied() {
Slog.e(mTag, "Binder died");
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (client instanceof Interruptable) {
Slog.e(mTag, "Sending ERROR_HW_UNAVAILABLE for client: " + client);
final Interruptable interruptable = (Interruptable) client;
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
index 10b12cb22e85..85938360d4ae 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
@@ -58,8 +58,8 @@ import com.android.server.biometrics.UserStateProto;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.AuthenticationConsumer;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
-import com.android.server.biometrics.sensors.ClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.Interruptable;
@@ -103,7 +103,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@NonNull private final Context mContext;
@NonNull private final BiometricScheduler mScheduler;
@NonNull private final Handler mHandler;
- @NonNull private final ClientMonitor.LazyDaemon<IBiometricsFace> mLazyDaemon;
+ @NonNull private final BaseClientMonitor.LazyDaemon<IBiometricsFace> mLazyDaemon;
@NonNull private final LockoutResetDispatcher mLockoutResetDispatcher;
@NonNull private final LockoutHalImpl mLockoutTracker;
@NonNull private final UsageStats mUsageStats;
@@ -170,7 +170,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
.getUniqueName(mContext, userId);
final Face face = new Face(name, faceId, deviceId);
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FaceEnrollClient)) {
Slog.e(TAG, "onEnrollResult for non-enroll client: "
+ Utils.getClientName(client));
@@ -186,7 +186,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
public void onAuthenticated(long deviceId, int faceId, int userId,
ArrayList<Byte> token) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AuthenticationConsumer)) {
Slog.e(TAG, "onAuthenticated for non-authentication consumer: "
+ Utils.getClientName(client));
@@ -205,7 +205,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
public void onAcquired(long deviceId, int userId, int acquiredInfo,
int vendorCode) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AcquisitionClient)) {
Slog.e(TAG, "onAcquired for non-acquire client: "
+ Utils.getClientName(client));
@@ -221,7 +221,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@Override
public void onError(long deviceId, int userId, int error, int vendorCode) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
Slog.d(TAG, "handleError"
+ ", client: " + (client != null ? client.getOwnerString() : null)
+ ", error: " + error
@@ -247,7 +247,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@Override
public void onRemoved(long deviceId, ArrayList<Integer> removed, int userId) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof RemovalConsumer)) {
Slog.e(TAG, "onRemoved for non-removal consumer: "
+ Utils.getClientName(client));
@@ -278,7 +278,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@Override
public void onEnumerate(long deviceId, ArrayList<Integer> faceIds, int userId) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof EnumerateConsumer)) {
Slog.e(TAG, "onEnumerate for non-enumerate consumer: "
+ Utils.getClientName(client));
@@ -376,7 +376,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
mDaemon = null;
mCurrentUserId = UserHandle.USER_NULL;
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (client instanceof Interruptable) {
Slog.e(TAG, "Sending ERROR_HW_UNAVAILABLE for client: " + client);
final Interruptable interruptable = (Interruptable) client;
@@ -528,9 +528,9 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final FaceGenerateChallengeClient client = new FaceGenerateChallengeClient(mContext,
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), opPackageName,
mSensorId, mCurrentChallengeOwner);
- mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
+ mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
- public void onClientStarted(@NonNull ClientMonitor<?> clientMonitor) {
+ public void onClientStarted(@NonNull BaseClientMonitor<?> clientMonitor) {
if (client != clientMonitor) {
Slog.e(TAG, "scheduleGenerateChallenge onClientStarted, mismatched client."
+ " Expecting: " + client + ", received: " + clientMonitor);
@@ -557,9 +557,9 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final FaceRevokeChallengeClient client = new FaceRevokeChallengeClient(mContext,
mLazyDaemon, token, opPackageName, mSensorId);
- mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
+ mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor,
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor,
boolean success) {
if (client != clientMonitor) {
Slog.e(TAG, "scheduleRevokeChallenge, mismatched client."
@@ -613,9 +613,9 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
opPackageName, FaceUtils.getLegacyInstance(mSensorId), disabledFeatures,
ENROLL_TIMEOUT_SEC, surfaceHandle, mSensorId);
- mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
+ mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor,
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor,
boolean success) {
if (success) {
// Update authenticatorIds
@@ -724,10 +724,10 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final int faceId = faces.get(0).getBiometricId();
final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext, mLazyDaemon,
token, listener, userId, opPackageName, mSensorId, feature, faceId);
- mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
+ mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
public void onClientFinished(
- @NonNull ClientMonitor<?> clientMonitor, boolean success) {
+ @NonNull BaseClientMonitor<?> clientMonitor, boolean success) {
if (success && feature == BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION) {
final int settingsValue = client.getValue() ? 1 : 0;
Slog.d(TAG, "Updating attention value for user: " + userId
@@ -862,9 +862,10 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final FaceUpdateActiveUserClient client = new FaceUpdateActiveUserClient(mContext,
mLazyDaemon, targetUserId, mContext.getOpPackageName(), mSensorId, mCurrentUserId,
hasEnrolled, mAuthenticatorIds);
- mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
+ mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor, boolean success) {
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor,
+ boolean success) {
if (success) {
mCurrentUserId = targetUserId;
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java
index e25bb812caa6..d30c9b102e6b 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java
@@ -27,14 +27,14 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
/**
* Face-specific getFeature client supporting the {@link android.hardware.biometrics.face.V1_0}
* and {@link android.hardware.biometrics.face.V1_1} HIDL interfaces.
*/
-public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> {
+public class FaceGetFeatureClient extends BaseClientMonitor<IBiometricsFace> {
private static final String TAG = "FaceGetFeatureClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java
index 8df9b9f305de..bb8386099109 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceResetLockoutClient.java
@@ -23,7 +23,7 @@ import android.hardware.biometrics.face.V1_0.IBiometricsFace;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import java.util.ArrayList;
@@ -31,7 +31,7 @@ import java.util.ArrayList;
* Face-specific resetLockout client supporting the {@link android.hardware.biometrics.face.V1_0}
* and {@link android.hardware.biometrics.face.V1_1} HIDL interfaces.
*/
-public class FaceResetLockoutClient extends ClientMonitor<IBiometricsFace> {
+public class FaceResetLockoutClient extends BaseClientMonitor<IBiometricsFace> {
private static final String TAG = "FaceResetLockoutClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java
index 0e2072823684..0fb0de2a65f3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceSetFeatureClient.java
@@ -25,7 +25,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import java.util.ArrayList;
@@ -34,7 +34,7 @@ import java.util.ArrayList;
* Face-specific setFeature client supporting the {@link android.hardware.biometrics.face.V1_0}
* and {@link android.hardware.biometrics.face.V1_1} HIDL interfaces.
*/
-public class FaceSetFeatureClient extends ClientMonitor<IBiometricsFace> {
+public class FaceSetFeatureClient extends BaseClientMonitor<IBiometricsFace> {
private static final String TAG = "FaceSetFeatureClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java
index 22275e5f9d32..78ee71486b92 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceUpdateActiveUserClient.java
@@ -24,12 +24,12 @@ import android.os.Environment;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import java.io.File;
import java.util.Map;
-public class FaceUpdateActiveUserClient extends ClientMonitor<IBiometricsFace> {
+public class FaceUpdateActiveUserClient extends BaseClientMonitor<IBiometricsFace> {
private static final String TAG = "FaceUpdateActiveUserClient";
private static final String FACE_DATA_DIR = "facedata";
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/Udfps.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/Udfps.java
index 0bf107a9be8e..0aa112f106c4 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/Udfps.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/Udfps.java
@@ -16,9 +16,11 @@
package com.android.server.biometrics.sensors.fingerprint;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
+
/**
* Interface for under-display fingerprint sensors.
- * {@link com.android.server.biometrics.sensors.ClientMonitor} subclass that require knowledge of
+ * {@link BaseClientMonitor} subclass that require knowledge of
* finger position (e.g. enroll, authenticate) should implement this.
*/
public interface Udfps {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java
index 2ad1fa306781..817004149389 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGetAuthenticatorIdClient.java
@@ -23,11 +23,11 @@ import android.hardware.biometrics.fingerprint.ISession;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import java.util.Map;
-class FingerprintGetAuthenticatorIdClient extends ClientMonitor<ISession> {
+class FingerprintGetAuthenticatorIdClient extends BaseClientMonitor<ISession> {
private static final String TAG = "FingerprintGetAuthenticatorIdClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java
index 3d07334f04a1..80d1a0ffea6b 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClient.java
@@ -18,13 +18,13 @@ package com.android.server.biometrics.sensors.fingerprint.aidl;
import android.annotation.NonNull;
import android.content.Context;
+import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.fingerprint.Fingerprint;
import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.sensors.InvalidationClient;
-import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import java.util.Map;
@@ -33,8 +33,8 @@ public class FingerprintInvalidationClient extends InvalidationClient<Fingerprin
public FingerprintInvalidationClient(@NonNull Context context,
@NonNull LazyDaemon<ISession> lazyDaemon, int userId, int sensorId,
- @NonNull FingerprintUtils utils, @NonNull Map<Integer, Long> authenticatorIds) {
- super(context, lazyDaemon, userId, sensorId, utils, authenticatorIds);
+ @NonNull Map<Integer, Long> authenticatorIds, @NonNull IInvalidationCallback callback) {
+ super(context, lazyDaemon, userId, sensorId, authenticatorIds, callback);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index a03debadf36c..d65ecfffcf79 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -23,6 +23,7 @@ import android.app.ActivityTaskManager;
import android.app.TaskStackListener;
import android.content.Context;
import android.content.pm.UserInfo;
+import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.SensorProps;
@@ -43,7 +44,7 @@ import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.PerformanceTracker;
@@ -73,7 +74,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@NonNull private final String mHalInstanceName;
@NonNull @VisibleForTesting
final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports
- @NonNull private final ClientMonitor.LazyDaemon<IFingerprint> mLazyDaemon;
+ @NonNull private final BaseClientMonitor.LazyDaemon<IFingerprint> mLazyDaemon;
@NonNull private final Handler mHandler;
@NonNull private final LockoutResetDispatcher mLockoutResetDispatcher;
@NonNull private final ActivityTaskManager mActivityTaskManager;
@@ -87,7 +88,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
public void onTaskStackChanged() {
mHandler.post(() -> {
for (int i = 0; i < mSensors.size(); i++) {
- final ClientMonitor<?> client = mSensors.valueAt(i).getScheduler()
+ final BaseClientMonitor<?> client = mSensors.valueAt(i).getScheduler()
.getCurrentClient();
if (!(client instanceof AuthenticationClient)) {
Slog.e(getTag(), "Task stack changed for client: " + client);
@@ -186,7 +187,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
return mDaemon;
}
- private void scheduleForSensor(int sensorId, @NonNull ClientMonitor<?> client) {
+ private void scheduleForSensor(int sensorId, @NonNull BaseClientMonitor<?> client) {
if (!mSensors.contains(sensorId)) {
throw new IllegalStateException("Unable to schedule client: " + client
+ " for sensor: " + sensorId);
@@ -194,8 +195,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client);
}
- private void scheduleForSensor(int sensorId, @NonNull ClientMonitor<?> client,
- ClientMonitor.Callback callback) {
+ private void scheduleForSensor(int sensorId, @NonNull BaseClientMonitor<?> client,
+ BaseClientMonitor.Callback callback) {
if (!mSensors.contains(sensorId)) {
throw new IllegalStateException("Unable to schedule client: " + client
+ " for sensor: " + sensorId);
@@ -370,9 +371,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
mUdfpsOverlayController, maxTemplatesPerUser, shouldLogMetrics);
- scheduleForSensor(sensorId, client, new ClientMonitor.Callback() {
+ scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor,
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor,
boolean success) {
if (success) {
scheduleLoadAuthenticatorIdsForUser(sensorId, userId);
@@ -542,6 +543,33 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
}
@Override
+ public void scheduleInvalidateAuthenticatorId(int sensorId, int userId,
+ @NonNull IInvalidationCallback callback) {
+ mHandler.post(() -> {
+ final IFingerprint daemon = getHalInstance();
+ if (daemon == null) {
+ Slog.e(getTag(), "Null daemon during scheduleInvalidateAuthenticatorId: "
+ + sensorId);
+ return;
+ }
+
+ try {
+ if (!mSensors.get(sensorId).hasSessionForUser(userId)) {
+ createNewSessionWithoutHandler(daemon, sensorId, userId);
+ }
+
+ final FingerprintInvalidationClient client =
+ new FingerprintInvalidationClient(mContext,
+ mSensors.get(sensorId).getLazySession(), userId, sensorId,
+ mSensors.get(sensorId).getAuthenticatorIds(), callback);
+ mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client);
+ } catch (RemoteException e) {
+ Slog.e(getTag(), "Remote exception", e);
+ }
+ });
+ }
+
+ @Override
public int getLockoutModeForUser(int sensorId, int userId) {
return mSensors.get(sensorId).getLockoutCache().getLockoutModeForUser(userId);
}
@@ -553,7 +581,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@Override
public void onPointerDown(int sensorId, int x, int y, float minor, float major) {
- final ClientMonitor<?> client = mSensors.get(sensorId).getScheduler().getCurrentClient();
+ final BaseClientMonitor<?> client =
+ mSensors.get(sensorId).getScheduler().getCurrentClient();
if (!(client instanceof Udfps)) {
Slog.e(getTag(), "onPointerDown received during client: " + client);
return;
@@ -564,7 +593,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@Override
public void onPointerUp(int sensorId) {
- final ClientMonitor<?> client = mSensors.get(sensorId).getScheduler().getCurrentClient();
+ final BaseClientMonitor<?> client =
+ mSensors.get(sensorId).getScheduler().getCurrentClient();
if (!(client instanceof Udfps)) {
Slog.e(getTag(), "onPointerUp received during client: " + client);
return;
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java
index 1f1d19d07121..3bdcc1dc4a32 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintResetLockoutClient.java
@@ -26,7 +26,7 @@ import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.LockoutCache;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -36,7 +36,7 @@ import com.android.server.biometrics.sensors.LockoutTracker;
* Updates the framework's lockout cache and notifies clients such as Keyguard when lockout is
* cleared.
*/
-class FingerprintResetLockoutClient extends ClientMonitor<ISession> {
+class FingerprintResetLockoutClient extends BaseClientMonitor<ISession> {
private static final String TAG = "FingerprintResetLockoutClient";
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
index bb0f9830603c..c0f0577aac0e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
@@ -45,8 +45,8 @@ import com.android.server.biometrics.UserStateProto;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.AuthenticationConsumer;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
-import com.android.server.biometrics.sensors.ClientMonitor;
import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.Interruptable;
import com.android.server.biometrics.sensors.LockoutCache;
@@ -78,7 +78,7 @@ class Sensor implements IBinder.DeathRecipient {
@NonNull private final Map<Integer, Long> mAuthenticatorIds;
@Nullable private Session mCurrentSession;
- @NonNull private final ClientMonitor.LazyDaemon<ISession> mLazySession;
+ @NonNull private final BaseClientMonitor.LazyDaemon<ISession> mLazySession;
static class Session {
@NonNull private final String mTag;
@@ -136,7 +136,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onChallengeGenerated(long challenge) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FingerprintGenerateChallengeClient)) {
Slog.e(mTag, "onChallengeGenerated for wrong client: "
+ Utils.getClientName(client));
@@ -152,7 +152,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onChallengeRevoked(long challenge) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FingerprintRevokeChallengeClient)) {
Slog.e(mTag, "onChallengeRevoked for wrong client: "
+ Utils.getClientName(client));
@@ -168,7 +168,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onAcquired(byte info, int vendorCode) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AcquisitionClient)) {
Slog.e(mTag, "onAcquired for non-acquisition client: "
+ Utils.getClientName(client));
@@ -183,7 +183,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onError(byte error, int vendorCode) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
Slog.d(mTag, "onError"
+ ", client: " + Utils.getClientName(client)
+ ", error: " + error
@@ -206,7 +206,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onEnrollmentProgress(int enrollmentId, int remaining) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FingerprintEnrollClient)) {
Slog.e(mTag, "onEnrollmentProgress for non-enroll client: "
+ Utils.getClientName(client));
@@ -226,7 +226,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onAuthenticationSucceeded(int enrollmentId, HardwareAuthToken hat) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AuthenticationConsumer)) {
Slog.e(mTag, "onAuthenticationSucceeded for non-authentication consumer: "
+ Utils.getClientName(client));
@@ -249,7 +249,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onAuthenticationFailed() {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AuthenticationConsumer)) {
Slog.e(mTag, "onAuthenticationFailed for non-authentication consumer: "
+ Utils.getClientName(client));
@@ -267,7 +267,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onLockoutTimed(long durationMillis) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof LockoutConsumer)) {
Slog.e(mTag, "onLockoutTimed for non-lockout consumer: "
+ Utils.getClientName(client));
@@ -282,7 +282,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onLockoutPermanent() {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof LockoutConsumer)) {
Slog.e(mTag, "onLockoutPermanent for non-lockout consumer: "
+ Utils.getClientName(client));
@@ -297,7 +297,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onLockoutCleared() {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FingerprintResetLockoutClient)) {
Slog.e(mTag, "onLockoutCleared for non-resetLockout client: "
+ Utils.getClientName(client));
@@ -313,7 +313,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onInteractionDetected() {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FingerprintDetectClient)) {
Slog.e(mTag, "onInteractionDetected for non-detect client: "
+ Utils.getClientName(client));
@@ -329,7 +329,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onEnrollmentsEnumerated(int[] enrollmentIds) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof EnumerateConsumer)) {
Slog.e(mTag, "onEnrollmentsEnumerated for non-enumerate consumer: "
+ Utils.getClientName(client));
@@ -352,7 +352,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onEnrollmentsRemoved(int[] enrollmentIds) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof RemovalConsumer)) {
Slog.e(mTag, "onRemoved for non-removal consumer: "
+ Utils.getClientName(client));
@@ -374,7 +374,7 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onAuthenticatorIdRetrieved(long authenticatorId) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FingerprintGetAuthenticatorIdClient)) {
Slog.e(mTag, "onAuthenticatorIdRetrieved for wrong consumer: "
+ Utils.getClientName(client));
@@ -389,7 +389,18 @@ class Sensor implements IBinder.DeathRecipient {
@Override
public void onAuthenticatorIdInvalidated(long newAuthenticatorId) {
- // TODO(159667191)
+ mHandler.post(() -> {
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
+ if (!(client instanceof FingerprintInvalidationClient)) {
+ Slog.e(mTag, "onAuthenticatorIdInvalidated for wrong consumer: "
+ + Utils.getClientName(client));
+ return;
+ }
+
+ final FingerprintInvalidationClient invalidationClient =
+ (FingerprintInvalidationClient) client;
+ invalidationClient.onAuthenticatorIdInvalidated(newAuthenticatorId);
+ });
}
}
@@ -413,7 +424,7 @@ class Sensor implements IBinder.DeathRecipient {
};
}
- @NonNull ClientMonitor.LazyDaemon<ISession> getLazySession() {
+ @NonNull BaseClientMonitor.LazyDaemon<ISession> getLazySession() {
return mLazySession;
}
@@ -494,7 +505,7 @@ class Sensor implements IBinder.DeathRecipient {
public void binderDied() {
Slog.e(mTag, "Binder died");
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (client instanceof Interruptable) {
Slog.e(mTag, "Sending ERROR_HW_UNAVAILABLE for client: " + client);
final Interruptable interruptable = (Interruptable) client;
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index 7989e6e43d7e..e57e675b4455 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -58,8 +58,8 @@ import com.android.server.biometrics.fingerprint.PerformanceStatsProto;
import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.AuthenticationConsumer;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
-import com.android.server.biometrics.sensors.ClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnumerateConsumer;
import com.android.server.biometrics.sensors.Interruptable;
@@ -103,7 +103,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
private final LockoutResetDispatcher mLockoutResetDispatcher;
private final LockoutFrameworkImpl mLockoutTracker;
private final BiometricTaskStackListener mTaskStackListener;
- private final ClientMonitor.LazyDaemon<IBiometricsFingerprint> mLazyDaemon;
+ private final BaseClientMonitor.LazyDaemon<IBiometricsFingerprint> mLazyDaemon;
private final Map<Integer, Long> mAuthenticatorIds;
@Nullable private IBiometricsFingerprint mDaemon;
@@ -116,7 +116,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void onTaskStackChanged() {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AuthenticationClient)) {
Slog.e(TAG, "Task stack changed for client: " + client);
return;
@@ -188,7 +188,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof FingerprintEnrollClient)) {
Slog.e(TAG, "onEnrollResult for non-enroll client: "
+ Utils.getClientName(client));
@@ -213,7 +213,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void onAcquired_2_2(long deviceId, int acquiredInfo, int vendorCode) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AcquisitionClient)) {
Slog.e(TAG, "onAcquired for non-acquisition client: "
+ Utils.getClientName(client));
@@ -229,7 +229,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
public void onAuthenticated(long deviceId, int fingerId, int groupId,
ArrayList<Byte> token) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AuthenticationConsumer)) {
Slog.e(TAG, "onAuthenticated for non-authentication consumer: "
+ Utils.getClientName(client));
@@ -247,7 +247,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void onError(long deviceId, int error, int vendorCode) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
Slog.d(TAG, "handleError"
+ ", client: " + Utils.getClientName(client)
+ ", error: " + error
@@ -273,7 +273,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
public void onRemoved(long deviceId, int fingerId, int groupId, int remaining) {
mHandler.post(() -> {
Slog.d(TAG, "Removed, fingerId: " + fingerId + ", remaining: " + remaining);
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof RemovalConsumer)) {
Slog.e(TAG, "onRemoved for non-removal consumer: "
+ Utils.getClientName(client));
@@ -289,7 +289,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void onEnumerate(long deviceId, int fingerId, int groupId, int remaining) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof EnumerateConsumer)) {
Slog.e(TAG, "onEnumerate for non-enumerate consumer: "
+ Utils.getClientName(client));
@@ -379,7 +379,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
mDaemon = null;
mCurrentUserId = UserHandle.USER_NULL;
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (client instanceof Interruptable) {
Slog.e(TAG, "Sending ERROR_HW_UNAVAILABLE for client: " + client);
final Interruptable interruptable = (Interruptable) client;
@@ -484,9 +484,10 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
new FingerprintUpdateActiveUserClient(mContext, mLazyDaemon, targetUserId,
mContext.getOpPackageName(), mSensorProperties.sensorId, mCurrentUserId,
hasEnrolled, mAuthenticatorIds);
- mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
+ mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor, boolean success) {
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor,
+ boolean success) {
if (success) {
mCurrentUserId = targetUserId;
}
@@ -557,9 +558,9 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
hardwareAuthToken, opPackageName, FingerprintUtils.getLegacyInstance(mSensorId),
ENROLL_TIMEOUT_SEC, mSensorProperties.sensorId, mUdfpsOverlayController,
shouldLogMetrics);
- mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
+ mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
- public void onClientFinished(@NonNull ClientMonitor<?> clientMonitor,
+ public void onClientFinished(@NonNull BaseClientMonitor<?> clientMonitor,
boolean success) {
if (success) {
// Update authenticatorIds
@@ -686,7 +687,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void onPointerDown(int sensorId, int x, int y, float minor, float major) {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof Udfps)) {
Slog.w(TAG, "onFingerDown received during client: " + client);
return;
@@ -697,7 +698,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void onPointerUp(int sensorId) {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof Udfps)) {
Slog.w(TAG, "onFingerDown received during client: " + client);
return;
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java
index 791d224b9728..3ea23666b764 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java
@@ -40,8 +40,8 @@ import android.util.SparseBooleanArray;
import com.android.internal.R;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationConsumer;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
-import com.android.server.biometrics.sensors.ClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
@@ -146,14 +146,14 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
class TestableInternalCallback extends InternalCallback {
@Override
- public void onClientStarted(ClientMonitor<?> clientMonitor) {
+ public void onClientStarted(BaseClientMonitor<?> clientMonitor) {
super.onClientStarted(clientMonitor);
Slog.d(TAG, "Client started: " + clientMonitor);
mFingerprint21.setDebugMessage("Started: " + clientMonitor);
}
@Override
- public void onClientFinished(ClientMonitor<?> clientMonitor, boolean success) {
+ public void onClientFinished(BaseClientMonitor<?> clientMonitor, boolean success) {
super.onClientFinished(clientMonitor, success);
Slog.d(TAG, "Client finished: " + clientMonitor);
mFingerprint21.setDebugMessage("Finished: " + clientMonitor);
@@ -175,7 +175,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
/**
* All of the mocking/testing should happen in here. This way we don't need to modify the
- * {@link com.android.server.biometrics.sensors.ClientMonitor} implementations and can run the
+ * {@link BaseClientMonitor} implementations and can run the
* real path there.
*/
private static class MockHalResultController extends HalResultController {
@@ -233,7 +233,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
public void onAuthenticated(long deviceId, int fingerId, int groupId,
ArrayList<Byte> token) {
mHandler.post(() -> {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
if (!(client instanceof AuthenticationConsumer)) {
Slog.e(TAG, "Non authentication consumer: " + client);
return;
@@ -360,7 +360,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
@Override
public void run() {
- final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> client = mScheduler.getCurrentClient();
// We don't care about FingerprintDetectClient, since accept/rejects are both OK. UDFPS
// rejects will just simulate the path where non-enrolled fingers are presented.
@@ -466,7 +466,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
Slog.d(TAG, "onFingerDown");
final AuthenticationConsumer lastAuthenticatedConsumer =
mMockHalResultController.getLastAuthenticatedClient();
- final ClientMonitor<?> currentScheduledClient = mScheduler.getCurrentClient();
+ final BaseClientMonitor<?> currentScheduledClient = mScheduler.getCurrentClient();
if (currentScheduledClient == null) {
Slog.d(TAG, "Not authenticating");
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java
index 00e2413c2f38..2a4c2ef5b181 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java
@@ -26,7 +26,7 @@ import android.os.RemoteException;
import android.os.SELinux;
import android.util.Slog;
-import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import java.io.File;
import java.util.Map;
@@ -34,7 +34,7 @@ import java.util.Map;
/**
* Sets the HAL's current active user, and updates the framework's authenticatorId cache.
*/
-public class FingerprintUpdateActiveUserClient extends ClientMonitor<IBiometricsFingerprint> {
+public class FingerprintUpdateActiveUserClient extends BaseClientMonitor<IBiometricsFingerprint> {
private static final String TAG = "FingerprintUpdateActiveUserClient";
private static final String FP_DATA_DIR = "fpdata";
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 50e50bc7356b..a207a96f4663 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -235,10 +235,6 @@ public class InputManagerService extends IInputManager.Stub
IInputFilter mInputFilter; // guarded by mInputFilterLock
InputFilterHost mInputFilterHost; // guarded by mInputFilterLock
- private final Object mGestureMonitorPidsLock = new Object();
- @GuardedBy("mGestureMonitorPidsLock")
- private final ArrayMap<IBinder, Integer> mGestureMonitorPidsByToken = new ArrayMap<>();
-
// The associations of input devices to displays by port. Maps from input device port (String)
// to display id (int). Currently only accessed by InputReader.
private final Map<String, Integer> mStaticAssociations;
@@ -640,9 +636,6 @@ public class InputManagerService extends IInputManager.Stub
InputChannel inputChannel = nativeCreateInputMonitor(
mPtr, displayId, true /*isGestureMonitor*/, inputChannelName, pid);
InputMonitorHost host = new InputMonitorHost(inputChannel.getToken());
- synchronized (mGestureMonitorPidsLock) {
- mGestureMonitorPidsByToken.put(inputChannel.getToken(), pid);
- }
return new InputMonitor(inputChannel, host);
} finally {
Binder.restoreCallingIdentity(ident);
@@ -666,9 +659,6 @@ public class InputManagerService extends IInputManager.Stub
if (connectionToken == null) {
throw new IllegalArgumentException("connectionToken must not be null.");
}
- synchronized (mGestureMonitorPidsLock) {
- mGestureMonitorPidsByToken.remove(connectionToken);
- }
nativeRemoveInputChannel(mPtr, connectionToken);
}
@@ -2167,7 +2157,6 @@ public class InputManagerService extends IInputManager.Stub
if (dumpStr != null) {
pw.println(dumpStr);
dumpAssociations(pw);
- dumpGestureMonitorPidsByToken(pw);
}
}
@@ -2191,19 +2180,6 @@ public class InputManagerService extends IInputManager.Stub
}
}
- private void dumpGestureMonitorPidsByToken(PrintWriter pw) {
- synchronized (mGestureMonitorPidsLock) {
- if (!mGestureMonitorPidsByToken.isEmpty()) {
- pw.println("Gesture monitor pids by token:");
- for (int i = 0; i < mGestureMonitorPidsByToken.size(); i++) {
- pw.print(" " + i + ": ");
- pw.print(" token: " + mGestureMonitorPidsByToken.keyAt(i));
- pw.println(" pid: " + mGestureMonitorPidsByToken.valueAt(i));
- }
- }
- }
- }
-
private boolean checkCallingPermission(String permission, String func) {
// Quick check: if the calling permission is me, it's all okay.
if (Binder.getCallingPid() == Process.myPid()) {
@@ -2226,7 +2202,6 @@ public class InputManagerService extends IInputManager.Stub
public void monitor() {
synchronized (mInputFilterLock) { }
synchronized (mAssociationsLock) { /* Test if blocked by associations lock. */}
- synchronized (mGestureMonitorPidsLock) { /* Test if blocked by gesture monitor pids lock */}
synchronized (mLidSwitchLock) { /* Test if blocked by lid switch lock. */ }
nativeMonitor(mPtr);
}
@@ -2296,9 +2271,6 @@ public class InputManagerService extends IInputManager.Stub
// Native callback.
private void notifyInputChannelBroken(IBinder token) {
- synchronized (mGestureMonitorPidsLock) {
- mGestureMonitorPidsByToken.remove(token);
- }
mWindowManagerCallbacks.notifyInputChannelBroken(token);
}
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
index e8052289cca4..83b6ecae7780 100644
--- a/services/core/java/com/android/server/location/LocationManagerService.java
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -807,22 +807,7 @@ public class LocationManagerService extends ILocationManager.Stub {
@Override
public LocationTime getGnssTimeMillis() {
- synchronized (mLock) {
- LocationProviderManager gpsManager = getLocationProviderManager(GPS_PROVIDER);
- if (gpsManager == null) {
- return null;
- }
-
- Location location = gpsManager.getLastLocationUnsafe(UserHandle.USER_ALL,
- PERMISSION_FINE, false, Long.MAX_VALUE);
- if (location == null) {
- return null;
- }
-
- long currentNanos = SystemClock.elapsedRealtimeNanos();
- long deltaMs = NANOSECONDS.toMillis(location.getElapsedRealtimeAgeNanos(currentNanos));
- return new LocationTime(location.getTime() + deltaMs, currentNanos);
- }
+ return mLocalService.getGnssTimeMillis();
}
@Override
@@ -1292,6 +1277,25 @@ public class LocationManagerService extends ILocationManager.Stub {
mGnssManagerService.sendNiResponse(notifId, userResponse);
}
}
+
+ @Override
+ public @Nullable LocationTime getGnssTimeMillis() {
+ LocationProviderManager gpsManager = getLocationProviderManager(GPS_PROVIDER);
+ if (gpsManager == null) {
+ return null;
+ }
+
+ Location location = gpsManager.getLastLocationUnsafe(UserHandle.USER_ALL,
+ PERMISSION_FINE, false, Long.MAX_VALUE);
+ if (location == null) {
+ return null;
+ }
+
+ long currentNanos = SystemClock.elapsedRealtimeNanos();
+ long deltaMs = NANOSECONDS.toMillis(
+ location.getElapsedRealtimeAgeNanos(currentNanos));
+ return new LocationTime(location.getTime() + deltaMs, currentNanos);
+ }
}
private static class SystemInjector implements Injector {
diff --git a/services/core/java/com/android/server/location/LocationShellCommand.java b/services/core/java/com/android/server/location/LocationShellCommand.java
index 0fe66e0b4ea1..f0dd8b559d64 100644
--- a/services/core/java/com/android/server/location/LocationShellCommand.java
+++ b/services/core/java/com/android/server/location/LocationShellCommand.java
@@ -49,6 +49,12 @@ class LocationShellCommand extends BasicShellCommandHandler {
}
switch (cmd) {
+ case "is-location-enabled": {
+ int userId = parseUserId();
+ boolean enabled = mService.isLocationEnabledForUser(userId);
+ getOutPrintWriter().println(enabled);
+ return 0;
+ }
case "set-location-enabled": {
int userId = parseUserId();
boolean enabled = Boolean.parseBoolean(getNextArgRequired());
@@ -238,6 +244,8 @@ class LocationShellCommand extends BasicShellCommandHandler {
pw.println("Location service commands:");
pw.println(" help or -h");
pw.println(" Print this help text.");
+ pw.println(" is-location-enabled [--user <USER_ID>]");
+ pw.println(" Gets the master location switch enabled state.");
pw.println(" set-location-enabled [--user <USER_ID>] true|false");
pw.println(" Sets the master location switch enabled state.");
pw.println(" providers");
diff --git a/services/core/java/com/android/server/location/gnss/GnssManagerService.java b/services/core/java/com/android/server/location/gnss/GnssManagerService.java
index 92957aaf2976..b6695c20bd97 100644
--- a/services/core/java/com/android/server/location/gnss/GnssManagerService.java
+++ b/services/core/java/com/android/server/location/gnss/GnssManagerService.java
@@ -193,7 +193,9 @@ public class GnssManagerService {
IGnssMeasurementsListener listener, String packageName,
@Nullable String attributionTag) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION, null);
-
+ if (request.isCorrelationVectorOutputsEnabled()) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.LOCATION_HARDWARE, null);
+ }
CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, attributionTag);
mGnssMeasurementsProvider.addListener(request, identity, listener);
}
diff --git a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java
index b623e279d9ae..305bc9b69e39 100644
--- a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java
+++ b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java
@@ -118,7 +118,8 @@ public final class GnssMeasurementsProvider extends
@Override
protected boolean registerWithService(GnssMeasurementRequest request,
Collection<GnssListenerRegistration> registrations) {
- if (mGnssNative.startMeasurementCollection(request.isFullTracking())) {
+ if (mGnssNative.startMeasurementCollection(request.isFullTracking(),
+ request.isCorrelationVectorOutputsEnabled())) {
if (D) {
Log.d(TAG, "starting gnss measurements (" + request + ")");
}
@@ -160,18 +161,26 @@ public final class GnssMeasurementsProvider extends
protected GnssMeasurementRequest mergeRegistrations(
Collection<GnssListenerRegistration> registrations) {
boolean fullTracking = false;
+ boolean enableCorrVecOutputs = false;
+
if (mSettingsHelper.isGnssMeasurementsFullTrackingEnabled()) {
fullTracking = true;
- } else {
- for (GnssListenerRegistration registration : registrations) {
- if (registration.getRequest().isFullTracking()) {
- fullTracking = true;
- break;
- }
+ }
+
+ for (GnssListenerRegistration registration : registrations) {
+ GnssMeasurementRequest request = registration.getRequest();
+ if (request.isFullTracking()) {
+ fullTracking = true;
+ }
+ if (request.isCorrelationVectorOutputsEnabled()) {
+ enableCorrVecOutputs = true;
}
}
- return new GnssMeasurementRequest.Builder().setFullTracking(fullTracking).build();
+ return new GnssMeasurementRequest.Builder()
+ .setFullTracking(fullTracking)
+ .setCorrelationVectorOutputsEnabled(enableCorrVecOutputs)
+ .build();
}
@Override
diff --git a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java
index 402e84b959c6..7e2f089d32c9 100644
--- a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java
+++ b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java
@@ -733,9 +733,10 @@ public class GnssNative {
/**
* Starts measurement collection.
*/
- public boolean startMeasurementCollection(boolean enableFullTracking) {
+ public boolean startMeasurementCollection(boolean enableFullTracking,
+ boolean enableCorrVecOutputs) {
Preconditions.checkState(mRegistered);
- return mGnssHal.startMeasurementCollection(enableFullTracking);
+ return mGnssHal.startMeasurementCollection(enableFullTracking, enableCorrVecOutputs);
}
/**
@@ -1274,8 +1275,9 @@ public class GnssNative {
return native_is_measurement_supported();
}
- protected boolean startMeasurementCollection(boolean enableFullTracking) {
- return native_start_measurement_collection(enableFullTracking);
+ protected boolean startMeasurementCollection(boolean enableFullTracking,
+ boolean enableCorrVecOutputs) {
+ return native_start_measurement_collection(enableFullTracking, enableCorrVecOutputs);
}
protected boolean stopMeasurementCollection() {
@@ -1438,7 +1440,8 @@ public class GnssNative {
private static native boolean native_is_measurement_supported();
- private static native boolean native_start_measurement_collection(boolean enableFullTracking);
+ private static native boolean native_start_measurement_collection(boolean enableFullTracking,
+ boolean enableCorrVecOutputs);
private static native boolean native_stop_measurement_collection();
diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
index 14f010063538..b06389acd79d 100644
--- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java
+++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
@@ -18,7 +18,6 @@ package com.android.server.location.provider;
import static android.app.compat.CompatChanges.isChangeEnabled;
import static android.location.LocationManager.DELIVER_HISTORICAL_LOCATIONS;
-import static android.location.LocationManager.FUSED_PROVIDER;
import static android.location.LocationManager.GPS_PROVIDER;
import static android.location.LocationManager.KEY_FLUSH_COMPLETE;
import static android.location.LocationManager.KEY_LOCATION_CHANGED;
@@ -43,6 +42,7 @@ import static java.lang.Math.min;
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.app.AlarmManager.OnAlarmListener;
+import android.app.BroadcastOptions;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -86,7 +86,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;
import com.android.server.FgThread;
import com.android.server.LocalServices;
-import com.android.server.PendingIntentUtils;
import com.android.server.location.LocationPermissions;
import com.android.server.location.LocationPermissions.PermissionLevel;
import com.android.server.location.fudger.LocationFudger;
@@ -131,6 +130,9 @@ public class LocationProviderManager extends
private static final String WAKELOCK_TAG = "*location*";
private static final long WAKELOCK_TIMEOUT_MS = 30 * 1000;
+ // duration PI location clients are put on the allowlist to start a fg service
+ private static final long TEMPORARY_APP_ALLOWLIST_DURATION_MS = 10 * 1000;
+
// fastest interval at which clients may receive coarse locations
private static final long MIN_COARSE_INTERVAL_MS = 10 * 60 * 1000;
@@ -215,6 +217,11 @@ public class LocationProviderManager extends
public void deliverOnLocationChanged(LocationResult locationResult,
@Nullable Runnable onCompleteCallback)
throws PendingIntent.CanceledException {
+ BroadcastOptions options = BroadcastOptions.makeBasic();
+ options.setDontSendToRestrictedApps(true);
+ // allows apps to start a fg service in response to a location PI
+ options.setTemporaryAppWhitelistDuration(TEMPORARY_APP_ALLOWLIST_DURATION_MS);
+
mPendingIntent.send(
mContext,
0,
@@ -225,22 +232,26 @@ public class LocationProviderManager extends
: null,
null,
null,
- PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
+ options.toBundle());
}
@Override
public void deliverOnFlushComplete(int requestCode) throws PendingIntent.CanceledException {
+ BroadcastOptions options = BroadcastOptions.makeBasic();
+ options.setDontSendToRestrictedApps(true);
+
mPendingIntent.send(mContext, 0, new Intent().putExtra(KEY_FLUSH_COMPLETE, requestCode),
- null, null, null,
- PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
+ null, null, null, options.toBundle());
}
@Override
public void deliverOnProviderEnabledChanged(String provider, boolean enabled)
throws PendingIntent.CanceledException {
+ BroadcastOptions options = BroadcastOptions.makeBasic();
+ options.setDontSendToRestrictedApps(true);
+
mPendingIntent.send(mContext, 0, new Intent().putExtra(KEY_PROVIDER_ENABLED, enabled),
- null, null, null,
- PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
+ null, null, null, options.toBundle());
}
}
@@ -2332,8 +2343,8 @@ public class LocationProviderManager extends
// do not send change notifications if we just saw this user for the first time
if (wasEnabled != null) {
- // fused and passive provider never get public updates for legacy reasons
- if (!FUSED_PROVIDER.equals(mName) && !PASSIVE_PROVIDER.equals(mName)) {
+ // passive provider never get public updates for legacy reasons
+ if (!PASSIVE_PROVIDER.equals(mName)) {
Intent intent = new Intent(LocationManager.PROVIDERS_CHANGED_ACTION)
.putExtra(LocationManager.EXTRA_PROVIDER_NAME, mName)
.putExtra(LocationManager.EXTRA_PROVIDER_ENABLED, enabled)
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 1b27ef4c6e1c..c0381e4b1715 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -109,6 +109,10 @@ public class MediaSessionService extends SystemService implements Monitor {
private static final int LONG_PRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout()
+ /* Buffer for delayed delivery of key event */ 50;
private static final int MULTI_TAP_TIMEOUT = ViewConfiguration.getMultiPressTimeout();
+ /**
+ * Copied from Settings.System.MEDIA_BUTTON_RECEIVER
+ */
+ private static final String MEDIA_BUTTON_RECEIVER = "media_button_receiver";
private final Context mContext;
private final SessionManagerImpl mSessionManagerImpl;
@@ -131,7 +135,6 @@ public class MediaSessionService extends SystemService implements Monitor {
private KeyguardManager mKeyguardManager;
private AudioManager mAudioManager;
- private ContentResolver mContentResolver;
private boolean mHasFeatureLeanback;
// The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile)
@@ -183,7 +186,6 @@ public class MediaSessionService extends SystemService implements Monitor {
}
}
}, null /* handler */);
- mContentResolver = mContext.getContentResolver();
mHasFeatureLeanback = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_LEANBACK);
@@ -831,6 +833,7 @@ public class MediaSessionService extends SystemService implements Monitor {
*/
final class FullUserRecord implements MediaSessionStack.OnMediaButtonSessionChangedListener {
private final int mFullUserId;
+ private final ContentResolver mContentResolver;
private final MediaSessionStack mPriorityStack;
private final HashMap<IBinder, OnMediaKeyEventDispatchedListenerRecord>
mOnMediaKeyEventDispatchedListeners = new HashMap<>();
@@ -848,10 +851,12 @@ public class MediaSessionService extends SystemService implements Monitor {
FullUserRecord(int fullUserId) {
mFullUserId = fullUserId;
+ mContentResolver = mContext.createContextAsUser(UserHandle.of(mFullUserId), 0)
+ .getContentResolver();
mPriorityStack = new MediaSessionStack(mAudioPlayerStateMonitor, this);
// Restore the remembered media button receiver before the boot.
- String mediaButtonReceiverInfo = Settings.Secure.getStringForUser(mContentResolver,
- Settings.System.MEDIA_BUTTON_RECEIVER, mFullUserId);
+ String mediaButtonReceiverInfo = Settings.Secure.getString(mContentResolver,
+ MEDIA_BUTTON_RECEIVER);
mLastMediaButtonReceiverHolder =
MediaButtonReceiverHolder.unflattenFromString(
mContext, mediaButtonReceiverInfo);
@@ -970,10 +975,9 @@ public class MediaSessionService extends SystemService implements Monitor {
mLastMediaButtonReceiverHolder = sessionRecord.getMediaButtonReceiver();
String mediaButtonReceiverInfo = (mLastMediaButtonReceiverHolder == null)
? "" : mLastMediaButtonReceiverHolder.flattenToString();
- Settings.Secure.putStringForUser(mContentResolver,
- Settings.System.MEDIA_BUTTON_RECEIVER,
- mediaButtonReceiverInfo,
- mFullUserId);
+ Settings.Secure.putString(mContentResolver,
+ MEDIA_BUTTON_RECEIVER,
+ mediaButtonReceiverInfo);
}
private void pushAddressedPlayerChangedLocked(
diff --git a/services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java b/services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java
index 9c68349af7d5..3e40b2756b10 100644
--- a/services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java
+++ b/services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java
@@ -18,8 +18,11 @@ package com.android.server.media.metrics;
import android.content.Context;
import android.media.metrics.IPlaybackMetricsManager;
+import android.media.metrics.PlaybackErrorEvent;
import android.media.metrics.PlaybackMetrics;
import android.util.Base64;
+import android.util.StatsEvent;
+import android.util.StatsLog;
import com.android.server.SystemService;
@@ -60,5 +63,20 @@ public final class PlaybackMetricsManagerService extends SystemService {
String id = Base64.encodeToString(byteId, Base64.DEFAULT);
return id;
}
+
+ @Override
+ public void reportPlaybackErrorEvent(
+ String sessionId, PlaybackErrorEvent event, int userId) {
+ StatsEvent statsEvent = StatsEvent.newBuilder()
+ .setAtomId(323)
+ .writeString(sessionId)
+ .writeString(event.getExceptionStack())
+ .writeInt(event.getErrorCode())
+ .writeInt(event.getSubErrorCode())
+ .writeLong(event.getTimeSincePlaybackCreatedMillis())
+ .usePooledBuffer()
+ .build();
+ StatsLog.write(statsEvent);
+ }
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index ab5238f1ddbf..61b218ce7196 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -128,6 +128,7 @@ import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.AutomaticZenRule;
+import android.app.BroadcastOptions;
import android.app.IActivityManager;
import android.app.INotificationManager;
import android.app.ITransientNotification;
@@ -5960,7 +5961,9 @@ public class NotificationManagerService extends SystemService {
PendingIntent pendingIntent = notification.allPendingIntents.valueAt(i);
if (pendingIntent != null) {
am.setPendingIntentWhitelistDuration(pendingIntent.getTarget(),
- ALLOWLIST_TOKEN, duration);
+ ALLOWLIST_TOKEN, duration,
+ BroadcastOptions.TEMPORARY_WHITELIST_TYPE_FOREGROUND_SERVICE_ALLOWED
+ );
am.setPendingIntentAllowBgActivityStarts(pendingIntent.getTarget(),
ALLOWLIST_TOKEN, (FLAG_ACTIVITY_SENDER | FLAG_BROADCAST_SENDER
| FLAG_SERVICE_SENDER));
@@ -6078,7 +6081,6 @@ public class NotificationManagerService extends SystemService {
if (!isAppForeground && metadata != null) {
int flags = metadata.getFlags();
flags &= ~Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE;
- flags &= ~Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
metadata.setFlags(flags);
}
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index f4472b4835c3..b65fc7358471 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -30,7 +30,6 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SPLIT;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
import static android.content.pm.PackageManager.INSTALL_STAGED;
import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
-import static android.content.pm.PackageParser.APEX_FILE_EXTENSION;
import static android.system.OsConstants.O_CREAT;
import static android.system.OsConstants.O_RDONLY;
import static android.system.OsConstants.O_WRONLY;
@@ -251,6 +250,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private static final ApkChecksum[] EMPTY_FILE_CHECKSUM_ARRAY = {};
private static final String SYSTEM_DATA_LOADER_PACKAGE = "android";
+ private static final String APEX_FILE_EXTENSION = ".apex";
private static final int INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS = 2000;
private static final int INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS = 7000;
@@ -331,8 +331,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private boolean mCommitted = false;
@GuardedBy("mLock")
private boolean mRelinquished = false;
- @GuardedBy("mLock")
- private boolean mDestroyed = false;
/** Permissions have been accepted by the user (see {@link #setPermissionsResult}) */
@GuardedBy("mLock")
@@ -762,8 +760,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
@GuardedBy("mLock")
private boolean mVerityFound;
- @GuardedBy("mLock")
- private boolean mDataLoaderFinished = false;
+ /**
+ * Both flags should be guarded with mLock whenever changes need to be in lockstep.
+ * Ok to check without mLock in case the proper check is done later, e.g. status callbacks
+ * for DataLoaders with deferred processing.
+ */
+ private volatile boolean mDestroyed = false;
+ private volatile boolean mDataLoaderFinished = false;
@GuardedBy("mLock")
private IncrementalFileStorages mIncrementalFileStorages;
@@ -3562,19 +3565,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return;
}
- synchronized (mLock) {
- if (mDestroyed || mDataLoaderFinished) {
- // No need to worry about post installation
- return;
- }
+ if (mDestroyed || mDataLoaderFinished) {
+ // No need to worry about post installation
+ return;
}
try {
IDataLoader dataLoader = dataLoaderManager.getDataLoader(dataLoaderId);
if (dataLoader == null) {
- synchronized (mLock) {
- mDataLoaderFinished = true;
- }
+ mDataLoaderFinished = true;
dispatchSessionValidationFailure(INSTALL_FAILED_MEDIA_UNAVAILABLE,
"Failure to obtain data loader");
return;
@@ -3607,9 +3606,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
break;
}
case IDataLoaderStatusListener.DATA_LOADER_IMAGE_READY: {
- synchronized (mLock) {
- mDataLoaderFinished = true;
- }
+ mDataLoaderFinished = true;
if (hasParentSessionId()) {
mSessionProvider.getSession(
getParentSessionId()).dispatchSessionSealed();
@@ -3622,9 +3619,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
break;
}
case IDataLoaderStatusListener.DATA_LOADER_IMAGE_NOT_READY: {
- synchronized (mLock) {
- mDataLoaderFinished = true;
- }
+ mDataLoaderFinished = true;
dispatchSessionValidationFailure(INSTALL_FAILED_MEDIA_UNAVAILABLE,
"Failed to prepare image.");
if (manualStartAndDestroy) {
@@ -3643,9 +3638,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
break;
}
case IDataLoaderStatusListener.DATA_LOADER_UNRECOVERABLE:
- synchronized (mLock) {
- mDataLoaderFinished = true;
- }
+ mDataLoaderFinished = true;
dispatchSessionValidationFailure(INSTALL_FAILED_MEDIA_UNAVAILABLE,
"DataLoader reported unrecoverable failure.");
break;
@@ -3683,11 +3676,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
final IStorageHealthListener healthListener = new IStorageHealthListener.Stub() {
@Override
public void onHealthStatus(int storageId, int status) {
- synchronized (mLock) {
- if (mDestroyed || mDataLoaderFinished) {
- // No need to worry about post installation
- return;
- }
+ if (mDestroyed || mDataLoaderFinished) {
+ // No need to worry about post installation
+ return;
}
switch (status) {
@@ -3702,9 +3693,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
// fallthrough
case IStorageHealthListener.HEALTH_STATUS_UNHEALTHY:
// Even ADB installation can't wait for missing pages for too long.
- synchronized (mLock) {
- mDataLoaderFinished = true;
- }
+ mDataLoaderFinished = true;
dispatchSessionValidationFailure(INSTALL_FAILED_MEDIA_UNAVAILABLE,
"Image is missing pages required for installation.");
break;
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index e20ed05dc4b4..19a94b39ea20 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -4762,13 +4762,32 @@ public class UserManagerService extends IUserManager.Stub {
final boolean hasParent = user.profileGroupId != user.id
&& user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID;
if (verbose) {
- pw.printf("%d: id=%d, name=%s, flags=%s%s%s%s%s%s%s\n", i, user.id, user.name,
+ final DevicePolicyManagerInternal dpm = getDevicePolicyManagerInternal();
+ String deviceOwner = "";
+ String profileOwner = "";
+ if (dpm != null) {
+ final long ident = Binder.clearCallingIdentity();
+ // NOTE: dpm methods below CANNOT be called while holding the mUsersLock
+ try {
+ if (dpm.getDeviceOwnerUserId() == user.id) {
+ deviceOwner = " (device-owner)";
+ }
+ if (dpm.getProfileOwnerAsUser(user.id) != null) {
+ profileOwner = " (profile-owner)";
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ pw.printf("%d: id=%d, name=%s, flags=%s%s%s%s%s%s%s%s%s\n", i, user.id,
+ user.name,
UserInfo.flagsToString(user.flags),
hasParent ? " (parentId=" + user.profileGroupId + ")" : "",
running ? " (running)" : "",
user.partial ? " (partial)" : "",
user.preCreated ? " (pre-created)" : "",
user.convertedFromPreCreated ? " (converted)" : "",
+ deviceOwner, profileOwner,
current ? " (current)" : "");
} else {
// NOTE: the standard "list users" command is used by integration tests and
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
index d0c632350270..2ead3bedab0f 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
@@ -27,7 +27,6 @@ import android.app.timezonedetector.ITimeZoneDetectorService;
import android.app.timezonedetector.ManualTimeZoneSuggestion;
import android.app.timezonedetector.TelephonyTimeZoneSuggestion;
import android.content.Context;
-import android.location.LocationManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -35,7 +34,6 @@ import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.SystemProperties;
-import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.IndentingPrintWriter;
import android.util.Slog;
@@ -335,19 +333,6 @@ public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub
return isGeoLocationTimeZoneDetectionEnabled(mContext);
}
- boolean isLocationEnabled(@UserIdInt int userId) {
- enforceManageTimeZoneDetectorPermission();
-
- final long token = mCallerIdentityInjector.clearCallingIdentity();
- try {
- UserHandle user = UserHandle.of(userId);
- LocationManager locationManager = mContext.getSystemService(LocationManager.class);
- return locationManager.isLocationEnabledForUser(user);
- } finally {
- mCallerIdentityInjector.restoreCallingIdentity(token);
- }
- }
-
@Override
protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw,
@Nullable String[] args) {
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java
index e965f55e49d7..8c529c42fc8a 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java
@@ -18,7 +18,6 @@ package com.android.server.timezonedetector;
import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_IS_AUTO_DETECTION_ENABLED;
import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_IS_GEO_DETECTION_ENABLED;
import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_IS_GEO_DETECTION_SUPPORTED;
-import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_IS_LOCATION_ENABLED;
import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SET_AUTO_DETECTION_ENABLED;
import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SET_GEO_DETECTION_ENABLED;
import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SUGGEST_GEO_LOCATION_TIME_ZONE;
@@ -57,8 +56,6 @@ class TimeZoneDetectorShellCommand extends ShellCommand {
return runSetAutoDetectionEnabled();
case SHELL_COMMAND_IS_GEO_DETECTION_SUPPORTED:
return runIsGeoDetectionSupported();
- case SHELL_COMMAND_IS_LOCATION_ENABLED:
- return runIsLocationEnabled();
case SHELL_COMMAND_IS_GEO_DETECTION_ENABLED:
return runIsGeoDetectionEnabled();
case SHELL_COMMAND_SET_GEO_DETECTION_ENABLED:
@@ -92,14 +89,6 @@ class TimeZoneDetectorShellCommand extends ShellCommand {
return 0;
}
- private int runIsLocationEnabled() {
- final PrintWriter pw = getOutPrintWriter();
- int userId = UserHandle.USER_CURRENT;
- boolean enabled = mInterface.isLocationEnabled(userId);
- pw.println(enabled);
- return 0;
- }
-
private int runIsGeoDetectionEnabled() {
final PrintWriter pw = getOutPrintWriter();
int userId = UserHandle.USER_CURRENT;
@@ -176,9 +165,6 @@ class TimeZoneDetectorShellCommand extends ShellCommand {
pw.printf(" %s\n", SHELL_COMMAND_IS_GEO_DETECTION_SUPPORTED);
pw.println(" Prints true/false according to whether geolocation time zone detection is"
+ " supported on this device");
- pw.printf(" %s\n", SHELL_COMMAND_IS_LOCATION_ENABLED);
- pw.println(" Prints true/false according to whether the master location toggle is"
- + " enabled for the current user");
pw.printf(" %s\n", SHELL_COMMAND_IS_GEO_DETECTION_ENABLED);
pw.println(" Prints true/false according to the geolocation tz detection setting");
pw.printf(" %s true|false\n", SHELL_COMMAND_SET_GEO_DETECTION_ENABLED);
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index ff5b65b61807..a1d2f8a927f7 100755
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -1874,6 +1874,46 @@ public final class TvInputManagerService extends SystemService {
}
@Override
+ public void pauseRecording(IBinder sessionToken, @NonNull Bundle params, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
+ userId, "pauseRecording");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ try {
+ getSessionLocked(sessionToken, callingUid, resolvedUserId)
+ .pauseRecording(params);
+ } catch (RemoteException | SessionNotFoundException e) {
+ Slog.e(TAG, "error in pauseRecording", e);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void resumeRecording(IBinder sessionToken, @NonNull Bundle params, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
+ userId, "resumeRecording");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ try {
+ getSessionLocked(sessionToken, callingUid, resolvedUserId)
+ .resumeRecording(params);
+ } catch (RemoteException | SessionNotFoundException e) {
+ Slog.e(TAG, "error in resumeRecording", e);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public List<TvInputHardwareInfo> getHardwareList() throws RemoteException {
if (mContext.checkCallingPermission(android.Manifest.permission.TV_INPUT_HARDWARE)
!= PackageManager.PERMISSION_GRANTED) {
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index 03cf021d0e9b..6bca4843e009 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -288,7 +288,7 @@ class ActivityMetricsLogger {
return;
}
mLastLaunchedActivity = r;
- if (!r.noDisplay) {
+ if (!r.noDisplay && !r.isReportedDrawn()) {
if (DEBUG_METRICS) Slog.i(TAG, "Add pending draw " + r);
mPendingDrawActivities.add(r);
}
@@ -576,7 +576,7 @@ class ActivityMetricsLogger {
+ " processSwitch=" + processSwitch + " info=" + info);
}
- if (launchedActivity.isReportedDrawn()) {
+ if (launchedActivity.isReportedDrawn() && launchedActivity.isVisible()) {
// Launched activity is already visible. We cannot measure windows drawn delay.
abort(info, "launched activity already visible");
return;
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index 166663a3ba78..ecdef3f4ab75 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -385,15 +385,6 @@ public abstract class ActivityTaskManagerInternal {
}
}
- /**
- * Set the corresponding display information for the process global configuration. To be called
- * when we need to show IME on a different display.
- *
- * @param pid The process id associated with the IME window.
- * @param displayId The ID of the display showing the IME.
- */
- public abstract void onImeWindowSetOnDisplay(int pid, int displayId);
-
public abstract void sendActivityResult(int callingUid, IBinder activityToken,
String resultWho, int requestCode, int resultCode, Intent data);
public abstract void clearPendingResultForActivity(
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 9bee59cd3ee3..3c06488e73c3 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -5014,6 +5014,34 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
}
+ /**
+ * Sets the corresponding {@link DisplayArea} information for the process global
+ * configuration. To be called when we need to show IME on a different {@link DisplayArea}
+ * or display.
+ *
+ * @param pid The process id associated with the IME window.
+ * @param imeContainer The DisplayArea that contains the IME window.
+ */
+ void onImeWindowSetOnDisplayArea(final int pid, @NonNull final DisplayArea imeContainer) {
+ // Don't update process-level configuration for Multi-Client IME process since other
+ // IMEs on other displays will also receive this configuration change due to IME
+ // services use the same application config/context.
+ if (InputMethodSystemProperty.MULTI_CLIENT_IME_ENABLED) return;
+
+ if (pid == MY_PID || pid < 0) {
+ ProtoLog.w(WM_DEBUG_CONFIGURATION,
+ "Trying to update display configuration for system/invalid process.");
+ return;
+ }
+ final WindowProcessController process = mProcessMap.getProcess(pid);
+ if (process == null) {
+ ProtoLog.w(WM_DEBUG_CONFIGURATION, "Trying to update display "
+ + "configuration for invalid process, pid=%d", pid);
+ return;
+ }
+ process.registerDisplayAreaConfigurationListener(imeContainer);
+ }
+
final class H extends Handler {
static final int REPORT_TIME_TRACKER_MSG = 1;
@@ -5517,44 +5545,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
}
- /**
- * Set the corresponding display information for the process global configuration. To be
- * called when we need to show IME on a different display.
- *
- * @param pid The process id associated with the IME window.
- * @param displayId The ID of the display showing the IME.
- */
- @Override
- public void onImeWindowSetOnDisplay(final int pid, final int displayId) {
- // Don't update process-level configuration for Multi-Client IME process since other
- // IMEs on other displays will also receive this configuration change due to IME
- // services use the same application config/context.
- if (InputMethodSystemProperty.MULTI_CLIENT_IME_ENABLED) return;
-
- if (pid == MY_PID || pid < 0) {
- ProtoLog.w(WM_DEBUG_CONFIGURATION,
- "Trying to update display configuration for system/invalid process.");
- return;
- }
- synchronized (mGlobalLock) {
- final DisplayContent displayContent =
- mRootWindowContainer.getDisplayContent(displayId);
- if (displayContent == null) {
- // Call might come when display is not yet added or has been removed.
- ProtoLog.w(WM_DEBUG_CONFIGURATION, "Trying to update display "
- + "configuration for non-existing displayId=%d", displayId);
- return;
- }
- final WindowProcessController process = mProcessMap.getProcess(pid);
- if (process == null) {
- ProtoLog.w(WM_DEBUG_CONFIGURATION, "Trying to update display "
- + "configuration for invalid process, pid=%d", pid);
- return;
- }
- process.registerDisplayConfigurationListener(displayContent);
- }
- }
-
@Override
public void sendActivityResult(int callingUid, IBinder activityToken, String resultWho,
int requestCode, int resultCode, Intent data) {
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index 1fd6d00ff2b7..15483cb90ce2 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -564,22 +564,6 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
}
@Override
- void onParentChanged(ConfigurationContainer newParent, ConfigurationContainer oldParent) {
- super.onParentChanged(newParent, oldParent);
- if (mOrganizer != null || newParent == null) {
- return;
- }
- // Check if we have a registered organizer, just after mSurfaceControl is ready.
- setOrganizer(mOrganizerController.getOrganizerByFeature(mFeatureId));
- }
-
- @Override
- void removeImmediately() {
- setOrganizer(null);
- super.removeImmediately();
- }
-
- @Override
DisplayArea getDisplayArea() {
return this;
}
diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
index 38f78c94efc3..53f700938bf1 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
@@ -21,7 +21,6 @@ import static android.window.DisplayAreaOrganizer.FEATURE_RUNTIME_TASK_CONTAINER
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
import static com.android.server.wm.DisplayArea.Type.ANY;
-import android.annotation.Nullable;
import android.content.pm.ParceledListSlice;
import android.os.Binder;
import android.os.IBinder;
@@ -51,10 +50,6 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
private final WindowManagerGlobalLock mGlobalLock;
private final HashMap<Integer, IDisplayAreaOrganizer> mOrganizersByFeatureIds = new HashMap();
- @Nullable IDisplayAreaOrganizer getOrganizerByFeature(int featureId) {
- return mOrganizersByFeatureIds.get(featureId);
- }
-
private class DeathRecipient implements IBinder.DeathRecipient {
int mFeature;
IDisplayAreaOrganizer mOrganizer;
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 5d79eb8d7a61..d4629d9f9b8f 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -257,7 +257,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
@Retention(RetentionPolicy.SOURCE)
@interface ForceScalingMode {}
- ActivityTaskManagerService mAtmService;
+ final ActivityTaskManagerService mAtmService;
/**
* Unique logical identifier of this display.
@@ -294,7 +294,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// window containers together and move them in-sync if/when needed. We use a subclass of
// WindowContainer which is omitted from screen magnification, as the IME is never magnified.
// TODO(display-area): is "no magnification" in the comment still true?
- private final ImeContainer mImeWindowsContainers = new ImeContainer(mWmService);
+ private final ImeContainer mImeWindowsContainer = new ImeContainer(mWmService);
@VisibleForTesting
final DisplayAreaPolicy mDisplayAreaPolicy;
@@ -1028,7 +1028,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// Setup the policy and build the display area hierarchy.
mDisplayAreaPolicy = mWmService.getDisplayAreaPolicyProvider().instantiate(
- mWmService, this /* content */, this /* root */, mImeWindowsContainers);
+ mWmService, this /* content */, this /* root */, mImeWindowsContainer);
final List<DisplayArea<? extends WindowContainer>> areas =
mDisplayAreaPolicy.getDisplayAreas(FEATURE_WINDOWED_MAGNIFICATION);
@@ -1125,7 +1125,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
switch (token.windowType) {
case TYPE_INPUT_METHOD:
case TYPE_INPUT_METHOD_DIALOG:
- mImeWindowsContainers.addChild(token);
+ mImeWindowsContainer.addChild(token);
break;
default:
mDisplayAreaPolicy.addWindow(token);
@@ -2410,7 +2410,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
boolean forAllImeWindows(ToBooleanFunction<WindowState> callback, boolean traverseTopToBottom) {
- return mImeWindowsContainers.forAllWindowForce(callback, traverseTopToBottom);
+ return mImeWindowsContainer.forAllWindowForce(callback, traverseTopToBottom);
}
/**
@@ -3501,8 +3501,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// Update display configuration for IME process.
if (mInputMethodWindow != null) {
final int imePid = mInputMethodWindow.mSession.mPid;
- mWmService.mAtmInternal.onImeWindowSetOnDisplay(imePid,
- mInputMethodWindow.getDisplayId());
+ mAtmService.onImeWindowSetOnDisplayArea(imePid, mImeWindowsContainer);
}
mInsetsStateController.getSourceProvider(ITYPE_IME).setWindow(win,
mDisplayPolicy.getImeSourceFrameProvider(), null /* imeFrameProvider */);
@@ -3733,7 +3732,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
if (targetRoot != null) {
// Reposition the IME container to the target root to get the correct bounds and
// config.
- targetRoot.placeImeContainer(mImeWindowsContainers);
+ targetRoot.placeImeContainer(mImeWindowsContainer);
}
}
// 2. Reparent the IME container surface to either the input target app, or the IME window
@@ -3784,7 +3783,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
final SurfaceControl newParent = computeImeParent();
if (newParent != null && newParent != mInputMethodSurfaceParent) {
mInputMethodSurfaceParent = newParent;
- getPendingTransaction().reparent(mImeWindowsContainers.mSurfaceControl, newParent);
+ getPendingTransaction().reparent(mImeWindowsContainer.mSurfaceControl, newParent);
scheduleAnimation();
}
}
@@ -3821,7 +3820,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
// Otherwise, we just attach it to where the display area policy put it.
- return mImeWindowsContainers.getParent().getSurfaceControl();
+ return mImeWindowsContainer.getParent().getSurfaceControl();
}
void setLayoutNeeded() {
@@ -4569,7 +4568,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
@Override
void assignChildLayers(SurfaceControl.Transaction t) {
- mImeWindowsContainers.setNeedsLayer();
+ mImeWindowsContainer.setNeedsLayer();
final WindowState imeTarget = mImeLayeringTarget;
// In the case where we have an IME target that is not in split-screen mode IME
// assignment is easy. We just need the IME to go directly above the target. This way
@@ -4592,7 +4591,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
!(imeTarget.inMultiWindowMode()
|| imeTarget.mToken.isAppTransitioning()) && (
imeTarget.getSurfaceControl() != null))) {
- mImeWindowsContainers.assignRelativeLayer(t, imeTarget.getSurfaceControl(),
+ mImeWindowsContainer.assignRelativeLayer(t, imeTarget.getSurfaceControl(),
// TODO: We need to use an extra level on the app surface to ensure
// this is always above SurfaceView but always below attached window.
1);
@@ -4600,7 +4599,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// The IME surface parent may not be its window parent's surface
// (@see #computeImeParent), so set relative layer here instead of letting the window
// parent to assign layer.
- mImeWindowsContainers.assignRelativeLayer(t, mInputMethodSurfaceParent, 1);
+ mImeWindowsContainer.assignRelativeLayer(t, mInputMethodSurfaceParent, 1);
}
super.assignChildLayers(t);
}
@@ -4615,8 +4614,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
* with {@link WindowState#assignLayer}
*/
void assignRelativeLayerForImeTargetChild(SurfaceControl.Transaction t, WindowContainer child) {
- mImeWindowsContainers.setNeedsLayer();
- child.assignRelativeLayer(t, mImeWindowsContainers.getSurfaceControl(), 1);
+ mImeWindowsContainer.setNeedsLayer();
+ child.assignRelativeLayer(t, mImeWindowsContainer.getSurfaceControl(), 1);
}
@Override
@@ -4883,7 +4882,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
DisplayArea.Tokens getImeContainer() {
- return mImeWindowsContainers;
+ return mImeWindowsContainer;
}
SurfaceControl getOverlayLayer() {
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index ff349fa637a5..23acbf75429c 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -862,9 +862,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
"<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
}
}
-
- // Send any pending task-info changes that were queued-up during a layout deferment
- mWmService.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
mWmService.mAnimator.executeAfterPrepareSurfacesRunnables();
checkAppTransitionReady(surfacePlacer);
@@ -1017,6 +1014,9 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
mWmService.scheduleAnimationLocked();
+ // Send any pending task-info changes that were queued-up during a layout deferment
+ mWmService.mAtmService.mTaskOrganizerController.dispatchPendingTaskInfoChanges();
+
if (DEBUG_WINDOW_TRACE) Slog.e(TAG, "performSurfacePlacementInner exit");
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 260b6c55b4db..637240c06de2 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -4093,6 +4093,7 @@ class Task extends WindowContainer<WindowContainer> {
info.topActivityInfo = mReuseActivitiesReport.top != null
? mReuseActivitiesReport.top.info
: null;
+ info.launchCookies.clear();
info.addLaunchCookie(mLaunchCookie);
forAllActivities(r -> {
info.addLaunchCookie(r.mLaunchCookie);
@@ -4992,6 +4993,7 @@ class Task extends WindowContainer<WindowContainer> {
}
} else {
// No longer managed by any organizer.
+ mTaskAppearedSent = false;
setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */);
if (mCreatedByOrganizer) {
removeImmediately("setTaskOrganizer");
@@ -5016,6 +5018,11 @@ class Task extends WindowContainer<WindowContainer> {
* @return {@code true} if task organizer changed.
*/
boolean updateTaskOrganizerState(boolean forceUpdate, boolean skipTaskAppeared) {
+ if (getSurfaceControl() == null) {
+ // Can't call onTaskAppeared without a surfacecontrol, so defer this until after one
+ // is created.
+ return false;
+ }
if (!canBeOrganized()) {
return setTaskOrganizer(null);
}
@@ -5025,10 +5032,6 @@ class Task extends WindowContainer<WindowContainer> {
final ITaskOrganizer organizer = controller.getTaskOrganizer(windowingMode);
if (!forceUpdate && mTaskOrganizer == organizer) {
return false;
- } else if (organizer != null && getSurfaceControl() == null) {
- // Can't call onTaskAppeared without a surfacecontrol, so defer this until after one
- // is created.
- return false;
}
return setTaskOrganizer(organizer, skipTaskAppeared);
}
@@ -7669,7 +7672,7 @@ class Task extends WindowContainer<WindowContainer> {
void dispatchTaskInfoChangedIfNeeded(boolean force) {
if (isOrganized()) {
- mAtmService.mTaskOrganizerController.onTaskInfoChanged(this, force);
+ mAtmService.mTaskOrganizerController.dispatchTaskInfoChanged(this, force);
}
}
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 383dfd48a07a..65247d0b9937 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -151,23 +151,27 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Task appeared taskId=%d", task.mTaskId);
final boolean visible = task.isVisible();
final RunningTaskInfo taskInfo = task.getTaskInfo();
- try {
- mTaskOrganizer.onTaskAppeared(taskInfo, prepareLeash(task, visible,
- "TaskOrganizerController.onTaskAppeared"));
- } catch (RemoteException e) {
- Slog.e(TAG, "Exception sending onTaskAppeared callback", e);
- }
+ mDeferTaskOrgCallbacksConsumer.accept(() -> {
+ try {
+ mTaskOrganizer.onTaskAppeared(taskInfo, prepareLeash(task, visible,
+ "TaskOrganizerController.onTaskAppeared"));
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Exception sending onTaskAppeared callback", e);
+ }
+ });
}
void onTaskVanished(Task task) {
ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Task vanished taskId=%d", task.mTaskId);
final RunningTaskInfo taskInfo = task.getTaskInfo();
- try {
- mTaskOrganizer.onTaskVanished(taskInfo);
- } catch (RemoteException e) {
- Slog.e(TAG, "Exception sending onTaskVanished callback", e);
- }
+ mDeferTaskOrgCallbacksConsumer.accept(() -> {
+ try {
+ mTaskOrganizer.onTaskVanished(taskInfo);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Exception sending onTaskVanished callback", e);
+ }
+ });
}
void onTaskInfoChanged(Task task, ActivityManager.RunningTaskInfo taskInfo) {
@@ -176,18 +180,20 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
return;
}
ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Task info changed taskId=%d", task.mTaskId);
- if (!task.isOrganized()) {
- // This is safe to ignore if the task is no longer organized
- return;
- }
- try {
- // Purposely notify of task info change immediately instead of deferring (like
- // appear and vanish) to allow info changes (such as new PIP params) to flow
- // without waiting.
- mTaskOrganizer.onTaskInfoChanged(taskInfo);
- } catch (RemoteException e) {
- Slog.e(TAG, "Exception sending onTaskInfoChanged callback", e);
- }
+ mDeferTaskOrgCallbacksConsumer.accept(() -> {
+ if (!task.isOrganized()) {
+ // This is safe to ignore if the task is no longer organized
+ return;
+ }
+ try {
+ // Purposely notify of task info change immediately instead of deferring (like
+ // appear and vanish) to allow info changes (such as new PIP params) to flow
+ // without waiting.
+ mTaskOrganizer.onTaskInfoChanged(taskInfo);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Exception sending onTaskInfoChanged callback", e);
+ }
+ });
}
void onBackPressedOnTaskRoot(Task task) {
@@ -197,15 +203,17 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
// Skip if the task has not yet received taskAppeared().
return;
}
- if (!task.isOrganized()) {
- // This is safe to ignore if the task is no longer organized
- return;
- }
- try {
- mTaskOrganizer.onBackPressedOnTaskRoot(task.getTaskInfo());
- } catch (Exception e) {
- Slog.e(TAG, "Exception sending onBackPressedOnTaskRoot callback", e);
- }
+ mDeferTaskOrgCallbacksConsumer.accept(() -> {
+ if (!task.isOrganized()) {
+ // This is safe to ignore if the task is no longer organized
+ return;
+ }
+ try {
+ mTaskOrganizer.onBackPressedOnTaskRoot(task.getTaskInfo());
+ } catch (Exception e) {
+ Slog.e(TAG, "Exception sending onBackPressedOnTaskRoot callback", e);
+ }
+ });
}
}
@@ -250,34 +258,28 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
return mOrganizer.prepareLeash(t, t.isVisible(), reason);
}
- private boolean addTask(Task t) {
- if (t.mTaskAppearedSent) {
- return false;
- }
+ void addTask(Task t) {
+ if (t.mTaskAppearedSent) return;
if (!mOrganizedTasks.contains(t)) {
mOrganizedTasks.add(t);
}
-
if (t.taskAppearedReady()) {
t.mTaskAppearedSent = true;
- return true;
+ mOrganizer.onTaskAppeared(t);
}
- return false;
}
- private boolean removeTask(Task t) {
- mOrganizedTasks.remove(t);
- mInterceptBackPressedOnRootTasks.remove(t.mTaskId);
-
+ void removeTask(Task t) {
if (t.mTaskAppearedSent) {
if (t.getSurfaceControl() != null) {
t.migrateToNewSurfaceControl();
}
t.mTaskAppearedSent = false;
- return true;
+ mOrganizer.onTaskVanished(t);
}
- return false;
+ mOrganizedTasks.remove(t);
+ mInterceptBackPressedOnRootTasks.remove(t.mTaskId);
}
void dispose() {
@@ -289,7 +291,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
while (!mOrganizedTasks.isEmpty()) {
final Task t = mOrganizedTasks.get(0);
if (!t.updateTaskOrganizerState(true /* forceUpdate */)) {
- TaskOrganizerController.this.onTaskVanished(mOrganizer.mTaskOrganizer, t);
+ removeTask(t);
}
}
@@ -303,33 +305,6 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
}
}
- static class PendingTaskEvent {
- static final int EVENT_APPEARED = 0;
- static final int EVENT_VANISHED = 1;
- static final int EVENT_INFO_CHANGED = 2;
- static final int EVENT_ROOT_BACK_PRESSED = 3;
-
- final int mEventType;
- final Task mTask;
- final ITaskOrganizer mTaskOrg;
- boolean mForce;
-
- PendingTaskEvent(Task task, int event) {
- this(task, task.mTaskOrganizer, event);
- }
-
- PendingTaskEvent(Task task, ITaskOrganizer taskOrg, int eventType) {
- mTask = task;
- mTaskOrg = taskOrg;
- mEventType = eventType;
- }
-
- boolean isLifecycleEvent() {
- return mEventType == EVENT_APPEARED || mEventType == EVENT_VANISHED
- || mEventType == EVENT_INFO_CHANGED;
- }
- }
-
private final ActivityTaskManagerService mService;
private final WindowManagerGlobalLock mGlobalLock;
@@ -337,8 +312,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
private final LinkedList<ITaskOrganizer> mTaskOrganizers = new LinkedList<>();
private final HashMap<IBinder, TaskOrganizerState> mTaskOrganizerStates = new HashMap<>();
private final WeakHashMap<Task, RunningTaskInfo> mLastSentTaskInfos = new WeakHashMap<>();
- // Pending task events due to layout deferred.
- private final ArrayList<PendingTaskEvent> mPendingTaskEvents = new ArrayList<>();
+ private final ArrayList<Task> mPendingTaskInfoChanges = new ArrayList<>();
// Set of organized tasks (by taskId) that dispatch back pressed to their organizers
private final HashSet<Integer> mInterceptBackPressedOnRootTasks = new HashSet();
@@ -363,12 +337,6 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
public void setDeferTaskOrgCallbacksConsumer(Consumer<Runnable> consumer) {
mDeferTaskOrgCallbacksConsumer = consumer;
}
-
- @VisibleForTesting
- ArrayList<PendingTaskEvent> getPendingEventList() {
- return mPendingTaskEvents;
- }
-
/**
* Register a TaskOrganizer to manage tasks as they enter the a supported windowing mode.
*/
@@ -474,33 +442,13 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
void onTaskAppeared(ITaskOrganizer organizer, Task task) {
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
- if (state != null && state.addTask(task)) {
- PendingTaskEvent pending = getPendingTaskEvent(task, PendingTaskEvent.EVENT_APPEARED);
- if (pending == null) {
- pending = new PendingTaskEvent(task, PendingTaskEvent.EVENT_APPEARED);
- mPendingTaskEvents.add(pending);
- }
- }
+ state.addTask(task);
}
void onTaskVanished(ITaskOrganizer organizer, Task task) {
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
- if (state != null && state.removeTask(task)) {
- for (int i = mPendingTaskEvents.size() - 1; i >= 0; i--) {
- PendingTaskEvent entry = mPendingTaskEvents.get(i);
- if (task.mTaskId == entry.mTask.mTaskId) {
- // This task will vanished so remove all pending event of it.
- mPendingTaskEvents.remove(i);
- if (entry.mEventType == PendingTaskEvent.EVENT_APPEARED) {
- // If task still not appeared, ignore this callback.
- return;
- }
- }
- }
-
- PendingTaskEvent pending =
- new PendingTaskEvent(task, organizer, PendingTaskEvent.EVENT_VANISHED);
- mPendingTaskEvents.add(pending);
+ if (state != null) {
+ state.removeTask(task);
}
}
@@ -570,76 +518,30 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
}
}
- void dispatchPendingEvents() {
- if (mService.mWindowManager.mWindowPlacerLocked.isLayoutDeferred()
- || mPendingTaskEvents.isEmpty()) {
+ void dispatchPendingTaskInfoChanges() {
+ if (mService.mWindowManager.mWindowPlacerLocked.isLayoutDeferred()) {
return;
}
-
- for (int i = 0, n = mPendingTaskEvents.size(); i < n; i++) {
- PendingTaskEvent event = mPendingTaskEvents.get(i);
- final Task task = event.mTask;
- final TaskOrganizerState state;
- switch (event.mEventType) {
- case PendingTaskEvent.EVENT_APPEARED:
- state = mTaskOrganizerStates.get(event.mTaskOrg.asBinder());
- if (state != null && task.taskAppearedReady()) {
- state.mOrganizer.onTaskAppeared(task);
- }
- break;
- case PendingTaskEvent.EVENT_VANISHED:
- state = mTaskOrganizerStates.get(event.mTaskOrg.asBinder());
- if (state != null) {
- state.mOrganizer.onTaskVanished(task);
- }
- break;
- case PendingTaskEvent.EVENT_INFO_CHANGED:
- dispatchTaskInfoChanged(event.mTask, event.mForce);
- break;
- case PendingTaskEvent.EVENT_ROOT_BACK_PRESSED:
- state = mTaskOrganizerStates.get(event.mTaskOrg.asBinder());
- if (state != null) {
- state.mOrganizer.onBackPressedOnTaskRoot(task);
- }
- break;
- }
+ for (int i = 0, n = mPendingTaskInfoChanges.size(); i < n; ++i) {
+ dispatchTaskInfoChanged(mPendingTaskInfoChanges.get(i), false /* force */);
}
- mPendingTaskEvents.clear();
+ mPendingTaskInfoChanges.clear();
}
- void onTaskInfoChanged(Task task, boolean force) {
- if (!task.mTaskAppearedSent) {
- // Skip if task still not appeared.
+ void dispatchTaskInfoChanged(Task task, boolean force) {
+ if (!force && mService.mWindowManager.mWindowPlacerLocked.isLayoutDeferred()) {
+ // Defer task info reporting while layout is deferred. This is because layout defer
+ // blocks tend to do lots of re-ordering which can mess up animations in receivers.
+ mPendingTaskInfoChanges.remove(task);
+ mPendingTaskInfoChanges.add(task);
return;
}
-
- // Defer task info reporting while layout is deferred. This is because layout defer
- // blocks tend to do lots of re-ordering which can mess up animations in receivers.
- PendingTaskEvent pending = getPendingLifecycleTaskEvent(task);
- if (pending == null) {
- pending = new PendingTaskEvent(task, PendingTaskEvent.EVENT_INFO_CHANGED);
- } else {
- if (pending.mEventType != PendingTaskEvent.EVENT_INFO_CHANGED) {
- // If queued event is appeared, it means task still not appeared so ignore
- // this info changed. If queued event is vanished, it means task should
- // will vanished early so do not need this info changed.
- return;
- }
- // Remove and add for re-ordering.
- mPendingTaskEvents.remove(pending);
- }
- pending.mForce = force;
- mPendingTaskEvents.add(pending);
- }
-
- private void dispatchTaskInfoChanged(Task task, boolean force) {
RunningTaskInfo lastInfo = mLastSentTaskInfos.get(task);
if (mTmpTaskInfo == null) {
mTmpTaskInfo = new RunningTaskInfo();
}
mTmpTaskInfo.configuration.unset();
task.fillTaskInfo(mTmpTaskInfo);
-
boolean changed = !mTmpTaskInfo.equalsForTaskOrganizer(lastInfo);
if (!changed) {
int cfgChanges = mTmpTaskInfo.configuration.diff(lastInfo.configuration);
@@ -653,6 +555,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
changed = (cfgChanges & REPORT_CONFIGS) != 0;
}
if (!(changed || force)) {
+ // mTmpTaskInfo will be reused next time.
return;
}
final RunningTaskInfo newInfo = mTmpTaskInfo;
@@ -802,48 +705,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
return false;
}
- PendingTaskEvent pendingVanished =
- getPendingTaskEvent(task, PendingTaskEvent.EVENT_VANISHED);
- if (pendingVanished != null) {
- // This task will vanish before this callback so just ignore.
- return false;
- }
-
- PendingTaskEvent pending = getPendingTaskEvent(
- task, PendingTaskEvent.EVENT_ROOT_BACK_PRESSED);
- if (pending == null) {
- pending = new PendingTaskEvent(task, PendingTaskEvent.EVENT_ROOT_BACK_PRESSED);
- } else {
- // Pending already exist, remove and add for re-ordering.
- mPendingTaskEvents.remove(pending);
- }
- mPendingTaskEvents.add(pending);
+ final TaskOrganizerState state = mTaskOrganizerStates.get(task.mTaskOrganizer.asBinder());
+ state.mOrganizer.onBackPressedOnTaskRoot(task);
return true;
}
- @Nullable
- private PendingTaskEvent getPendingTaskEvent(Task task, int type) {
- for (int i = mPendingTaskEvents.size() - 1; i >= 0; i--) {
- PendingTaskEvent entry = mPendingTaskEvents.get(i);
- if (task.mTaskId == entry.mTask.mTaskId && type == entry.mEventType) {
- return entry;
- }
- }
- return null;
- }
-
- @VisibleForTesting
- @Nullable
- PendingTaskEvent getPendingLifecycleTaskEvent(Task task) {
- for (int i = mPendingTaskEvents.size() - 1; i >= 0; i--) {
- PendingTaskEvent entry = mPendingTaskEvents.get(i);
- if (task.mTaskId == entry.mTask.mTaskId && entry.isLifecycleEvent()) {
- return entry;
- }
- }
- return null;
- }
-
public void dump(PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " ";
pw.print(prefix); pw.println("TaskOrganizerController:");
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 52ed2788d795..c4eb63581153 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -222,7 +222,6 @@ public class WindowAnimator {
mService.destroyPreservedSurfaceLocked();
- mService.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
executeAfterPrepareSurfacesRunnables();
if (DEBUG_WINDOW_TRACE) {
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 663d91ecc82a..389f428a4138 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -20,7 +20,6 @@ import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.os.Build.VERSION_CODES.Q;
import static android.os.IInputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
-import static android.view.Display.INVALID_DISPLAY;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
import static com.android.internal.util.Preconditions.checkArgument;
@@ -201,8 +200,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
private final Configuration mLastReportedConfiguration = new Configuration();
/** Whether the process configuration is waiting to be dispatched to the process. */
private boolean mHasPendingConfigurationChange;
- // Registered display id as a listener to override config change
- private int mDisplayId;
+
+ /**
+ * Registered {@link DisplayArea} as a listener to override config changes. {@code null} if not
+ * registered.
+ */
+ @Nullable
+ private DisplayArea mDisplayArea;
private ActivityRecord mConfigActivityRecord;
// Whether the activity config override is allowed for this process.
private volatile boolean mIsActivityConfigOverrideAllowed = true;
@@ -252,7 +256,6 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
mOwner = owner;
mListener = listener;
mAtm = atm;
- mDisplayId = INVALID_DISPLAY;
mBackgroundActivityStartCallback = mAtm.getBackgroundActivityStartCallback();
boolean isSysUiPackage = info.packageName.equals(
@@ -393,9 +396,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
return mPendingUiClean;
}
- /** @return {@code true} if the process registered to a display as a config listener. */
- boolean registeredForDisplayConfigChanges() {
- return mDisplayId != INVALID_DISPLAY;
+ /** @return {@code true} if the process registered to a display area as a config listener. */
+ boolean registeredForDisplayAreaConfigChanges() {
+ return mDisplayArea != null;
}
/** @return {@code true} if the process registered to an activity as a config listener. */
@@ -443,11 +446,14 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
return mRequiredAbi;
}
- /** Returns ID of display overriding the configuration for this process, or
- * INVALID_DISPLAY if no display is overriding. */
+ /**
+ * Registered {@link DisplayArea} as a listener to override config changes. {@code null} if not
+ * registered.
+ */
@VisibleForTesting
- int getDisplayId() {
- return mDisplayId;
+ @Nullable
+ DisplayArea getDisplayArea() {
+ return mDisplayArea;
}
public void setDebugging(boolean debugging) {
@@ -1317,29 +1323,22 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
return hasVisibleActivities;
}
- void registerDisplayConfigurationListener(DisplayContent displayContent) {
- if (displayContent == null) {
+ void registerDisplayAreaConfigurationListener(@Nullable DisplayArea displayArea) {
+ if (displayArea == null || displayArea.containsListener(this)) {
return;
}
- // A process can only register to one display to listen to the override configuration
- // change. Unregister existing listener if it has one before register the new one.
- unregisterDisplayConfigurationListener();
- unregisterActivityConfigurationListener();
- mDisplayId = displayContent.mDisplayId;
- displayContent.registerConfigurationChangeListener(this);
+ unregisterConfigurationListeners();
+ mDisplayArea = displayArea;
+ displayArea.registerConfigurationChangeListener(this);
}
@VisibleForTesting
- void unregisterDisplayConfigurationListener() {
- if (mDisplayId == INVALID_DISPLAY) {
+ void unregisterDisplayAreaConfigurationListener() {
+ if (mDisplayArea == null) {
return;
}
- final DisplayContent displayContent =
- mAtm.mRootWindowContainer.getDisplayContent(mDisplayId);
- if (displayContent != null) {
- displayContent.unregisterConfigurationChangeListener(this);
- }
- mDisplayId = INVALID_DISPLAY;
+ mDisplayArea.unregisterConfigurationChangeListener(this);
+ mDisplayArea = null;
onMergedOverrideConfigurationChanged(Configuration.EMPTY);
}
@@ -1349,10 +1348,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
|| !mIsActivityConfigOverrideAllowed) {
return;
}
- // A process can only register to one activityRecord to listen to the override configuration
- // change. Unregister existing listener if it has one before register the new one.
- unregisterDisplayConfigurationListener();
- unregisterActivityConfigurationListener();
+ unregisterConfigurationListeners();
mConfigActivityRecord = activityRecord;
activityRecord.registerConfigurationChangeListener(this);
}
@@ -1367,6 +1363,16 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
/**
+ * A process can only register to one {@link WindowContainer} to listen to the override
+ * configuration changes. Unregisters the existing listener if it has one before registers a
+ * new one.
+ */
+ private void unregisterConfigurationListeners() {
+ unregisterActivityConfigurationListener();
+ unregisterDisplayAreaConfigurationListener();
+ }
+
+ /**
* Check if activity configuration override for the activity process needs an update and perform
* if needed. By default we try to override the process configuration to match the top activity
* config to increase app compatibility with multi-window and multi-display. The process will
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index bb57a2836a2e..124e120e310e 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -725,7 +725,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
static final int BLAST_TIMEOUT_DURATION = 5000; /* milliseconds */
- private final WindowProcessController mWpcForDisplayConfigChanges;
+ private final WindowProcessController mWpcForDisplayAreaConfigChanges;
/**
* Returns the visibility of the given {@link InternalInsetsType type} requested by the client.
@@ -917,7 +917,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mBaseLayer = 0;
mSubLayer = 0;
mWinAnimator = null;
- mWpcForDisplayConfigChanges = null;
+ mWpcForDisplayAreaConfigChanges = null;
return;
}
mDeathRecipient = deathRecipient;
@@ -971,8 +971,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
parentWindow.addChild(this, sWindowSubLayerComparator);
}
- // System process or invalid process cannot register to display config change.
- mWpcForDisplayConfigChanges = (s.mPid == MY_PID || s.mPid < 0)
+ // System process or invalid process cannot register to display area config change.
+ mWpcForDisplayAreaConfigChanges = (s.mPid == MY_PID || s.mPid < 0)
? null
: service.mAtmService.getProcessController(s.mPid, s.mUid);
}
@@ -3533,9 +3533,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return mActivityRecord.mFrozenMergedConfig.peek();
}
- // If the process has not registered to any display to listen to the configuration change,
- // we can simply return the mFullConfiguration as default.
- if (!registeredForDisplayConfigChanges()) {
+ // If the process has not registered to any display area to listen to the configuration
+ // change, we can simply return the mFullConfiguration as default.
+ if (!registeredForDisplayAreaConfigChanges()) {
return super.getConfiguration();
}
@@ -3546,13 +3546,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return mTempConfiguration;
}
- /** @return {@code true} if the process registered to a display as a config listener. */
- private boolean registeredForDisplayConfigChanges() {
+ /** @return {@code true} if the process registered to a display area as a config listener. */
+ private boolean registeredForDisplayAreaConfigChanges() {
final WindowState parentWindow = getParentWindow();
final WindowProcessController wpc = parentWindow != null
- ? parentWindow.mWpcForDisplayConfigChanges
- : mWpcForDisplayConfigChanges;
- return wpc != null && wpc.registeredForDisplayConfigChanges();
+ ? parentWindow.mWpcForDisplayAreaConfigChanges
+ : mWpcForDisplayAreaConfigChanges;
+ return wpc != null && wpc.registeredForDisplayAreaConfigChanges();
}
void fillClientWindowFrames(ClientWindowFrames outFrames) {
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 35aad3e268ed..b2d6b15a4930 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -2709,7 +2709,7 @@ static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JN
}
static jboolean android_location_gnss_hal_GnssNative_start_measurement_collection(
- JNIEnv* /* env */, jclass, jboolean enableFullTracking) {
+ JNIEnv* /* env */, jclass, jboolean enableFullTracking, jboolean enableCorrVecOutputs) {
if (gnssMeasurementIface == nullptr) {
ALOGE("%s: IGnssMeasurement interface not available.", __func__);
return JNI_FALSE;
@@ -2717,7 +2717,7 @@ static jboolean android_location_gnss_hal_GnssNative_start_measurement_collectio
return gnssMeasurementIface->setCallback(std::make_unique<gnss::GnssMeasurementCallback>(
mCallbacksObj),
- enableFullTracking);
+ enableFullTracking, enableCorrVecOutputs);
}
static jboolean android_location_gnss_hal_GnssNative_stop_measurement_collection(JNIEnv* env,
@@ -3211,7 +3211,7 @@ static const JNINativeMethod sMeasurementMethods[] = {
/* name, signature, funcPtr */
{"native_is_measurement_supported", "()Z",
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_measurement_supported)},
- {"native_start_measurement_collection", "(Z)Z",
+ {"native_start_measurement_collection", "(ZZ)Z",
reinterpret_cast<void*>(
android_location_gnss_hal_GnssNative_start_measurement_collection)},
{"native_stop_measurement_collection", "()Z",
diff --git a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
index 631e185fffce..7b379e54a40e 100644
--- a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
+++ b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
@@ -68,6 +68,9 @@ static constexpr MagicType INCR = 0x52434e49; // BE INCR
static constexpr auto PollTimeoutMs = 5000;
static constexpr auto TraceTagCheckInterval = 1s;
+static constexpr auto WaitOnEofMinInterval = 10ms;
+static constexpr auto WaitOnEofMaxInterval = 1s;
+
struct JniIds {
jclass packageManagerShellCommandDataLoader;
jmethodID pmscdLookupShellCommand;
@@ -485,14 +488,16 @@ private:
if (read == 0) {
if (waitOnEof) {
// eof of stdin, waiting...
- ALOGE("eof of stdin, waiting...: %d, remaining: %d, block: %d, read: %d",
- int(totalSize), int(remaining), int(blockIdx), int(read));
- using namespace std::chrono_literals;
- std::this_thread::sleep_for(10ms);
- continue;
+ if (doWaitOnEof()) {
+ continue;
+ } else {
+ return false;
+ }
}
break;
}
+ resetWaitOnEof();
+
if (read < 0) {
return false;
}
@@ -776,6 +781,21 @@ private:
return fileId;
}
+ // Waiting with exponential backoff, maximum total time ~1.2sec.
+ bool doWaitOnEof() {
+ if (mWaitOnEofInterval >= WaitOnEofMaxInterval) {
+ resetWaitOnEof();
+ return false;
+ }
+ auto result = mWaitOnEofInterval;
+ mWaitOnEofInterval =
+ std::min<std::chrono::milliseconds>(mWaitOnEofInterval * 2, WaitOnEofMaxInterval);
+ std::this_thread::sleep_for(result);
+ return true;
+ }
+
+ void resetWaitOnEof() { mWaitOnEofInterval = WaitOnEofMinInterval; }
+
JavaVM* const mJvm;
std::string mArgs;
android::dataloader::FilesystemConnectorPtr mIfs = nullptr;
@@ -786,6 +806,7 @@ private:
std::thread mReceiverThread;
std::atomic<bool> mStopReceiving = false;
std::atomic<bool> mReadLogsEnabled = false;
+ std::chrono::milliseconds mWaitOnEofInterval{WaitOnEofMinInterval};
/** Tracks which files have been requested */
std::unordered_set<FileIdx> mRequestedFiles;
};
diff --git a/services/core/jni/gnss/GnssMeasurement.cpp b/services/core/jni/gnss/GnssMeasurement.cpp
index 2261c38fb185..663d839ff159 100644
--- a/services/core/jni/gnss/GnssMeasurement.cpp
+++ b/services/core/jni/gnss/GnssMeasurement.cpp
@@ -50,8 +50,9 @@ GnssMeasurement::GnssMeasurement(const sp<IGnssMeasurementInterface>& iGnssMeasu
: mIGnssMeasurement(iGnssMeasurement) {}
jboolean GnssMeasurement::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) {
- auto status = mIGnssMeasurement->setCallback(callback->getAidl(), enableFullTracking);
+ bool enableFullTracking, bool enableCorrVecOutputs) {
+ auto status = mIGnssMeasurement->setCallback(callback->getAidl(), enableFullTracking,
+ enableCorrVecOutputs);
return checkAidlStatus(status, "IGnssMeasurement setCallback() failed.");
}
@@ -66,9 +67,12 @@ GnssMeasurement_V1_0::GnssMeasurement_V1_0(const sp<IGnssMeasurement_V1_0>& iGns
: mIGnssMeasurement_V1_0(iGnssMeasurement) {}
jboolean GnssMeasurement_V1_0::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) {
+ bool enableFullTracking, bool enableCorrVecOutputs) {
if (enableFullTracking == true) {
- ALOGW("Full tracking is mode not supported in 1.0 GNSS HAL.");
+ ALOGW("Full tracking mode is not supported in 1.0 GNSS HAL.");
+ }
+ if (enableCorrVecOutputs == true) {
+ ALOGW("Correlation vector output is not supported in 1.0 GNSS HAL.");
}
auto status = mIGnssMeasurement_V1_0->setCallback(callback->getHidl());
if (!checkHidlReturn(status, "IGnssMeasurement setCallback() failed.")) {
@@ -89,7 +93,10 @@ GnssMeasurement_V1_1::GnssMeasurement_V1_1(const sp<IGnssMeasurement_V1_1>& iGns
: GnssMeasurement_V1_0{iGnssMeasurement}, mIGnssMeasurement_V1_1(iGnssMeasurement) {}
jboolean GnssMeasurement_V1_1::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) {
+ bool enableFullTracking, bool enableCorrVecOutputs) {
+ if (enableCorrVecOutputs == true) {
+ ALOGW("Correlation vector output is not supported in 1.1 GNSS HAL.");
+ }
auto status = mIGnssMeasurement_V1_1->setCallback_1_1(callback->getHidl(), enableFullTracking);
if (!checkHidlReturn(status, "IGnssMeasurement setCallback_V1_1() failed.")) {
return JNI_FALSE;
@@ -104,7 +111,10 @@ GnssMeasurement_V2_0::GnssMeasurement_V2_0(const sp<IGnssMeasurement_V2_0>& iGns
: GnssMeasurement_V1_1{iGnssMeasurement}, mIGnssMeasurement_V2_0(iGnssMeasurement) {}
jboolean GnssMeasurement_V2_0::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) {
+ bool enableFullTracking, bool enableCorrVecOutputs) {
+ if (enableCorrVecOutputs == true) {
+ ALOGW("Correlation vector output is not supported in 2.0 GNSS HAL.");
+ }
auto status = mIGnssMeasurement_V2_0->setCallback_2_0(callback->getHidl(), enableFullTracking);
if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_0() failed.")) {
return JNI_FALSE;
@@ -119,7 +129,10 @@ GnssMeasurement_V2_1::GnssMeasurement_V2_1(const sp<IGnssMeasurement_V2_1>& iGns
: GnssMeasurement_V2_0{iGnssMeasurement}, mIGnssMeasurement_V2_1(iGnssMeasurement) {}
jboolean GnssMeasurement_V2_1::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) {
+ bool enableFullTracking, bool enableCorrVecOutputs) {
+ if (enableCorrVecOutputs == true) {
+ ALOGW("Correlation vector output is not supported in 2.1 GNSS HAL.");
+ }
auto status = mIGnssMeasurement_V2_1->setCallback_2_1(callback->getHidl(), enableFullTracking);
if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_1() failed.")) {
return JNI_FALSE;
diff --git a/services/core/jni/gnss/GnssMeasurement.h b/services/core/jni/gnss/GnssMeasurement.h
index e64336fb67ac..f0752cd3ab5b 100644
--- a/services/core/jni/gnss/GnssMeasurement.h
+++ b/services/core/jni/gnss/GnssMeasurement.h
@@ -38,7 +38,7 @@ class GnssMeasurementInterface {
public:
virtual ~GnssMeasurementInterface() {}
virtual jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) = 0;
+ bool enableFullTracking, bool enableCorrVecOutputs) = 0;
virtual jboolean close() = 0;
};
@@ -46,7 +46,7 @@ class GnssMeasurement : public GnssMeasurementInterface {
public:
GnssMeasurement(const sp<android::hardware::gnss::IGnssMeasurementInterface>& iGnssMeasurement);
jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) override;
+ bool enableFullTracking, bool enableCorrVecOutputs) override;
jboolean close() override;
private:
@@ -58,7 +58,7 @@ public:
GnssMeasurement_V1_0(
const sp<android::hardware::gnss::V1_0::IGnssMeasurement>& iGnssMeasurement);
jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) override;
+ bool enableFullTracking, bool enableCorrVecOutputs) override;
jboolean close() override;
private:
@@ -70,7 +70,7 @@ public:
GnssMeasurement_V1_1(
const sp<android::hardware::gnss::V1_1::IGnssMeasurement>& iGnssMeasurement);
jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) override;
+ bool enableFullTracking, bool enableCorrVecOutputs) override;
private:
const sp<android::hardware::gnss::V1_1::IGnssMeasurement> mIGnssMeasurement_V1_1;
@@ -81,7 +81,7 @@ public:
GnssMeasurement_V2_0(
const sp<android::hardware::gnss::V2_0::IGnssMeasurement>& iGnssMeasurement);
jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) override;
+ bool enableFullTracking, bool enableCorrVecOutputs) override;
private:
const sp<android::hardware::gnss::V2_0::IGnssMeasurement> mIGnssMeasurement_V2_0;
@@ -92,7 +92,7 @@ public:
GnssMeasurement_V2_1(
const sp<android::hardware::gnss::V2_1::IGnssMeasurement>& iGnssMeasurement);
jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
- bool enableFullTracking) override;
+ bool enableFullTracking, bool enableCorrVecOutputs) override;
private:
const sp<android::hardware::gnss::V2_1::IGnssMeasurement> mIGnssMeasurement_V2_1;
diff --git a/services/core/jni/gnss/GnssMeasurementCallback.cpp b/services/core/jni/gnss/GnssMeasurementCallback.cpp
index 8cba77328248..757381dff80a 100644
--- a/services/core/jni/gnss/GnssMeasurementCallback.cpp
+++ b/services/core/jni/gnss/GnssMeasurementCallback.cpp
@@ -21,21 +21,33 @@
namespace android::gnss {
using binder::Status;
+using hardware::gnss::CorrelationVector;
using hardware::gnss::ElapsedRealtime;
using hardware::gnss::GnssClock;
using hardware::gnss::GnssData;
using hardware::gnss::GnssMeasurement;
using hardware::gnss::SatellitePvt;
+jclass class_arrayList;
+jclass class_clockInfo;
+jclass class_correlationVectorBuilder;
jclass class_gnssMeasurementsEvent;
jclass class_gnssMeasurement;
jclass class_gnssClock;
-jclass class_satellitePvtBuilder;
jclass class_positionEcef;
+jclass class_satellitePvtBuilder;
jclass class_velocityEcef;
-jclass class_clockInfo;
+jmethodID method_arrayListAdd;
+jmethodID method_arrayListCtor;
+jmethodID method_correlationVectorBuilderBuild;
+jmethodID method_correlationVectorBuilderCtor;
+jmethodID method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond;
+jmethodID method_correlationVectorBuilderSetMagnitude;
+jmethodID method_correlationVectorBuilderSetSamplingStartMeters;
+jmethodID method_correlationVectorBuilderSetSamplingWidthMeters;
jmethodID method_gnssMeasurementsEventCtor;
+jmethodID method_gnssMeasurementsSetCorrelationVectors;
jmethodID method_gnssMeasurementsSetSatellitePvt;
jmethodID method_gnssClockCtor;
jmethodID method_gnssMeasurementCtor;
@@ -66,6 +78,9 @@ void GnssMeasurement_class_init_once(JNIEnv* env, jclass& clazz) {
method_gnssMeasurementsSetSatellitePvt =
env->GetMethodID(class_gnssMeasurement, "setSatellitePvt",
"(Landroid/location/SatellitePvt;)V");
+ method_gnssMeasurementsSetCorrelationVectors =
+ env->GetMethodID(class_gnssMeasurement, "setCorrelationVectors",
+ "(Ljava/util/Collection;)V");
jclass gnssClockClass = env->FindClass("android/location/GnssClock");
class_gnssClock = (jclass)env->NewGlobalRef(gnssClockClass);
@@ -106,6 +121,31 @@ void GnssMeasurement_class_init_once(JNIEnv* env, jclass& clazz) {
jclass clockInfoClass = env->FindClass("android/location/SatellitePvt$ClockInfo");
class_clockInfo = (jclass)env->NewGlobalRef(clockInfoClass);
method_clockInfo = env->GetMethodID(class_clockInfo, "<init>", "(DDD)V");
+
+ jclass correlationVectorBuilder = env->FindClass("android/location/CorrelationVector$Builder");
+ class_correlationVectorBuilder = (jclass)env->NewGlobalRef(correlationVectorBuilder);
+ method_correlationVectorBuilderCtor =
+ env->GetMethodID(class_correlationVectorBuilder, "<init>", "()V");
+ method_correlationVectorBuilderSetMagnitude =
+ env->GetMethodID(class_correlationVectorBuilder, "setMagnitude",
+ "([I)Landroid/location/CorrelationVector$Builder;");
+ method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond =
+ env->GetMethodID(class_correlationVectorBuilder, "setFrequencyOffsetMetersPerSecond",
+ "(I)Landroid/location/CorrelationVector$Builder;");
+ method_correlationVectorBuilderSetSamplingStartMeters =
+ env->GetMethodID(class_correlationVectorBuilder, "setSamplingStartMeters",
+ "(D)Landroid/location/CorrelationVector$Builder;");
+ method_correlationVectorBuilderSetSamplingWidthMeters =
+ env->GetMethodID(class_correlationVectorBuilder, "setSamplingWidthMeters",
+ "(D)Landroid/location/CorrelationVector$Builder;");
+ method_correlationVectorBuilderBuild =
+ env->GetMethodID(class_correlationVectorBuilder, "build",
+ "()Landroid/location/CorrelationVector;");
+
+ jclass arrayListClass = env->FindClass("java/util/ArrayList");
+ class_arrayList = (jclass)env->NewGlobalRef(arrayListClass);
+ method_arrayListCtor = env->GetMethodID(class_arrayList, "<init>", "()V");
+ method_arrayListAdd = env->GetMethodID(class_arrayList, "add", "(Ljava/lang/Object;)Z");
}
void setMeasurementData(JNIEnv* env, jobject& callbacksObj, jobject clock,
@@ -310,6 +350,47 @@ void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env,
env->DeleteLocalRef(satellitePvtObject);
}
+ if (measurement.flags & static_cast<uint32_t>(GnssMeasurement::HAS_CORRELATION_VECTOR)) {
+ jobject correlationVectorList = env->NewObject(class_arrayList, method_arrayListCtor);
+ for (uint16_t i = 0; i < measurement.correlationVectors.size(); ++i) {
+ const CorrelationVector& correlationVector = measurement.correlationVectors[i];
+ const std::vector<int32_t>& magnitudeVector = correlationVector.magnitude;
+
+ jsize numMagnitude = magnitudeVector.size();
+ jintArray magnitudeArray = env->NewIntArray(numMagnitude);
+ env->SetIntArrayRegion(magnitudeArray, 0, numMagnitude,
+ reinterpret_cast<const jint*>(magnitudeVector.data()));
+
+ jobject correlationVectorBuilderObject =
+ env->NewObject(class_correlationVectorBuilder,
+ method_correlationVectorBuilderCtor);
+ env->CallObjectMethod(correlationVectorBuilderObject,
+ method_correlationVectorBuilderSetMagnitude, magnitudeArray);
+ env->CallObjectMethod(correlationVectorBuilderObject,
+ method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond,
+ correlationVector.frequencyOffsetMps);
+ env->CallObjectMethod(correlationVectorBuilderObject,
+ method_correlationVectorBuilderSetSamplingStartMeters,
+ correlationVector.samplingStartM);
+ env->CallObjectMethod(correlationVectorBuilderObject,
+ method_correlationVectorBuilderSetSamplingWidthMeters,
+ correlationVector.samplingWidthM);
+ jobject correlationVectorObject =
+ env->CallObjectMethod(correlationVectorBuilderObject,
+ method_correlationVectorBuilderBuild);
+
+ env->CallBooleanMethod(correlationVectorList, method_arrayListAdd,
+ correlationVectorObject);
+
+ env->DeleteLocalRef(magnitudeArray);
+ env->DeleteLocalRef(correlationVectorBuilderObject);
+ env->DeleteLocalRef(correlationVectorObject);
+ }
+ env->CallVoidMethod(object.get(), method_gnssMeasurementsSetCorrelationVectors,
+ correlationVectorList);
+ env->DeleteLocalRef(correlationVectorList);
+ }
+
jstring codeType = env->NewStringUTF(measurement.signalType.codeType.c_str());
SET(CodeType, codeType);
env->DeleteLocalRef(codeType);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 7d199cab1d35..4fe275250ddf 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -12051,8 +12051,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
@Override
- public ComponentName getProfileOwnerAsUser(int userHandle) {
- return DevicePolicyManagerService.this.getProfileOwnerAsUser(userHandle);
+ public ComponentName getProfileOwnerAsUser(@UserIdInt int userId) {
+ return DevicePolicyManagerService.this.getProfileOwnerAsUser(userId);
+ }
+
+ @Override
+ public int getDeviceOwnerUserId() {
+ return DevicePolicyManagerService.this.getDeviceOwnerUserId();
}
@Override
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt
index 6de3d4e160ec..23ed278e04ef 100644
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt
@@ -77,12 +77,14 @@ class VerifyReceiverTest {
val filter = IntentFilter().apply {
addAction(Intent.ACTION_VIEW)
addCategory(Intent.CATEGORY_DEFAULT)
+ addCategory(Intent.CATEGORY_BROWSABLE)
addDataScheme(uri.scheme)
addDataAuthority(uri.authority, null)
}
val intent = Intent(Intent.ACTION_VIEW, uri).apply {
addCategory(Intent.CATEGORY_DEFAULT)
+ addCategory(Intent.CATEGORY_BROWSABLE)
}
val allResults = context.packageManager.queryIntentActivities(intent, 0)
val allComponents = allResults
@@ -132,6 +134,8 @@ class VerifyReceiverTest {
val intent = Intent(Intent.ACTION_VIEW).apply {
data = uri
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ addCategory(Intent.CATEGORY_DEFAULT)
+ addCategory(Intent.CATEGORY_BROWSABLE)
}
val expectedActivities = params.expected.toMutableList()
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java b/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java
index 675274bf82c4..69fe140a7863 100644
--- a/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java
+++ b/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java
@@ -233,6 +233,7 @@ public final class FakeGnssHal extends GnssNative.GnssHal {
private boolean mAntennaInfoListeningStarted = false;
private boolean mMeasurementCollectionStarted = false;
private boolean mMeasurementCollectionFullTracking = false;
+ private boolean mMeasurementCollectionCorrVecOutputsEnabled = false;
private GnssHalPositionMode mPositionMode = new GnssHalPositionMode();
private GnssHalBatchingMode mBatchingMode = new GnssHalBatchingMode();
private final ArrayList<Location> mBatchedLocations = new ArrayList<>();
@@ -521,9 +522,11 @@ public final class FakeGnssHal extends GnssNative.GnssHal {
}
@Override
- protected boolean startMeasurementCollection(boolean enableFullTracking) {
+ protected boolean startMeasurementCollection(boolean enableFullTracking,
+ boolean enableCorrVecOutputs) {
mState.mMeasurementCollectionStarted = true;
mState.mMeasurementCollectionFullTracking = enableFullTracking;
+ mState.mMeasurementCollectionCorrVecOutputsEnabled = enableCorrVecOutputs;
return true;
}
@@ -531,6 +534,7 @@ public final class FakeGnssHal extends GnssNative.GnssHal {
protected boolean stopMeasurementCollection() {
mState.mMeasurementCollectionStarted = false;
mState.mMeasurementCollectionFullTracking = false;
+ mState.mMeasurementCollectionCorrVecOutputsEnabled = false;
return true;
}
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
index c6fde87f5953..009cb0b363e4 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
@@ -22,13 +22,13 @@ import static org.testng.Assert.expectThrows;
import android.app.appsearch.AppSearchSchema;
import android.app.appsearch.GenericDocument;
+import android.app.appsearch.PackageIdentifier;
import android.app.appsearch.SearchResult;
import android.app.appsearch.SearchResultPage;
import android.app.appsearch.SearchSpec;
import android.app.appsearch.exceptions.AppSearchException;
import com.android.server.appsearch.external.localstorage.converter.GenericDocumentToProtoConverter;
-import com.android.server.appsearch.external.localstorage.converter.SchemaToProtoConverter;
import com.android.server.appsearch.proto.DocumentProto;
import com.android.server.appsearch.proto.GetOptimizeInfoResultProto;
import com.android.server.appsearch.proto.PropertyConfigProto;
@@ -41,6 +41,7 @@ import com.android.server.appsearch.proto.StringIndexingConfig;
import com.android.server.appsearch.proto.TermMatchType;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.junit.Before;
@@ -55,27 +56,10 @@ import java.util.List;
public class AppSearchImplTest {
@Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
private AppSearchImpl mAppSearchImpl;
- private SchemaTypeConfigProto mVisibilitySchemaProto;
@Before
public void setUp() throws Exception {
mAppSearchImpl = AppSearchImpl.create(mTemporaryFolder.newFolder());
-
- AppSearchSchema visibilitySchema = VisibilityStore.SCHEMA;
-
- // We need to rewrite the schema type to follow AppSearchImpl's prefixing scheme.
- AppSearchSchema.Builder rewrittenVisibilitySchema =
- new AppSearchSchema.Builder(
- AppSearchImpl.createPrefix(
- VisibilityStore.PACKAGE_NAME, VisibilityStore.DATABASE_NAME)
- + VisibilityStore.SCHEMA_TYPE);
- List<AppSearchSchema.PropertyConfig> visibilityProperties =
- visibilitySchema.getProperties();
- for (AppSearchSchema.PropertyConfig property : visibilityProperties) {
- rewrittenVisibilitySchema.addProperty(property);
- }
- mVisibilitySchemaProto =
- SchemaToProtoConverter.toSchemaTypeConfigProto(rewrittenVisibilitySchema.build());
}
// TODO(b/175430168) add test to verify reset is working properly.
@@ -407,6 +391,7 @@ public class AppSearchImplTest {
"database",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
// Insert enough documents.
@@ -464,6 +449,7 @@ public class AppSearchImplTest {
"database",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
// Insert document
@@ -495,12 +481,14 @@ public class AppSearchImplTest {
"database1",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
mAppSearchImpl.setSchema(
"package",
"database2",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
// Insert documents
@@ -537,6 +525,117 @@ public class AppSearchImplTest {
assertThat(searchResultPage.getResults()).isEmpty();
}
+ /**
+ * TODO(b/169883602): This should be an integration test at the cts-level. This is a short-term
+ * test until we have official support for multiple-apps indexing at once.
+ */
+ @Test
+ public void testQueryWithMultiplePackages_noPackageFilters() throws Exception {
+ // Insert package1 schema
+ List<AppSearchSchema> schema1 =
+ ImmutableList.of(new AppSearchSchema.Builder("schema1").build());
+ mAppSearchImpl.setSchema(
+ "package1",
+ "database1",
+ schema1,
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+
+ // Insert package2 schema
+ List<AppSearchSchema> schema2 =
+ ImmutableList.of(new AppSearchSchema.Builder("schema2").build());
+ mAppSearchImpl.setSchema(
+ "package2",
+ "database2",
+ schema2,
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+
+ // Insert package1 document
+ GenericDocument document =
+ new GenericDocument.Builder<>("uri", "schema1").setNamespace("namespace").build();
+ mAppSearchImpl.putDocument("package1", "database1", document);
+
+ // No query filters specified, package2 shouldn't be able to query for package1's documents.
+ SearchSpec searchSpec =
+ new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
+ SearchResultPage searchResultPage =
+ mAppSearchImpl.query("package2", "database2", "", searchSpec);
+ assertThat(searchResultPage.getResults()).isEmpty();
+
+ // Insert package2 document
+ document =
+ new GenericDocument.Builder<>("uri", "schema2").setNamespace("namespace").build();
+ mAppSearchImpl.putDocument("package2", "database2", document);
+
+ // No query filters specified. package2 should only get its own documents back.
+ searchResultPage = mAppSearchImpl.query("package2", "database2", "", searchSpec);
+ assertThat(searchResultPage.getResults()).hasSize(1);
+ assertThat(searchResultPage.getResults().get(0).getDocument()).isEqualTo(document);
+ }
+
+ /**
+ * TODO(b/169883602): This should be an integration test at the cts-level. This is a short-term
+ * test until we have official support for multiple-apps indexing at once.
+ */
+ @Test
+ public void testQueryWithMultiplePackages_withPackageFilters() throws Exception {
+ // Insert package1 schema
+ List<AppSearchSchema> schema1 =
+ ImmutableList.of(new AppSearchSchema.Builder("schema1").build());
+ mAppSearchImpl.setSchema(
+ "package1",
+ "database1",
+ schema1,
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+
+ // Insert package2 schema
+ List<AppSearchSchema> schema2 =
+ ImmutableList.of(new AppSearchSchema.Builder("schema2").build());
+ mAppSearchImpl.setSchema(
+ "package2",
+ "database2",
+ schema2,
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+
+ // Insert package1 document
+ GenericDocument document =
+ new GenericDocument.Builder<>("uri", "schema1").setNamespace("namespace").build();
+ mAppSearchImpl.putDocument("package1", "database1", document);
+
+ // "package1" filter specified, but package2 shouldn't be able to query for package1's
+ // documents.
+ SearchSpec searchSpec =
+ new SearchSpec.Builder()
+ .setTermMatch(TermMatchType.Code.PREFIX_VALUE)
+ .addFilterPackageNames("package1")
+ .build();
+ SearchResultPage searchResultPage =
+ mAppSearchImpl.query("package2", "database2", "", searchSpec);
+ assertThat(searchResultPage.getResults()).isEmpty();
+
+ // Insert package2 document
+ document =
+ new GenericDocument.Builder<>("uri", "schema2").setNamespace("namespace").build();
+ mAppSearchImpl.putDocument("package2", "database2", document);
+
+ // "package2" filter specified, package2 should only get its own documents back.
+ searchSpec =
+ new SearchSpec.Builder()
+ .setTermMatch(TermMatchType.Code.PREFIX_VALUE)
+ .addFilterPackageNames("package2")
+ .build();
+ searchResultPage = mAppSearchImpl.query("package2", "database2", "", searchSpec);
+ assertThat(searchResultPage.getResults()).hasSize(1);
+ assertThat(searchResultPage.getResults().get(0).getDocument()).isEqualTo(document);
+ }
+
@Test
public void testGlobalQueryEmptyDatabase() throws Exception {
SearchSpec searchSpec =
@@ -545,6 +644,115 @@ public class AppSearchImplTest {
assertThat(searchResultPage.getResults()).isEmpty();
}
+ /**
+ * TODO(b/169883602): This should be an integration test at the cts-level. This is a short-term
+ * test until we have official support for multiple-apps indexing at once.
+ */
+ @Test
+ public void testGlobalQueryWithMultiplePackages_noPackageFilters() throws Exception {
+ // Insert package1 schema
+ List<AppSearchSchema> schema1 =
+ ImmutableList.of(new AppSearchSchema.Builder("schema1").build());
+ mAppSearchImpl.setSchema(
+ "package1",
+ "database1",
+ schema1,
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+
+ // Insert package2 schema
+ List<AppSearchSchema> schema2 =
+ ImmutableList.of(new AppSearchSchema.Builder("schema2").build());
+ mAppSearchImpl.setSchema(
+ "package2",
+ "database2",
+ schema2,
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+
+ // Insert package1 document
+ GenericDocument document1 =
+ new GenericDocument.Builder<>("uri", "schema1").setNamespace("namespace").build();
+ mAppSearchImpl.putDocument("package1", "database1", document1);
+
+ // Insert package2 document
+ GenericDocument document2 =
+ new GenericDocument.Builder<>("uri", "schema2").setNamespace("namespace").build();
+ mAppSearchImpl.putDocument("package2", "database2", document2);
+
+ // No query filters specified, global query can retrieve all documents.
+ SearchSpec searchSpec =
+ new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
+ SearchResultPage searchResultPage = mAppSearchImpl.globalQuery("", searchSpec);
+ assertThat(searchResultPage.getResults()).hasSize(2);
+
+ // Document2 will be first since it got indexed later and has a "better", aka more recent
+ // score.
+ assertThat(searchResultPage.getResults().get(0).getDocument()).isEqualTo(document2);
+ assertThat(searchResultPage.getResults().get(1).getDocument()).isEqualTo(document1);
+ }
+
+ /**
+ * TODO(b/169883602): This should be an integration test at the cts-level. This is a short-term
+ * test until we have official support for multiple-apps indexing at once.
+ */
+ @Test
+ public void testGlobalQueryWithMultiplePackages_withPackageFilters() throws Exception {
+ // Insert package1 schema
+ List<AppSearchSchema> schema1 =
+ ImmutableList.of(new AppSearchSchema.Builder("schema1").build());
+ mAppSearchImpl.setSchema(
+ "package1",
+ "database1",
+ schema1,
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+
+ // Insert package2 schema
+ List<AppSearchSchema> schema2 =
+ ImmutableList.of(new AppSearchSchema.Builder("schema2").build());
+ mAppSearchImpl.setSchema(
+ "package2",
+ "database2",
+ schema2,
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+
+ // Insert package1 document
+ GenericDocument document1 =
+ new GenericDocument.Builder<>("uri", "schema1").setNamespace("namespace").build();
+ mAppSearchImpl.putDocument("package1", "database1", document1);
+
+ // Insert package2 document
+ GenericDocument document2 =
+ new GenericDocument.Builder<>("uri", "schema2").setNamespace("namespace").build();
+ mAppSearchImpl.putDocument("package2", "database2", document2);
+
+ // "package1" filter specified
+ SearchSpec searchSpec =
+ new SearchSpec.Builder()
+ .setTermMatch(TermMatchType.Code.PREFIX_VALUE)
+ .addFilterPackageNames("package1")
+ .build();
+ SearchResultPage searchResultPage = mAppSearchImpl.globalQuery("", searchSpec);
+ assertThat(searchResultPage.getResults()).hasSize(1);
+ assertThat(searchResultPage.getResults().get(0).getDocument()).isEqualTo(document1);
+
+ // "package2" filter specified
+ searchSpec =
+ new SearchSpec.Builder()
+ .setTermMatch(TermMatchType.Code.PREFIX_VALUE)
+ .addFilterPackageNames("package2")
+ .build();
+ searchResultPage = mAppSearchImpl.globalQuery("", searchSpec);
+ assertThat(searchResultPage.getResults()).hasSize(1);
+ assertThat(searchResultPage.getResults().get(0).getDocument()).isEqualTo(document2);
+ }
+
@Test
public void testRemoveEmptyDatabase_noExceptionThrown() throws Exception {
SearchSpec searchSpec =
@@ -567,6 +775,9 @@ public class AppSearchImplTest {
@Test
public void testSetSchema() throws Exception {
+ List<SchemaTypeConfigProto> existingSchemas =
+ mAppSearchImpl.getSchemaProtoLocked().getTypesList();
+
List<AppSearchSchema> schemas =
Collections.singletonList(new AppSearchSchema.Builder("Email").build());
// Set schema Email to AppSearch database1
@@ -575,6 +786,7 @@ public class AppSearchImplTest {
"database1",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
// Create expected schemaType proto.
@@ -586,7 +798,7 @@ public class AppSearchImplTest {
.build();
List<SchemaTypeConfigProto> expectedTypes = new ArrayList<>();
- expectedTypes.add(mVisibilitySchemaProto);
+ expectedTypes.addAll(existingSchemas);
expectedTypes.addAll(expectedProto.getTypesList());
assertThat(mAppSearchImpl.getSchemaProtoLocked().getTypesList())
.containsExactlyElementsIn(expectedTypes);
@@ -594,20 +806,30 @@ public class AppSearchImplTest {
@Test
public void testSetSchema_existingSchemaRetainsVisibilitySetting() throws Exception {
+ PackageIdentifier package1 =
+ new PackageIdentifier("package1", /*sha256Certificate=*/ new byte[] {100});
+
String prefix = AppSearchImpl.createPrefix("package", "database");
mAppSearchImpl.setSchema(
"package",
"database",
Collections.singletonList(new AppSearchSchema.Builder("schema1").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.singletonList("schema1"),
+ /*schemasPackageAccessible=*/ ImmutableMap.of(
+ "schema1", ImmutableList.of(package1)),
/*forceOverride=*/ false);
- // "schema1" is platform hidden now
+ // "schema1" is platform hidden now and package visible to package1
assertThat(
mAppSearchImpl
.getVisibilityStoreLocked()
.isSchemaPlatformSurfaceable(prefix, prefix + "schema1"))
.isFalse();
+ assertThat(
+ mAppSearchImpl
+ .getVisibilityStoreLocked()
+ .isSchemaPackageAccessible(prefix, prefix + "schema1", package1))
+ .isTrue();
// Add a new schema, and include the already-existing "schema1"
mAppSearchImpl.setSchema(
@@ -617,10 +839,11 @@ public class AppSearchImplTest {
new AppSearchSchema.Builder("schema1").build(),
new AppSearchSchema.Builder("schema2").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.singletonList("schema1"),
+ /*schemasPackageAccessible=*/ ImmutableMap.of(
+ "schema1", ImmutableList.of(package1)),
/*forceOverride=*/ false);
- // Check that "schema1" is still platform hidden, but "schema2" is the default platform
- // visible.
+ // Check that "schema1" still has the same visibility settings
assertThat(
mAppSearchImpl
.getVisibilityStoreLocked()
@@ -629,12 +852,27 @@ public class AppSearchImplTest {
assertThat(
mAppSearchImpl
.getVisibilityStoreLocked()
+ .isSchemaPackageAccessible(prefix, prefix + "schema1", package1))
+ .isTrue();
+
+ // "schema2" has default visibility settings
+ assertThat(
+ mAppSearchImpl
+ .getVisibilityStoreLocked()
.isSchemaPlatformSurfaceable(prefix, prefix + "schema2"))
.isTrue();
+ assertThat(
+ mAppSearchImpl
+ .getVisibilityStoreLocked()
+ .isSchemaPackageAccessible(prefix, prefix + "schema2", package1))
+ .isFalse();
}
@Test
public void testRemoveSchema() throws Exception {
+ List<SchemaTypeConfigProto> existingSchemas =
+ mAppSearchImpl.getSchemaProtoLocked().getTypesList();
+
List<AppSearchSchema> schemas =
ImmutableList.of(
new AppSearchSchema.Builder("Email").build(),
@@ -645,6 +883,7 @@ public class AppSearchImplTest {
"database1",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
// Create expected schemaType proto.
@@ -660,7 +899,7 @@ public class AppSearchImplTest {
// Check both schema Email and Document saved correctly.
List<SchemaTypeConfigProto> expectedTypes = new ArrayList<>();
- expectedTypes.add(mVisibilitySchemaProto);
+ expectedTypes.addAll(existingSchemas);
expectedTypes.addAll(expectedProto.getTypesList());
assertThat(mAppSearchImpl.getSchemaProtoLocked().getTypesList())
.containsExactlyElementsIn(expectedTypes);
@@ -677,6 +916,7 @@ public class AppSearchImplTest {
"database1",
finalSchemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false));
assertThat(e).hasMessageThat().contains("Schema is incompatible");
assertThat(e).hasMessageThat().contains("Deleted types: [package$database1/Document]");
@@ -687,6 +927,7 @@ public class AppSearchImplTest {
"database1",
finalSchemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ true);
// Check Document schema is removed.
@@ -698,7 +939,7 @@ public class AppSearchImplTest {
.build();
expectedTypes = new ArrayList<>();
- expectedTypes.add(mVisibilitySchemaProto);
+ expectedTypes.addAll(existingSchemas);
expectedTypes.addAll(expectedProto.getTypesList());
assertThat(mAppSearchImpl.getSchemaProtoLocked().getTypesList())
.containsExactlyElementsIn(expectedTypes);
@@ -706,6 +947,9 @@ public class AppSearchImplTest {
@Test
public void testRemoveSchema_differentDataBase() throws Exception {
+ List<SchemaTypeConfigProto> existingSchemas =
+ mAppSearchImpl.getSchemaProtoLocked().getTypesList();
+
// Create schemas
List<AppSearchSchema> schemas =
ImmutableList.of(
@@ -718,12 +962,14 @@ public class AppSearchImplTest {
"database1",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
mAppSearchImpl.setSchema(
"package",
"database2",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
// Create expected schemaType proto.
@@ -745,7 +991,7 @@ public class AppSearchImplTest {
// Check Email and Document is saved in database 1 and 2 correctly.
List<SchemaTypeConfigProto> expectedTypes = new ArrayList<>();
- expectedTypes.add(mVisibilitySchemaProto);
+ expectedTypes.addAll(existingSchemas);
expectedTypes.addAll(expectedProto.getTypesList());
assertThat(mAppSearchImpl.getSchemaProtoLocked().getTypesList())
.containsExactlyElementsIn(expectedTypes);
@@ -757,6 +1003,7 @@ public class AppSearchImplTest {
"database1",
schemas,
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ true);
// Create expected schemaType list, database 1 should only contain Email but database 2
@@ -776,7 +1023,7 @@ public class AppSearchImplTest {
// Check nothing changed in database2.
expectedTypes = new ArrayList<>();
- expectedTypes.add(mVisibilitySchemaProto);
+ expectedTypes.addAll(existingSchemas);
expectedTypes.addAll(expectedProto.getTypesList());
assertThat(mAppSearchImpl.getSchemaProtoLocked().getTypesList())
.containsExactlyElementsIn(expectedTypes);
@@ -784,49 +1031,71 @@ public class AppSearchImplTest {
@Test
public void testRemoveSchema_removedFromVisibilityStore() throws Exception {
+ PackageIdentifier package1 =
+ new PackageIdentifier("package1", /*sha256Certificate=*/ new byte[] {100});
+
String prefix = AppSearchImpl.createPrefix("package", "database");
mAppSearchImpl.setSchema(
"package",
"database",
Collections.singletonList(new AppSearchSchema.Builder("schema1").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.singletonList("schema1"),
+ /*schemasPackageAccessible=*/ ImmutableMap.of(
+ "schema1", ImmutableList.of(package1)),
/*forceOverride=*/ false);
- // "schema1" is platform hidden now
+ // "schema1" is platform hidden now and package accessible
assertThat(
mAppSearchImpl
.getVisibilityStoreLocked()
.isSchemaPlatformSurfaceable(prefix, prefix + "schema1"))
.isFalse();
+ assertThat(
+ mAppSearchImpl
+ .getVisibilityStoreLocked()
+ .isSchemaPackageAccessible(prefix, prefix + "schema1", package1))
+ .isTrue();
// Remove "schema1" by force overriding
mAppSearchImpl.setSchema(
"package",
"database",
- Collections.emptyList(),
+ /*schemas=*/ Collections.emptyList(),
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ true);
- // Check that "schema1" is no longer considered platform hidden
+ // Check that "schema1" is no longer considered platform hidden or package accessible
assertThat(
mAppSearchImpl
.getVisibilityStoreLocked()
.isSchemaPlatformSurfaceable(prefix, prefix + "schema1"))
.isTrue();
+ assertThat(
+ mAppSearchImpl
+ .getVisibilityStoreLocked()
+ .isSchemaPackageAccessible(prefix, prefix + "schema1", package1))
+ .isFalse();
// Add "schema1" back, it gets default visibility settings which means it's not platform
- // hidden.
+ // hidden and not package accessible
mAppSearchImpl.setSchema(
"package",
"database",
Collections.singletonList(new AppSearchSchema.Builder("schema1").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
assertThat(
mAppSearchImpl
.getVisibilityStoreLocked()
.isSchemaPlatformSurfaceable(prefix, prefix + "schema1"))
.isTrue();
+ assertThat(
+ mAppSearchImpl
+ .getVisibilityStoreLocked()
+ .isSchemaPackageAccessible(prefix, prefix + "schema1", package1))
+ .isFalse();
}
@Test
@@ -837,6 +1106,7 @@ public class AppSearchImplTest {
"database",
Collections.singletonList(new AppSearchSchema.Builder("Schema").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
assertThat(
mAppSearchImpl
@@ -853,6 +1123,7 @@ public class AppSearchImplTest {
"database",
Collections.singletonList(new AppSearchSchema.Builder("Schema").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.singletonList("Schema"),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
assertThat(
mAppSearchImpl
@@ -862,6 +1133,46 @@ public class AppSearchImplTest {
}
@Test
+ public void testSetSchema_defaultNotPackageAccessible() throws Exception {
+ PackageIdentifier package1 =
+ new PackageIdentifier("package1", /*sha256Certificate=*/ new byte[] {100});
+
+ String prefix = AppSearchImpl.createPrefix("package", "database");
+ mAppSearchImpl.setSchema(
+ "package",
+ "database",
+ Collections.singletonList(new AppSearchSchema.Builder("Schema").build()),
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
+ /*forceOverride=*/ false);
+ assertThat(
+ mAppSearchImpl
+ .getVisibilityStoreLocked()
+ .isSchemaPackageAccessible(prefix, prefix + "Schema", package1))
+ .isFalse();
+ }
+
+ @Test
+ public void testSetSchema_packageAccessible() throws Exception {
+ PackageIdentifier package1 =
+ new PackageIdentifier("package1", /*sha256Certificate=*/ new byte[] {100});
+
+ String prefix = AppSearchImpl.createPrefix("package", "database");
+ mAppSearchImpl.setSchema(
+ "package",
+ "database",
+ Collections.singletonList(new AppSearchSchema.Builder("Schema").build()),
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ ImmutableMap.of("Schema", ImmutableList.of(package1)),
+ /*forceOverride=*/ false);
+ assertThat(
+ mAppSearchImpl
+ .getVisibilityStoreLocked()
+ .isSchemaPackageAccessible(prefix, prefix + "Schema", package1))
+ .isTrue();
+ }
+
+ @Test
public void testHasSchemaType() throws Exception {
// Nothing exists yet
assertThat(mAppSearchImpl.hasSchemaTypeLocked("package", "database", "Schema")).isFalse();
@@ -871,6 +1182,7 @@ public class AppSearchImplTest {
"database",
Collections.singletonList(new AppSearchSchema.Builder("Schema").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
assertThat(mAppSearchImpl.hasSchemaTypeLocked("package", "database", "Schema")).isTrue();
@@ -892,6 +1204,7 @@ public class AppSearchImplTest {
"database1",
Collections.singletonList(new AppSearchSchema.Builder("schema").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
assertThat(mAppSearchImpl.getPrefixesLocked())
.containsExactly(
@@ -905,6 +1218,7 @@ public class AppSearchImplTest {
"database2",
Collections.singletonList(new AppSearchSchema.Builder("schema").build()),
/*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap(),
/*forceOverride=*/ false);
assertThat(mAppSearchImpl.getPrefixesLocked())
.containsExactly(
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/VisibilityStoreTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/VisibilityStoreTest.java
index 415c1f59e2fb..e491ac327280 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/VisibilityStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/VisibilityStoreTest.java
@@ -18,6 +18,10 @@ package com.android.server.appsearch.external.localstorage;
import static com.google.common.truth.Truth.assertThat;
+import android.app.appsearch.PackageIdentifier;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.junit.Before;
@@ -70,11 +74,12 @@ public class VisibilityStoreTest {
}
@Test
- public void testSetVisibility() throws Exception {
+ public void testSetVisibility_platformSurfaceable() throws Exception {
mVisibilityStore.setVisibility(
"prefix",
/*schemasNotPlatformSurfaceable=*/ ImmutableSet.of(
- "prefix/schema1", "prefix/schema2"));
+ "prefix/schema1", "prefix/schema2"),
+ /*schemasPackageAccessible=*/ Collections.emptyMap());
assertThat(mVisibilityStore.isSchemaPlatformSurfaceable("prefix", "prefix/schema1"))
.isFalse();
assertThat(mVisibilityStore.isSchemaPlatformSurfaceable("prefix", "prefix/schema2"))
@@ -85,7 +90,8 @@ public class VisibilityStoreTest {
mVisibilityStore.setVisibility(
"prefix",
/*schemasNotPlatformSurfaceable=*/ ImmutableSet.of(
- "prefix/schema1", "prefix/schema3"));
+ "prefix/schema1", "prefix/schema3"),
+ /*schemasPackageAccessible=*/ Collections.emptyMap());
assertThat(mVisibilityStore.isSchemaPlatformSurfaceable("prefix", "prefix/schema1"))
.isFalse();
assertThat(mVisibilityStore.isSchemaPlatformSurfaceable("prefix", "prefix/schema2"))
@@ -94,7 +100,9 @@ public class VisibilityStoreTest {
.isFalse();
mVisibilityStore.setVisibility(
- "prefix", /*schemasNotPlatformSurfaceable=*/ Collections.emptySet());
+ "prefix",
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptySet(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap());
assertThat(mVisibilityStore.isSchemaPlatformSurfaceable("prefix", "prefix/schema1"))
.isTrue();
assertThat(mVisibilityStore.isSchemaPlatformSurfaceable("prefix", "prefix/schema2"))
@@ -104,13 +112,72 @@ public class VisibilityStoreTest {
}
@Test
+ public void testSetVisibility_packageAccessible() throws Exception {
+ PackageIdentifier package1 =
+ new PackageIdentifier("package1", /*sha256Certificate=*/ new byte[] {100});
+ PackageIdentifier package2 =
+ new PackageIdentifier("package2", /*sha256Certificate=*/ new byte[] {100});
+ PackageIdentifier package3 =
+ new PackageIdentifier("package3", /*sha256Certificate=*/ new byte[] {100});
+
+ mVisibilityStore.setVisibility(
+ "prefix",
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptySet(),
+ /*schemasPackageAccessible=*/ ImmutableMap.of(
+ "prefix/schema1", ImmutableList.of(package1),
+ "prefix/schema2", ImmutableList.of(package2)));
+ assertThat(mVisibilityStore.isSchemaPackageAccessible("prefix", "prefix/schema1", package1))
+ .isTrue();
+ assertThat(mVisibilityStore.isSchemaPackageAccessible("prefix", "prefix/schema2", package2))
+ .isTrue();
+
+ // New .setVisibility() call completely overrides previous visibility settings. So
+ // "schema2" isn't preserved.
+ mVisibilityStore.setVisibility(
+ "prefix",
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptySet(),
+ /*schemasPackageAccessible=*/ ImmutableMap.of(
+ "prefix/schema1", ImmutableList.of(package1),
+ "prefix/schema3", ImmutableList.of(package3)));
+ assertThat(mVisibilityStore.isSchemaPackageAccessible("prefix", "prefix/schema1", package1))
+ .isTrue();
+ assertThat(mVisibilityStore.isSchemaPackageAccessible("prefix", "prefix/schema2", package2))
+ .isFalse();
+ assertThat(mVisibilityStore.isSchemaPackageAccessible("prefix", "prefix/schema3", package3))
+ .isTrue();
+
+ mVisibilityStore.setVisibility(
+ "prefix",
+ /*schemasNotPlatformSurfaceable=*/ Collections.emptySet(),
+ /*schemasPackageAccessible=*/ Collections.emptyMap());
+ assertThat(mVisibilityStore.isSchemaPackageAccessible("prefix", "prefix/schema1", package1))
+ .isFalse();
+ assertThat(mVisibilityStore.isSchemaPackageAccessible("prefix", "prefix/schema2", package2))
+ .isFalse();
+ assertThat(mVisibilityStore.isSchemaPackageAccessible("prefix", "prefix/schema3", package3))
+ .isFalse();
+ }
+
+ @Test
public void testEmptyPrefix() throws Exception {
+ PackageIdentifier package1 =
+ new PackageIdentifier("package1", /*sha256Certificate=*/ new byte[] {100});
+ PackageIdentifier package2 =
+ new PackageIdentifier("package2", /*sha256Certificate=*/ new byte[] {100});
+
mVisibilityStore.setVisibility(
/*prefix=*/ "",
- /*schemasNotPlatformSurfaceable=*/ ImmutableSet.of("schema1", "schema2"));
+ /*schemasNotPlatformSurfaceable=*/ ImmutableSet.of("schema1", "schema2"),
+ /*schemasPackageAccessible=*/ ImmutableMap.of(
+ "schema1", ImmutableList.of(package1),
+ "schema2", ImmutableList.of(package2)));
assertThat(mVisibilityStore.isSchemaPlatformSurfaceable(/*prefix=*/ "", "schema1"))
.isFalse();
assertThat(mVisibilityStore.isSchemaPlatformSurfaceable(/*prefix=*/ "", "schema2"))
.isFalse();
+ assertThat(mVisibilityStore.isSchemaPackageAccessible(/*prefix=*/ "", "schema1", package1))
+ .isTrue();
+ assertThat(mVisibilityStore.isSchemaPackageAccessible(/*prefix=*/ "", "schema2", package2))
+ .isTrue();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
index 24e7d7d19e8d..600f6815d322 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
@@ -71,10 +71,12 @@ public class BiometricSchedulerTest {
@Test
public void testClientDuplicateFinish_ignoredBySchedulerAndDoesNotCrash() {
- final ClientMonitor.LazyDaemon<Object> nonNullDaemon = () -> mock(Object.class);
+ final BaseClientMonitor.LazyDaemon<Object> nonNullDaemon = () -> mock(Object.class);
- final ClientMonitor<Object> client1 = new TestClientMonitor(mContext, mToken, nonNullDaemon);
- final ClientMonitor<Object> client2 = new TestClientMonitor(mContext, mToken, nonNullDaemon);
+ final BaseClientMonitor<Object> client1 =
+ new TestClientMonitor(mContext, mToken, nonNullDaemon);
+ final BaseClientMonitor<Object> client2 =
+ new TestClientMonitor(mContext, mToken, nonNullDaemon);
mScheduler.scheduleClientMonitor(client1);
mScheduler.scheduleClientMonitor(client2);
@@ -87,19 +89,19 @@ public class BiometricSchedulerTest {
// Even if second client has a non-null daemon, it needs to be canceled.
Object daemon2 = mock(Object.class);
- final ClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> null;
- final ClientMonitor.LazyDaemon<Object> lazyDaemon2 = () -> daemon2;
+ final BaseClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> null;
+ final BaseClientMonitor.LazyDaemon<Object> lazyDaemon2 = () -> daemon2;
final TestClientMonitor client1 = new TestClientMonitor(mContext, mToken, lazyDaemon1);
final TestClientMonitor client2 = new TestClientMonitor(mContext, mToken, lazyDaemon2);
- final ClientMonitor.Callback callback1 = mock(ClientMonitor.Callback.class);
- final ClientMonitor.Callback callback2 = mock(ClientMonitor.Callback.class);
+ final BaseClientMonitor.Callback callback1 = mock(BaseClientMonitor.Callback.class);
+ final BaseClientMonitor.Callback callback2 = mock(BaseClientMonitor.Callback.class);
// Pretend the scheduler is busy so the first operation doesn't start right away. We want
// to pretend like there are two operations in the queue before kicking things off
mScheduler.mCurrentOperation = new BiometricScheduler.Operation(
- mock(ClientMonitor.class), mock(ClientMonitor.Callback.class));
+ mock(BaseClientMonitor.class), mock(BaseClientMonitor.Callback.class));
mScheduler.scheduleClientMonitor(client1, callback1);
assertEquals(1, mScheduler.mPendingOperations.size());
@@ -124,8 +126,8 @@ public class BiometricSchedulerTest {
// Second non-BiometricPrompt client has a valid daemon
final Object daemon2 = mock(Object.class);
- final ClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> null;
- final ClientMonitor.LazyDaemon<Object> lazyDaemon2 = () -> daemon2;
+ final BaseClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> null;
+ final BaseClientMonitor.LazyDaemon<Object> lazyDaemon2 = () -> daemon2;
final ClientMonitorCallbackConverter listener1 = mock(ClientMonitorCallbackConverter.class);
@@ -133,13 +135,13 @@ public class BiometricSchedulerTest {
new BiometricPromptClientMonitor(mContext, mToken, lazyDaemon1, listener1);
final TestClientMonitor client2 = new TestClientMonitor(mContext, mToken, lazyDaemon2);
- final ClientMonitor.Callback callback1 = mock(ClientMonitor.Callback.class);
- final ClientMonitor.Callback callback2 = mock(ClientMonitor.Callback.class);
+ final BaseClientMonitor.Callback callback1 = mock(BaseClientMonitor.Callback.class);
+ final BaseClientMonitor.Callback callback2 = mock(BaseClientMonitor.Callback.class);
// Pretend the scheduler is busy so the first operation doesn't start right away. We want
// to pretend like there are two operations in the queue before kicking things off
mScheduler.mCurrentOperation = new BiometricScheduler.Operation(
- mock(ClientMonitor.class), mock(ClientMonitor.Callback.class));
+ mock(BaseClientMonitor.class), mock(BaseClientMonitor.Callback.class));
mScheduler.scheduleClientMonitor(client1, callback1);
assertEquals(1, mScheduler.mPendingOperations.size());
@@ -165,16 +167,16 @@ public class BiometricSchedulerTest {
@Test
public void testCancelNotInvoked_whenOperationWaitingForCookie() {
- final ClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> mock(Object.class);
+ final BaseClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> mock(Object.class);
final BiometricPromptClientMonitor client1 = new BiometricPromptClientMonitor(mContext,
mToken, lazyDaemon1, mock(ClientMonitorCallbackConverter.class));
- final ClientMonitor.Callback callback1 = mock(ClientMonitor.Callback.class);
+ final BaseClientMonitor.Callback callback1 = mock(BaseClientMonitor.Callback.class);
// Schedule a BiometricPrompt authentication request
mScheduler.scheduleClientMonitor(client1, callback1);
- assertEquals(Operation.STATE_WAITING_FOR_COOKIE, mScheduler.mCurrentOperation.state);
- assertEquals(client1, mScheduler.mCurrentOperation.clientMonitor);
+ assertEquals(Operation.STATE_WAITING_FOR_COOKIE, mScheduler.mCurrentOperation.mState);
+ assertEquals(client1, mScheduler.mCurrentOperation.mClientMonitor);
assertEquals(0, mScheduler.mPendingOperations.size());
// Request it to be canceled. The operation can be canceled immediately, and the scheduler
@@ -205,7 +207,7 @@ public class BiometricSchedulerTest {
}
}
- private static class TestClientMonitor extends ClientMonitor<Object> {
+ private static class TestClientMonitor extends BaseClientMonitor<Object> {
private boolean mUnableToStart;
private boolean mStarted;
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java
index efdbda38c01c..ffd43780bfbe 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java
@@ -31,8 +31,8 @@ import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
-import com.android.server.biometrics.sensors.ClientMonitor;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import org.junit.Before;
@@ -94,7 +94,7 @@ public class FaceProviderTest {
final BiometricScheduler scheduler =
mFaceProvider.mSensors.get(prop.commonProps.sensorId).getScheduler();
for (int i = 0; i < numFakeOperations; i++) {
- final ClientMonitor testMonitor = mock(ClientMonitor.class);
+ final BaseClientMonitor testMonitor = mock(BaseClientMonitor.class);
when(testMonitor.getFreshDaemon()).thenReturn(new Object());
scheduler.scheduleClientMonitor(testMonitor);
}
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java
index 624775b775fc..175c4dacfa88 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java
@@ -31,8 +31,8 @@ import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
-import com.android.server.biometrics.sensors.ClientMonitor;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
@@ -97,7 +97,7 @@ public class FingerprintProviderTest {
final BiometricScheduler scheduler =
mFingerprintProvider.mSensors.get(prop.commonProps.sensorId).getScheduler();
for (int i = 0; i < numFakeOperations; i++) {
- final ClientMonitor testMonitor = mock(ClientMonitor.class);
+ final BaseClientMonitor testMonitor = mock(BaseClientMonitor.class);
when(testMonitor.getFreshDaemon()).thenReturn(new Object());
scheduler.scheduleClientMonitor(testMonitor);
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index bd622e1bb0d4..35876e4e1fde 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -6531,9 +6531,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
Notification notif = mService.getNotificationRecord(nr.getSbn().getKey()).getNotification();
assertTrue(notif.isBubbleNotification());
- // Our flags should have failed since we're not foreground
+ // The flag should have failed since we're not foreground
assertFalse(notif.getBubbleMetadata().getAutoExpandBubble());
- assertFalse(notif.getBubbleMetadata().isNotificationSuppressed());
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
index f1dc098fccf6..6b69ee921c8b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
@@ -351,6 +351,22 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase {
}
@Test
+ public void testActivityDrawnBeforeTransition() {
+ mTopActivity.setVisible(false);
+ notifyActivityLaunching(mTopActivity.intent);
+ // Assume the activity is launched the second time consecutively. The drawn event is from
+ // the first time (omitted in test) launch that is earlier than transition.
+ doReturn(true).when(mTopActivity).isReportedDrawn();
+ notifyWindowsDrawn(mTopActivity);
+ notifyActivityLaunched(START_SUCCESS, mTopActivity);
+ // If the launching activity was drawn when starting transition, the launch event should
+ // be reported successfully.
+ notifyTransitionStarting(mTopActivity);
+
+ verifyOnActivityLaunchFinished(mTopActivity);
+ }
+
+ @Test
public void testActivityRecordProtoIsNotTooBig() {
// The ActivityRecordProto must not be too big, otherwise converting it at runtime
// will become prohibitively expensive.
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 83cadf33222a..610edc0a5e14 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -1507,7 +1507,7 @@ public class ActivityRecordTests extends WindowTestsBase {
final ActivityRecord activity = createActivityWithTask();
final WindowProcessController wpc = activity.app;
assertTrue(wpc.registeredForActivityConfigChanges());
- assertFalse(wpc.registeredForDisplayConfigChanges());
+ assertFalse(wpc.registeredForDisplayAreaConfigChanges());
final ActivityRecord secondaryDisplayActivity =
createActivityOnDisplay(false /* defaultDisplay */, null /* process */);
@@ -1701,7 +1701,7 @@ public class ActivityRecordTests extends WindowTestsBase {
assertTrue(wpc.registeredForActivityConfigChanges());
assertEquals(0, secondActivityRecord.getMergedOverrideConfiguration()
.diff(wpc.getRequestedOverrideConfiguration()));
- assertFalse(wpc.registeredForDisplayConfigChanges());
+ assertFalse(wpc.registeredForDisplayAreaConfigChanges());
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
index 99ec954926b4..6f5a874114ea 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
@@ -43,15 +43,11 @@ import static com.android.server.wm.testing.Assert.assertThrows;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
import android.content.pm.ActivityInfo;
import android.graphics.Rect;
@@ -60,7 +56,6 @@ import android.platform.test.annotations.Presubmit;
import android.view.SurfaceControl;
import android.view.View;
import android.view.WindowManager;
-import android.window.IDisplayAreaOrganizer;
import com.google.android.collect.Lists;
@@ -503,42 +498,6 @@ public class DisplayAreaTest extends WindowTestsBase {
assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda);
}
- @Test
- public void onParentChanged_onDisplayAreaAppeared() {
- final DisplayArea<WindowContainer> displayArea = new DisplayArea<>(
- mWm, BELOW_TASKS, "NewArea", FEATURE_DEFAULT_TASK_CONTAINER);
-
- final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class);
- spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController);
- when(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController
- .getOrganizerByFeature(FEATURE_DEFAULT_TASK_CONTAINER))
- .thenReturn(mockDisplayAreaOrganizer);
-
- mDisplayContent.addChild(displayArea, 0);
- assertEquals(mockDisplayAreaOrganizer, displayArea.mOrganizer);
- verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController)
- .onDisplayAreaAppeared(
- eq(mockDisplayAreaOrganizer),
- argThat(it -> it == displayArea && it.getSurfaceControl() != null));
- }
-
- @Test
- public void onParentChanged_onDisplayAreaVanished() {
- final DisplayArea<WindowContainer> displayArea = new DisplayArea<>(
- mWm, BELOW_TASKS, "NewArea", FEATURE_DEFAULT_TASK_CONTAINER);
-
- final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class);
- displayArea.mOrganizer = mockDisplayAreaOrganizer;
- spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController);
-
- mDisplayContent.addChild(displayArea, 0);
- displayArea.removeImmediately();
-
- assertNull(displayArea.mOrganizer);
- verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController)
- .onDisplayAreaVanished(mockDisplayAreaOrganizer, displayArea);
- }
-
private static class TestDisplayArea<T extends WindowContainer> extends DisplayArea<T> {
private TestDisplayArea(WindowManagerService wms, Rect bounds) {
super(wms, ANY, "half display area");
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 69b8ccf31115..9527625d50ff 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -872,6 +872,16 @@ public class DisplayContentTests extends WindowTestsBase {
mDisplayContent.getImeTarget(IME_TARGET_LAYERING));
}
+ @UseTestDisplay(addWindows = W_INPUT_METHOD)
+ @Test
+ public void testInputMethodSet_listenOnDisplayAreaConfigurationChanged() {
+ spyOn(mAtm);
+ mDisplayContent.setInputMethodWindowLocked(mImeWindow);
+
+ verify(mAtm).onImeWindowSetOnDisplayArea(
+ mImeWindow.mSession.mPid, mDisplayContent.getImeContainer());
+ }
+
@Test
public void testAllowsTopmostFullscreenOrientation() {
final DisplayContent dc = createNewDisplay();
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
index d8be2c1a21a7..fe7bdd8f620a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -80,8 +80,6 @@ import android.window.WindowContainerTransaction;
import androidx.test.filters.SmallTest;
-import com.android.server.wm.TaskOrganizerController.PendingTaskEvent;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -152,14 +150,10 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer();
final Task stack = createStack();
final Task task = createTask(stack);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
stack.removeImmediately();
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer).onTaskVanished(any());
}
@@ -168,21 +162,15 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer();
final Task stack = createStack();
final Task task = createTask(stack, false);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, never())
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
stack.setHasBeenVisible(true);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
assertTrue(stack.getHasBeenVisible());
verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
stack.removeImmediately();
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer).onTaskVanished(any());
}
@@ -207,16 +195,12 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer();
final Task stack = createStack();
final Task task = createTask(stack, false /* fakeDraw */);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, never())
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
assertTrue(stack.isOrganized());
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
assertTaskVanished(organizer, false /* expectVanished */, stack);
assertFalse(stack.isOrganized());
}
@@ -226,16 +210,11 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer();
final Task stack = createStack();
final Task task = createTask(stack);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
assertTrue(stack.isOrganized());
stack.setTaskOrganizer(null);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
-
verify(organizer).onTaskVanished(any());
assertFalse(stack.isOrganized());
}
@@ -245,16 +224,11 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer();
final Task stack = createStack();
final Task task = createTask(stack);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
assertTrue(stack.isOrganized());
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
-
assertTaskVanished(organizer, true /* expectVanished */, stack);
assertFalse(stack.isOrganized());
}
@@ -269,8 +243,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
final Task task3 = createTask(stack3);
final ArrayList<TaskAppearedInfo> existingTasks = new ArrayList<>();
final ITaskOrganizer organizer = registerMockOrganizer(existingTasks);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
// verify that tasks are returned and taskAppeared is not called
assertContainsTasks(existingTasks, stack, stack2, stack3);
@@ -282,8 +254,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
// Now we replace the registration and verify the new organizer receives existing tasks
final ArrayList<TaskAppearedInfo> existingTasks2 = new ArrayList<>();
final ITaskOrganizer organizer2 = registerMockOrganizer(existingTasks2);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
assertContainsTasks(existingTasks2, stack, stack2, stack3);
verify(organizer2, times(0)).onTaskAppeared(any(RunningTaskInfo.class),
any(SurfaceControl.class));
@@ -295,8 +265,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
// Now we unregister the second one, the first one should automatically be reregistered
// so we verify that it's now seeing changes.
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, times(3))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
assertTaskVanished(organizer2, true /* expectVanished */, stack, stack2, stack3);
@@ -631,8 +599,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
Task task = mWm.mAtmService.mTaskOrganizerController.createRootTask(
mDisplayContent, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, null);
RunningTaskInfo info1 = task.getTaskInfo();
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
lastReportedTiles.clear();
called[0] = false;
@@ -707,8 +673,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
Task task2 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
mDisplayContent, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, null);
RunningTaskInfo info2 = task2.getTaskInfo();
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
final int initialRootTaskCount = mWm.mAtmService.mTaskOrganizerController.getRootTasks(
mDisplayContent.mDisplayId, null /* activityTypes */).size();
@@ -892,8 +856,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
.setAspectRatio(new Rational(3, 4)).build();
mWm.mAtmService.mActivityClientController.setPictureInPictureParams(record.token, p2);
waitUntilHandlersIdle();
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
assertNotNull(o.mChangedInfo);
assertNotNull(o.mChangedInfo.pictureInPictureParams);
final Rational ratio = o.mChangedInfo.pictureInPictureParams.getAspectRatioRational();
@@ -933,24 +895,16 @@ public class WindowOrganizerTests extends WindowTestsBase {
stack.setTaskOrganizer(organizer);
// setHasBeenVisible was already called once by the set-up code.
stack.setHasBeenVisible(true);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, times(1))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
stack.setTaskOrganizer(null);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, times(1)).onTaskVanished(any());
stack.setTaskOrganizer(organizer);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, times(2))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
stack.removeImmediately();
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, times(2)).onTaskVanished(any());
}
@@ -969,8 +923,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
// Verify a back pressed does not call the organizer
mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, never()).onBackPressedOnTaskRoot(any());
// Enable intercepting back
@@ -979,8 +931,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
// Verify now that the back press does call the organizer
mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, times(1)).onBackPressedOnTaskRoot(any());
// Disable intercepting back
@@ -989,8 +939,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
// Verify now that the back press no longer calls the organizer
mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token);
- // Ensure events dispatch to organizer.
- mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
verify(organizer, times(1)).onBackPressedOnTaskRoot(any());
}
@@ -1071,151 +1019,6 @@ public class WindowOrganizerTests extends WindowTestsBase {
assertTrue(task2.isOrganized());
}
- @Test
- public void testAppearDeferThenInfoChange() {
- final ITaskOrganizer organizer = registerMockOrganizer();
- final Task stack = createStack();
-
- // Assume layout defer
- mWm.mWindowPlacerLocked.deferLayout();
-
- final Task task = createTask(stack);
- final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
-
- stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
- record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription"));
- waitUntilHandlersIdle();
-
- ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
- assertEquals(1, pendingEvents.size());
- assertEquals(PendingTaskEvent.EVENT_APPEARED, pendingEvents.get(0).mEventType);
- assertEquals("TestDescription",
- pendingEvents.get(0).mTask.getTaskInfo().taskDescription.getLabel());
- }
-
- @Test
- public void testAppearDeferThenVanish() {
- final ITaskOrganizer organizer = registerMockOrganizer();
- final Task stack = createStack();
-
- // Assume layout defer
- mWm.mWindowPlacerLocked.deferLayout();
-
- final Task task = createTask(stack);
-
- stack.removeImmediately();
- waitUntilHandlersIdle();
-
- ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
- assertEquals(0, pendingEvents.size());
- }
-
- @Test
- public void testInfoChangeDeferMultiple() {
- final ITaskOrganizer organizer = registerMockOrganizer();
- final Task stack = createStack();
- final Task task = createTask(stack);
- final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
-
- // Assume layout defer
- mWm.mWindowPlacerLocked.deferLayout();
-
- stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
- record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription"));
- waitUntilHandlersIdle();
-
- ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
- assertEquals(1, pendingEvents.size());
- assertEquals(PendingTaskEvent.EVENT_INFO_CHANGED, pendingEvents.get(0).mEventType);
- assertEquals("TestDescription",
- pendingEvents.get(0).mTask.getTaskInfo().taskDescription.getLabel());
-
- record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription2"));
- waitUntilHandlersIdle();
-
- pendingEvents = getTaskPendingEvent(stack);
- assertEquals(1, pendingEvents.size());
- assertEquals(PendingTaskEvent.EVENT_INFO_CHANGED, pendingEvents.get(0).mEventType);
- assertEquals("TestDescription2",
- pendingEvents.get(0).mTask.getTaskInfo().taskDescription.getLabel());
- }
-
- @Test
- public void testInfoChangDeferThenVanish() {
- final ITaskOrganizer organizer = registerMockOrganizer();
- final Task stack = createStack();
- final Task task = createTask(stack);
- final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
-
- // Assume layout defer
- mWm.mWindowPlacerLocked.deferLayout();
-
- stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
- record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription"));
-
- stack.removeImmediately();
- waitUntilHandlersIdle();
-
- ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
- assertEquals(1, pendingEvents.size());
- assertEquals(PendingTaskEvent.EVENT_VANISHED, pendingEvents.get(0).mEventType);
- assertEquals("TestDescription",
- pendingEvents.get(0).mTask.getTaskInfo().taskDescription.getLabel());
- }
-
- @Test
- public void testVanishDeferThenInfoChange() {
- final ITaskOrganizer organizer = registerMockOrganizer();
- final Task stack = createStack();
- final Task task = createTask(stack);
- final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
-
- // Assume layout defer
- mWm.mWindowPlacerLocked.deferLayout();
-
- stack.removeImmediately();
- stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
- waitUntilHandlersIdle();
-
- ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
- assertEquals(1, pendingEvents.size());
- assertEquals(PendingTaskEvent.EVENT_VANISHED, pendingEvents.get(0).mEventType);
- }
-
- @Test
- public void testVanishDeferThenBackOnRoot() {
- final ITaskOrganizer organizer = registerMockOrganizer();
- final Task stack = createStack();
- final Task task = createTask(stack);
- final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
-
- // Assume layout defer
- mWm.mWindowPlacerLocked.deferLayout();
-
- stack.removeImmediately();
- mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(record.token);
- waitUntilHandlersIdle();
-
- ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
- assertEquals(1, pendingEvents.size());
- assertEquals(PendingTaskEvent.EVENT_VANISHED, pendingEvents.get(0).mEventType);
- }
-
- private ArrayList<PendingTaskEvent> getTaskPendingEvent(Task task) {
- ArrayList<PendingTaskEvent> total =
- mWm.mAtmService.mTaskOrganizerController.getPendingEventList();
- ArrayList<PendingTaskEvent> result = new ArrayList();
-
- for (int i = 0; i < total.size(); i++) {
- PendingTaskEvent entry = total.get(i);
- if (entry.mTask.mTaskId == task.mTaskId) {
- result.add(entry);
- }
- }
-
- return result;
- }
-
/**
* Verifies that task vanished is called for a specific task.
*/
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
index 3057558a6e98..f848ce5e5579 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
@@ -20,7 +20,6 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
-import static android.view.Display.INVALID_DISPLAY;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
@@ -41,6 +40,7 @@ import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Configuration;
+import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import org.junit.Before;
@@ -74,41 +74,69 @@ public class WindowProcessControllerTests extends WindowTestsBase {
}
@Test
- public void testDisplayConfigurationListener() {
-
- //By default, the process should not listen to any display.
- assertEquals(INVALID_DISPLAY, mWpc.getDisplayId());
-
- // Register to display 1 as a listener.
- TestDisplayContent testDisplayContent1 = createTestDisplayContentInContainer();
- mWpc.registerDisplayConfigurationListener(testDisplayContent1);
- assertTrue(testDisplayContent1.containsListener(mWpc));
- assertEquals(testDisplayContent1.mDisplayId, mWpc.getDisplayId());
-
- // Move to display 2.
- TestDisplayContent testDisplayContent2 = createTestDisplayContentInContainer();
- mWpc.registerDisplayConfigurationListener(testDisplayContent2);
- assertFalse(testDisplayContent1.containsListener(mWpc));
- assertTrue(testDisplayContent2.containsListener(mWpc));
- assertEquals(testDisplayContent2.mDisplayId, mWpc.getDisplayId());
-
- // Null DisplayContent will not change anything.
- mWpc.registerDisplayConfigurationListener(null);
- assertTrue(testDisplayContent2.containsListener(mWpc));
- assertEquals(testDisplayContent2.mDisplayId, mWpc.getDisplayId());
-
- // Unregister listener will remove the wpc from registered displays.
- mWpc.unregisterDisplayConfigurationListener();
- assertFalse(testDisplayContent1.containsListener(mWpc));
- assertFalse(testDisplayContent2.containsListener(mWpc));
- assertEquals(INVALID_DISPLAY, mWpc.getDisplayId());
+ public void testDisplayAreaConfigurationListener() {
+ // By default, the process should not listen to any display area.
+ assertNull(mWpc.getDisplayArea());
+
+ // Register to ImeContainer on display 1 as a listener.
+ final TestDisplayContent testDisplayContent1 = createTestDisplayContentInContainer();
+ final DisplayArea imeContainer1 = testDisplayContent1.getImeContainer();
+ mWpc.registerDisplayAreaConfigurationListener(imeContainer1);
+ assertTrue(imeContainer1.containsListener(mWpc));
+ assertEquals(imeContainer1, mWpc.getDisplayArea());
+
+ // Register to ImeContainer on display 2 as a listener.
+ final TestDisplayContent testDisplayContent2 = createTestDisplayContentInContainer();
+ final DisplayArea imeContainer2 = testDisplayContent2.getImeContainer();
+ mWpc.registerDisplayAreaConfigurationListener(imeContainer2);
+ assertFalse(imeContainer1.containsListener(mWpc));
+ assertTrue(imeContainer2.containsListener(mWpc));
+ assertEquals(imeContainer2, mWpc.getDisplayArea());
+
+ // Null DisplayArea will not change anything.
+ mWpc.registerDisplayAreaConfigurationListener(null);
+ assertTrue(imeContainer2.containsListener(mWpc));
+ assertEquals(imeContainer2, mWpc.getDisplayArea());
+
+ // Unregister listener will remove the wpc from registered display area.
+ mWpc.unregisterDisplayAreaConfigurationListener();
+ assertFalse(imeContainer1.containsListener(mWpc));
+ assertFalse(imeContainer2.containsListener(mWpc));
+ assertNull(mWpc.getDisplayArea());
// Unregistration still work even if the display was removed.
- mWpc.registerDisplayConfigurationListener(testDisplayContent1);
- assertEquals(testDisplayContent1.mDisplayId, mWpc.getDisplayId());
+ mWpc.registerDisplayAreaConfigurationListener(imeContainer1);
+ assertEquals(imeContainer1, mWpc.getDisplayArea());
mRootWindowContainer.removeChild(testDisplayContent1);
- mWpc.unregisterDisplayConfigurationListener();
- assertEquals(INVALID_DISPLAY, mWpc.getDisplayId());
+ mWpc.unregisterDisplayAreaConfigurationListener();
+ assertNull(mWpc.getDisplayArea());
+ }
+
+ @Test
+ public void testDisplayAreaConfigurationListener_verifyConfig() {
+ final Rect displayBounds = new Rect(0, 0, 2000, 1000);
+ final DisplayContent display = new TestDisplayContent.Builder(
+ mAtm, displayBounds.width(), displayBounds.height())
+ .setDensityDpi(300)
+ .setPosition(DisplayContent.POSITION_TOP)
+ .build();
+ final DisplayArea imeContainer = display.getImeContainer();
+
+ // Register to the ime container.
+ mWpc.registerDisplayAreaConfigurationListener(imeContainer);
+
+ assertEquals(displayBounds, mWpc.getConfiguration().windowConfiguration.getBounds());
+
+ // Resize the ime container.
+ final Rect resizeImeBounds = new Rect(0, 0, 1000, 1000);
+ imeContainer.setBounds(resizeImeBounds);
+
+ assertEquals(resizeImeBounds, mWpc.getConfiguration().windowConfiguration.getBounds());
+
+ // Register to the display.
+ mWpc.registerDisplayAreaConfigurationListener(display);
+
+ assertEquals(displayBounds, mWpc.getConfiguration().windowConfiguration.getBounds());
}
@Test
@@ -149,18 +177,19 @@ public class WindowProcessControllerTests extends WindowTestsBase {
}
@Test
- public void testConfigurationForSecondaryScreen() {
- // By default, the process should not listen to any display.
- assertEquals(INVALID_DISPLAY, mWpc.getDisplayId());
+ public void testConfigurationForSecondaryScreenDisplayArea() {
+ // By default, the process should not listen to any display area.
+ assertNull(mWpc.getDisplayArea());
- // Register to a new display as a listener.
+ // Register to the ImeContainer on the new display as a listener.
final DisplayContent display = new TestDisplayContent.Builder(mAtm, 2000, 1000)
.setDensityDpi(300).setPosition(DisplayContent.POSITION_TOP).build();
- mWpc.registerDisplayConfigurationListener(display);
+ final DisplayArea imeContainer = display.getImeContainer();
+ mWpc.registerDisplayAreaConfigurationListener(imeContainer);
- assertEquals(display.mDisplayId, mWpc.getDisplayId());
+ assertEquals(imeContainer, mWpc.getDisplayArea());
final Configuration expectedConfig = mAtm.mRootWindowContainer.getConfiguration();
- expectedConfig.updateFrom(display.getConfiguration());
+ expectedConfig.updateFrom(imeContainer.getConfiguration());
assertEquals(expectedConfig, mWpc.getConfiguration());
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index bfd37cd60806..27025759a317 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -564,9 +564,10 @@ public class TelephonyManager {
/**
* Indicates the maximum size of the call composure picture.
*
- * Pictures sent via {@link #uploadCallComposerPicture(InputStream, Executor, OutcomeReceiver)}
- * or {@link #uploadCallComposerPicture(Path, Executor, OutcomeReceiver)} must not exceed this
- * size, or an error will be returned via the callback in those methods.
+ * Pictures sent via
+ * {@link #uploadCallComposerPicture(InputStream, String, Executor, OutcomeReceiver)}
+ * or {@link #uploadCallComposerPicture(Path, String, Executor, OutcomeReceiver)} must not
+ * exceed this size, or an error will be returned via the callback in those methods.
*
* @return Maximum file size in bytes.
*/
@@ -4310,6 +4311,15 @@ public class TelephonyManager {
*/
public static final int ERROR_IO_EXCEPTION = 5;
+ /**
+ * Indicates that the device is currently not connected to a network that's capable of
+ * reaching a carrier's RCS servers.
+ *
+ * Clients should prompt the user to remedy the issue by moving to an area with better
+ * signal, by connecting to a different network, or to retry at another time.
+ */
+ public static final int ERROR_NETWORK_UNAVAILABLE = 6;
+
/** @hide */
@IntDef(prefix = {"ERROR_"}, value = {
ERROR_UNKNOWN,
@@ -4318,7 +4328,9 @@ public class TelephonyManager {
ERROR_AUTHENTICATION_FAILED,
ERROR_INPUT_CLOSED,
ERROR_IO_EXCEPTION,
+ ERROR_NETWORK_UNAVAILABLE,
})
+
@Retention(RetentionPolicy.SOURCE)
public @interface CallComposerError {}
@@ -4355,14 +4367,16 @@ public class TelephonyManager {
/**
* Uploads a picture to the carrier network for use with call composer.
*
- * @see #uploadCallComposerPicture(InputStream, Executor, OutcomeReceiver)
+ * @see #uploadCallComposerPicture(InputStream, String, Executor, OutcomeReceiver)
* @param pictureToUpload Path to a local file containing the picture to upload.
+ * @param contentType The MIME type of the picture you're uploading (e.g. image/jpeg)
* @param executor The {@link Executor} on which the {@code pictureToUpload} file will be read
* from disk, as well as on which {@code callback} will be called.
* @param callback A callback called when the upload operation terminates, either in success
* or in error.
*/
public void uploadCallComposerPicture(@NonNull Path pictureToUpload,
+ @NonNull String contentType,
@CallbackExecutor @NonNull Executor executor,
@NonNull OutcomeReceiver<ParcelUuid, CallComposerException> callback) {
Objects.requireNonNull(pictureToUpload);
@@ -4390,7 +4404,7 @@ public class TelephonyManager {
}
InputStream fileStream = Files.newInputStream(pictureToUpload);
try {
- uploadCallComposerPicture(fileStream, executor,
+ uploadCallComposerPicture(fileStream, contentType, executor,
new OutcomeReceiver<ParcelUuid, CallComposerException>() {
@Override
public void onResult(ParcelUuid result) {
@@ -4455,12 +4469,14 @@ public class TelephonyManager {
* of {@link #getMaximumCallComposerPictureSize()}, the upload will be
* aborted and the callback will be called with an exception containing
* {@link CallComposerException#ERROR_FILE_TOO_LARGE}.
+ * @param contentType The MIME type of the picture you're uploading (e.g. image/jpeg)
* @param executor The {@link Executor} on which the {@code pictureToUpload} stream will be
* read, as well as on which the callback will be called.
* @param callback A callback called when the upload operation terminates, either in success
* or in error.
*/
public void uploadCallComposerPicture(@NonNull InputStream pictureToUpload,
+ @NonNull String contentType,
@CallbackExecutor @NonNull Executor executor,
@NonNull OutcomeReceiver<ParcelUuid, CallComposerException> callback) {
Objects.requireNonNull(pictureToUpload);
@@ -4488,7 +4504,7 @@ public class TelephonyManager {
try {
telephony.uploadCallComposerPicture(getSubId(), mContext.getOpPackageName(),
- readFd, new ResultReceiver(null) {
+ contentType, readFd, new ResultReceiver(null) {
@Override
protected void onReceiveResult(int resultCode, Bundle result) {
if (resultCode != CallComposerException.SUCCESS) {
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 83fb38be820d..46c9dde6023e 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1262,7 +1262,7 @@ interface ITelephony {
int getRadioAccessFamily(in int phoneId, String callingPackage);
void uploadCallComposerPicture(int subscriptionId, String callingPackage,
- in ParcelFileDescriptor fd, in ResultReceiver callback);
+ String contentType, in ParcelFileDescriptor fd, in ResultReceiver callback);
/**
* Enables or disables video calling.