summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk6
-rw-r--r--api/current.txt178
-rw-r--r--api/removed.txt6
-rw-r--r--api/system-current.txt180
-rw-r--r--api/system-removed.txt6
-rw-r--r--api/test-current.txt178
-rw-r--r--api/test-removed.txt6
-rw-r--r--core/java/android/app/Activity.java99
-rw-r--r--core/java/android/app/ActivityManager.java6
-rw-r--r--core/java/android/app/ActivityThread.java31
-rw-r--r--core/java/android/app/IActivityManager.aidl3
-rw-r--r--core/java/android/app/INotificationManager.aidl4
-rw-r--r--core/java/android/app/IOnNotificationChannelCreatedListener.aidl25
-rw-r--r--core/java/android/app/NotificationManager.java41
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java46
-rw-r--r--core/java/android/app/admin/IDevicePolicyManager.aidl2
-rw-r--r--core/java/android/app/assist/AssistStructure.java111
-rw-r--r--core/java/android/app/usage/ExternalStorageStats.aidl (renamed from core/java/android/app/usage/StorageSummary.aidl)2
-rw-r--r--core/java/android/app/usage/ExternalStorageStats.java103
-rw-r--r--core/java/android/app/usage/IStorageStatsManager.aidl9
-rw-r--r--core/java/android/app/usage/StorageStats.java74
-rw-r--r--core/java/android/app/usage/StorageStatsManager.java84
-rw-r--r--core/java/android/app/usage/StorageSummary.java161
-rw-r--r--core/java/android/appwidget/AppWidgetHostView.java6
-rw-r--r--core/java/android/bluetooth/BluetoothSocket.java10
-rw-r--r--core/java/android/hardware/display/DisplayManagerInternal.java8
-rw-r--r--core/java/android/net/ConnectivityManager.java3
-rw-r--r--core/java/android/net/INetworkScoreService.aidl17
-rw-r--r--core/java/android/net/LocalServerSocket.java2
-rw-r--r--core/java/android/net/LocalSocket.java34
-rw-r--r--core/java/android/net/LocalSocketImpl.java2
-rw-r--r--core/java/android/net/NetworkScoreManager.java23
-rw-r--r--core/java/android/net/NetworkScorerAppManager.java4
-rw-r--r--core/java/android/os/IUserManager.aidl1
-rw-r--r--core/java/android/os/PowerManager.java51
-rw-r--r--core/java/android/os/UserManager.java13
-rw-r--r--core/java/android/provider/AlarmClock.java9
-rwxr-xr-xcore/java/android/provider/Settings.java10
-rw-r--r--core/java/android/service/autofill/AutoFillService.java105
-rw-r--r--core/java/android/service/autofill/FillCallback.java112
-rw-r--r--core/java/android/service/autofill/FillableInputField.java99
-rw-r--r--core/java/android/service/autofill/IAutoFillAppCallback.aidl (renamed from core/java/android/service/autofill/IAutoFillCallback.aidl)7
-rw-r--r--core/java/android/service/autofill/IAutoFillManagerService.aidl3
-rw-r--r--core/java/android/service/autofill/IAutoFillServerCallback.aidl31
-rw-r--r--core/java/android/service/autofill/IAutoFillService.aidl11
-rw-r--r--core/java/android/service/autofill/SaveCallback.java44
-rw-r--r--core/java/android/text/DynamicLayout.java10
-rw-r--r--core/java/android/text/Layout.java135
-rw-r--r--core/java/android/text/StaticLayout.java20
-rw-r--r--core/java/android/text/TextLine.java54
-rw-r--r--core/java/android/transition/ArcMotion.java126
-rw-r--r--core/java/android/view/Display.java14
-rw-r--r--core/java/android/view/FocusFinder.java123
-rw-r--r--core/java/android/view/SurfaceHolder.java27
-rw-r--r--core/java/android/view/SurfaceView.java16
-rw-r--r--core/java/android/view/ThreadedRenderer.java12
-rw-r--r--core/java/android/view/View.java280
-rw-r--r--core/java/android/view/ViewGroup.java171
-rw-r--r--core/java/android/view/ViewOverlay.java3
-rw-r--r--core/java/android/view/ViewParent.java19
-rw-r--r--core/java/android/view/ViewRootImpl.java87
-rw-r--r--core/java/android/view/ViewStructure.java26
-rw-r--r--core/java/android/view/WindowManagerPolicy.java27
-rw-r--r--core/java/android/view/accessibility/AccessibilityCache.java3
-rw-r--r--core/java/android/view/animation/AnimationSet.java2
-rw-r--r--core/java/android/view/autofill/AutoFillId.aidl19
-rw-r--r--core/java/android/view/autofill/AutoFillId.java125
-rw-r--r--core/java/android/view/autofill/AutoFillType.aidl19
-rw-r--r--core/java/android/view/autofill/AutoFillType.java211
-rw-r--r--core/java/android/view/autofill/AutoFillValue.aidl19
-rw-r--r--core/java/android/view/autofill/AutoFillValue.java150
-rw-r--r--core/java/android/view/autofill/Dataset.aidl19
-rw-r--r--core/java/android/view/autofill/Dataset.java181
-rw-r--r--core/java/android/view/autofill/DatasetField.java86
-rw-r--r--core/java/android/view/autofill/FieldId.aidl19
-rw-r--r--core/java/android/view/autofill/FillResponse.aidl19
-rw-r--r--core/java/android/view/autofill/FillResponse.java288
-rw-r--r--core/java/android/view/autofill/Helper.java48
-rw-r--r--core/java/android/view/autofill/VirtualViewDelegate.java123
-rw-r--r--core/java/android/webkit/WebView.java4
-rw-r--r--core/java/android/webkit/WebViewProvider.java2
-rw-r--r--core/java/android/widget/CompoundButton.java25
-rw-r--r--core/java/android/widget/EditText.java26
-rw-r--r--core/java/android/widget/RadioGroup.java26
-rw-r--r--core/java/android/widget/Switch.java15
-rw-r--r--core/java/android/widget/TextView.java47
-rw-r--r--core/java/com/android/internal/os/Zygote.java9
-rw-r--r--core/java/com/android/internal/os/ZygoteConnection.java5
-rw-r--r--core/java/com/android/internal/view/BaseSurfaceHolder.java2
-rw-r--r--core/java/com/android/internal/view/IInputConnectionWrapper.java16
-rw-r--r--core/java/com/android/internal/view/SurfaceCallbackHelper.java77
-rw-r--r--core/java/com/android/internal/widget/SwipeDismissLayout.java64
-rw-r--r--core/jni/android_text_StaticLayout.cpp6
-rw-r--r--core/jni/com_android_internal_os_Zygote.cpp34
-rw-r--r--core/jni/fd_utils.cpp12
-rw-r--r--core/jni/fd_utils.h4
-rw-r--r--core/res/res/values-af/strings.xml3
-rw-r--r--core/res/res/values-am/strings.xml3
-rw-r--r--core/res/res/values-ar/strings.xml3
-rw-r--r--core/res/res/values-az-rAZ/strings.xml3
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml3
-rw-r--r--core/res/res/values-be-rBY/strings.xml3
-rw-r--r--core/res/res/values-bg/strings.xml3
-rw-r--r--core/res/res/values-bn-rBD/strings.xml3
-rw-r--r--core/res/res/values-bs-rBA/strings.xml3
-rw-r--r--core/res/res/values-ca/strings.xml3
-rw-r--r--core/res/res/values-cs/strings.xml3
-rw-r--r--core/res/res/values-da/strings.xml7
-rw-r--r--core/res/res/values-de/strings.xml3
-rw-r--r--core/res/res/values-el/strings.xml3
-rw-r--r--core/res/res/values-en-rAU/strings.xml3
-rw-r--r--core/res/res/values-en-rGB/strings.xml3
-rw-r--r--core/res/res/values-en-rIN/strings.xml3
-rw-r--r--core/res/res/values-es-rUS/strings.xml3
-rw-r--r--core/res/res/values-es/strings.xml3
-rw-r--r--core/res/res/values-et-rEE/strings.xml3
-rw-r--r--core/res/res/values-eu-rES/strings.xml3
-rw-r--r--core/res/res/values-fa/strings.xml3
-rw-r--r--core/res/res/values-fi/strings.xml3
-rw-r--r--core/res/res/values-fr-rCA/strings.xml3
-rw-r--r--core/res/res/values-fr/strings.xml3
-rw-r--r--core/res/res/values-gl-rES/strings.xml3
-rw-r--r--core/res/res/values-gu-rIN/strings.xml3
-rw-r--r--core/res/res/values-hi/strings.xml13
-rw-r--r--core/res/res/values-hr/strings.xml3
-rw-r--r--core/res/res/values-hu/strings.xml3
-rw-r--r--core/res/res/values-hy-rAM/strings.xml5
-rw-r--r--core/res/res/values-in/strings.xml3
-rw-r--r--core/res/res/values-is-rIS/strings.xml3
-rw-r--r--core/res/res/values-it/strings.xml3
-rw-r--r--core/res/res/values-iw/strings.xml3
-rw-r--r--core/res/res/values-ja/strings.xml3
-rw-r--r--core/res/res/values-ka-rGE/strings.xml3
-rw-r--r--core/res/res/values-kk-rKZ/strings.xml3
-rw-r--r--core/res/res/values-km-rKH/strings.xml3
-rw-r--r--core/res/res/values-kn-rIN/strings.xml5
-rw-r--r--core/res/res/values-ko/strings.xml3
-rw-r--r--core/res/res/values-ky-rKG/strings.xml3
-rw-r--r--core/res/res/values-lo-rLA/strings.xml3
-rw-r--r--core/res/res/values-lt/strings.xml3
-rw-r--r--core/res/res/values-lv/strings.xml3
-rw-r--r--core/res/res/values-mk-rMK/strings.xml3
-rw-r--r--core/res/res/values-ml-rIN/strings.xml3
-rw-r--r--core/res/res/values-mn-rMN/strings.xml3
-rw-r--r--core/res/res/values-mr-rIN/strings.xml3
-rw-r--r--core/res/res/values-ms-rMY/strings.xml3
-rw-r--r--core/res/res/values-my-rMM/strings.xml3
-rw-r--r--core/res/res/values-nb/strings.xml3
-rw-r--r--core/res/res/values-ne-rNP/strings.xml3
-rw-r--r--core/res/res/values-nl/strings.xml3
-rw-r--r--core/res/res/values-pa-rIN/strings.xml3
-rw-r--r--core/res/res/values-pl/strings.xml3
-rw-r--r--core/res/res/values-pt-rBR/strings.xml3
-rw-r--r--core/res/res/values-pt-rPT/strings.xml3
-rw-r--r--core/res/res/values-pt/strings.xml3
-rw-r--r--core/res/res/values-ro/strings.xml3
-rw-r--r--core/res/res/values-ru/strings.xml3
-rw-r--r--core/res/res/values-si-rLK/strings.xml3
-rw-r--r--core/res/res/values-sk/strings.xml3
-rw-r--r--core/res/res/values-sl/strings.xml3
-rw-r--r--core/res/res/values-sq-rAL/strings.xml3
-rw-r--r--core/res/res/values-sr/strings.xml3
-rw-r--r--core/res/res/values-sv/strings.xml3
-rw-r--r--core/res/res/values-sw/strings.xml3
-rw-r--r--core/res/res/values-ta-rIN/strings.xml3
-rw-r--r--core/res/res/values-te-rIN/strings.xml3
-rw-r--r--core/res/res/values-th/strings.xml3
-rw-r--r--core/res/res/values-tl/strings.xml3
-rw-r--r--core/res/res/values-tr/strings.xml3
-rw-r--r--core/res/res/values-uk/strings.xml3
-rw-r--r--core/res/res/values-ur-rPK/strings.xml3
-rw-r--r--core/res/res/values-uz-rUZ/strings.xml5
-rw-r--r--core/res/res/values-vi/strings.xml3
-rw-r--r--core/res/res/values-zh-rCN/strings.xml13
-rw-r--r--core/res/res/values-zh-rHK/strings.xml3
-rw-r--r--core/res/res/values-zh-rTW/strings.xml3
-rw-r--r--core/res/res/values-zu/strings.xml3
-rw-r--r--core/res/res/values/config.xml10
-rw-r--r--core/res/res/values/strings.xml11
-rw-r--r--core/res/res/values/symbols.xml5
-rw-r--r--core/tests/coretests/Android.mk4
-rw-r--r--core/tests/coretests/AndroidManifest.xml27
-rw-r--r--core/tests/coretests/src/android/os/PowerManagerVrTest.java149
-rw-r--r--core/tests/coretests/src/android/os/TestVrActivity.java59
-rw-r--r--core/tests/coretests/src/android/view/ViewInvalidateTest.java265
-rw-r--r--core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java143
-rw-r--r--libs/hwui/AnimatorManager.cpp2
-rw-r--r--opengl/java/android/opengl/GLSurfaceView.java41
-rw-r--r--packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java55
-rw-r--r--packages/SettingsLib/res/values-af/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-am/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ar/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-az-rAZ/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-az-rAZ/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-be-rBY/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-be-rBY/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-bg/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-bn-rBD/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-bn-rBD/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-bs-rBA/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-bs-rBA/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ca/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-cs/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-da/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-de/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-el/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-en-rAU/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-en-rGB/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-en-rIN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-es-rUS/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-es/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-et-rEE/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-et-rEE/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-eu-rES/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-eu-rES/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-fa/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-fi/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-fr/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-gl-rES/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-gl-rES/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-gu-rIN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-gu-rIN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-hi/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml22
-rw-r--r--packages/SettingsLib/res/values-hr/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-hu/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-hy-rAM/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-hy-rAM/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-in/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-is-rIS/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-is-rIS/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-it/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-iw/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ja/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ka-rGE/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ka-rGE/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-kk-rKZ/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-kk-rKZ/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-km-rKH/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-km-rKH/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-kn-rIN/arrays.xml42
-rw-r--r--packages/SettingsLib/res/values-kn-rIN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ko/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ky-rKG/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ky-rKG/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-lo-rLA/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-lo-rLA/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-lt/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-lv/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-mk-rMK/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-mk-rMK/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ml-rIN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ml-rIN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-mn-rMN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-mn-rMN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-mr-rIN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-mr-rIN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ms-rMY/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ms-rMY/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-my-rMM/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-my-rMM/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-nb/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ne-rNP/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ne-rNP/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-nl/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-pa-rIN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-pa-rIN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-pl/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-pt/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ro/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ru/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-si-rLK/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-si-rLK/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-sk/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-sl/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-sq-rAL/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-sq-rAL/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-sr/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-sv/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-sw/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ta-rIN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ta-rIN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-te-rIN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-te-rIN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-th/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-tl/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-tr/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-uk/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-ur-rPK/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ur-rPK/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-uz-rUZ/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-uz-rUZ/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-vi/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml20
-rw-r--r--packages/SettingsLib/res/values-zu/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml20
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java5
-rw-r--r--packages/Shell/res/values-da/strings.xml8
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-sw900dp-hdpi/ic_sysbar_back_dark.pngbin0 -> 1715 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-sw900dp-mdpi/ic_sysbar_back_dark.pngbin0 -> 994 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back.pngbin2497 -> 2739 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back_dark.pngbin0 -> 2496 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-sw900dp-xxhdpi/ic_sysbar_back_dark.pngbin0 -> 4592 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-sw900dp-xxxhdpi/ic_sysbar_back_dark.pngbin0 -> 7152 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_dark.pngbin0 -> 1764 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_ime_dark.pngbin0 -> 1833 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_docked_dark.pngbin0 -> 1411 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_home_dark.pngbin0 -> 2153 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_menu_dark.pngbin0 -> 974 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_recent_dark.pngbin0 -> 1083 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-land-hdpi/ic_sysbar_docked_dark.pngbin0 -> 1358 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-land-mdpi/ic_sysbar_docked_dark.pngbin0 -> 602 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked.pngbin0 -> 1596 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked_dark.pngbin0 -> 1518 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-land-xxhdpi/ic_sysbar_docked_dark.pngbin0 -> 2744 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-land-xxxhdpi/ic_sysbar_docked_dark.pngbin0 -> 4245 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_dark.pngbin0 -> 1011 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_ime_dark.pngbin0 -> 1063 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_docked_dark.pngbin0 -> 608 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_home_dark.pngbin0 -> 1070 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_menu_dark.pngbin0 -> 538 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_recent_dark.pngbin0 -> 595 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back.pngbin2371 -> 2843 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_dark.pngbin0 -> 2583 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_ime.pngbin2389 -> 3036 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked.pngbin0 -> 1610 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked_dark.pngbin0 -> 1513 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home.pngbin3323 -> 3256 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home_dark.pngbin0 -> 2952 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_menu_dark.pngbin0 -> 1463 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent.pngbin895 -> 1535 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent_dark.pngbin0 -> 1461 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_dark.pngbin0 -> 4703 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_docked_dark.pngbin0 -> 2695 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_home_dark.pngbin0 -> 5635 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_ime_dark.pngbin0 -> 4806 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_menu_dark.pngbin0 -> 2805 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_recent_dark.pngbin0 -> 2574 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_dark.pngbin0 -> 7338 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_ime_dark.pngbin0 -> 7537 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_docked_dark.pngbin0 -> 4155 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_home_dark.pngbin0 -> 8971 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_menu_dark.pngbin0 -> 8798 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_recent_dark.pngbin0 -> 4108 bytes
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooter.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java81
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java7
-rw-r--r--proto/src/ipconnectivity.proto35
-rw-r--r--proto/src/metrics_constants.proto9
-rw-r--r--services/autofill/java/com/android/server/autofill/AutoFillManagerService.java176
-rw-r--r--services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java214
-rw-r--r--services/autofill/java/com/android/server/autofill/AutoFillManagerServiceShellCommand.java11
-rw-r--r--services/autofill/java/com/android/server/autofill/AutoFillUI.java471
-rw-r--r--services/core/java/com/android/server/BluetoothManagerService.java28
-rw-r--r--services/core/java/com/android/server/InputMethodManagerService.java13
-rw-r--r--services/core/java/com/android/server/LockSettingsService.java54
-rw-r--r--services/core/java/com/android/server/NetworkScoreService.java42
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java77
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java4
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java20
-rw-r--r--services/core/java/com/android/server/am/UserController.java19
-rw-r--r--services/core/java/com/android/server/connectivity/Tethering.java120
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java26
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java19
-rw-r--r--services/core/java/com/android/server/fingerprint/FingerprintService.java6
-rw-r--r--services/core/java/com/android/server/lights/Light.java1
-rw-r--r--services/core/java/com/android/server/lights/LightsService.java101
-rw-r--r--services/core/java/com/android/server/location/ContextHubService.java45
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java37
-rw-r--r--services/core/java/com/android/server/notification/RankingHelper.java3
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java17
-rw-r--r--services/core/java/com/android/server/pm/Installer.java36
-rw-r--r--services/core/java/com/android/server/pm/PackageDexOptimizer.java23
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java38
-rw-r--r--services/core/java/com/android/server/pm/ShortcutPackage.java16
-rw-r--r--services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java20
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java16
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java20
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java36
-rw-r--r--services/core/java/com/android/server/policy/SplashScreenSurface.java38
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java60
-rw-r--r--services/core/java/com/android/server/trust/TrustManagerService.java29
-rw-r--r--services/core/java/com/android/server/wm/AppWindowContainerController.java144
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java65
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java5
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java165
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java11
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfacePlacer.java5
-rw-r--r--services/core/jni/com_android_server_lights_LightsService.cpp3
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp114
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java44
-rw-r--r--services/tests/notification/AndroidManifest.xml3
-rw-r--r--services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java92
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java76
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityCacheTest.java38
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java59
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/InstallerTest.java170
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java213
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java52
-rw-r--r--services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java2
-rw-r--r--services/usage/java/com/android/server/usage/StorageStatsService.java175
-rw-r--r--telecomm/java/android/telecom/Call.java7
-rw-r--r--tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java4
-rw-r--r--tools/layoutlib/bridge/src/android/view/ViewRootImpl_Accessor.java26
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java14
-rw-r--r--tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/myapplication.widgets/InsetsWidget.java43
-rw-r--r--tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/insets.xml12
-rw-r--r--tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java33
465 files changed, 12010 insertions, 2299 deletions
diff --git a/Android.mk b/Android.mk
index 8c0c640f2764..8e8b95a3e8aa 100644
--- a/Android.mk
+++ b/Android.mk
@@ -82,7 +82,6 @@ LOCAL_SRC_FILES += \
core/java/android/app/IBackupAgent.aidl \
core/java/android/app/IEphemeralResolver.aidl \
core/java/android/app/IInstrumentationWatcher.aidl \
- core/java/android/app/IOnNotificationChannelCreatedListener.aidl \
core/java/android/app/INotificationManager.aidl \
core/java/android/app/IProcessObserver.aidl \
core/java/android/app/ISearchManager.aidl \
@@ -263,8 +262,9 @@ LOCAL_SRC_FILES += \
core/java/android/os/storage/IObbActionListener.aidl \
core/java/android/security/IKeystoreService.aidl \
core/java/android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl \
- core/java/android/service/autofill/IAutoFillCallback.aidl \
+ core/java/android/service/autofill/IAutoFillAppCallback.aidl \
core/java/android/service/autofill/IAutoFillManagerService.aidl \
+ core/java/android/service/autofill/IAutoFillServerCallback.aidl \
core/java/android/service/autofill/IAutoFillService.aidl \
core/java/android/service/carrier/ICarrierService.aidl \
core/java/android/service/carrier/ICarrierMessagingCallback.aidl \
@@ -690,8 +690,8 @@ aidl_files := \
frameworks/base/core/java/android/service/notification/StatusBarNotification.aidl \
frameworks/base/core/java/android/service/chooser/ChooserTarget.aidl \
frameworks/base/core/java/android/speech/tts/Voice.aidl \
+ frameworks/base/core/java/android/app/usage/ExternalStorageStats.aidl \
frameworks/base/core/java/android/app/usage/StorageStats.aidl \
- frameworks/base/core/java/android/app/usage/StorageSummary.aidl \
frameworks/base/core/java/android/app/usage/UsageEvents.aidl \
frameworks/base/core/java/android/app/Notification.aidl \
frameworks/base/core/java/android/app/NotificationManager.aidl \
diff --git a/api/current.txt b/api/current.txt
index a8cdd10772b1..9f6d358bca2f 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5413,7 +5413,8 @@ package android.app {
method public void cancel(int);
method public void cancel(java.lang.String, int);
method public void cancelAll();
- method public void createNotificationChannel(android.app.NotificationChannel, android.app.NotificationManager.OnNotificationChannelCreatedListener, android.os.Handler);
+ method public void createNotificationChannel(android.app.NotificationChannel);
+ method public void createNotificationChannels(java.util.List<android.app.NotificationChannel>);
method public void deleteNotificationChannel(java.lang.String);
method public android.service.notification.StatusBarNotification[] getActiveNotifications();
method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String);
@@ -5447,10 +5448,6 @@ package android.app {
field public static final int INTERRUPTION_FILTER_UNKNOWN = 0; // 0x0
}
- public static abstract interface NotificationManager.OnNotificationChannelCreatedListener {
- method public abstract void onNotificationChannelCreated(android.app.NotificationChannel);
- }
-
public static class NotificationManager.Policy implements android.os.Parcelable {
ctor public NotificationManager.Policy(int, int, int);
ctor public NotificationManager.Policy(int, int, int, int);
@@ -6134,6 +6131,7 @@ package android.app.admin {
method public boolean isSecurityLoggingEnabled(android.content.ComponentName);
method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String);
method public void lockNow();
+ method public void lockNow(int);
method public void reboot(android.content.ComponentName);
method public void removeActiveAdmin(android.content.ComponentName);
method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String);
@@ -6250,6 +6248,7 @@ package android.app.admin {
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
+ field public static final int FLAG_EVICT_CE_KEY = 1; // 0x1
field public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 2; // 0x2
field public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 1; // 0x1
field public static final int KEYGUARD_DISABLE_FEATURES_ALL = 2147483647; // 0x7fffffff
@@ -6369,7 +6368,8 @@ package android.app.assist {
public static class AssistStructure.ViewNode {
method public float getAlpha();
- method public int getAutoFillId();
+ method public android.view.autofill.AutoFillId getAutoFillId();
+ method public android.view.autofill.AutoFillType getAutoFillType();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
method public int getChildCount();
method public java.lang.String getClassName();
@@ -6627,6 +6627,16 @@ package android.app.usage {
field public static final android.os.Parcelable.Creator<android.app.usage.ConfigurationStats> CREATOR;
}
+ public final class ExternalStorageStats implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getAudioBytes();
+ method public long getImageBytes();
+ method public long getTotalBytes();
+ method public long getVideoBytes();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.usage.ExternalStorageStats> CREATOR;
+ }
+
public final class NetworkStats implements java.lang.AutoCloseable {
method public void close();
method public boolean getNextBucket(android.app.usage.NetworkStats.Bucket);
@@ -6681,31 +6691,18 @@ package android.app.usage {
public final class StorageStats implements android.os.Parcelable {
method public int describeContents();
method public long getCacheBytes();
- method public long getCacheQuotaBytes();
method public long getCodeBytes();
method public long getDataBytes();
- method public int getUid();
- method public java.lang.String getVolumeUuid();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.usage.StorageStats> CREATOR;
}
public class StorageStatsManager {
+ method public long getFreeBytes(java.lang.String);
+ method public long getTotalBytes(java.lang.String);
+ method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
- method public android.app.usage.StorageSummary querySummary(java.lang.String);
- }
-
- public final class StorageSummary implements android.os.Parcelable {
- method public int describeContents();
- method public long getFreeBytes();
- method public long getSharedAudioBytes();
- method public long getSharedImagesBytes();
- method public long getSharedTotalBytes();
- method public long getSharedVideoBytes();
- method public long getTotalBytes();
- method public java.lang.String getVolumeUuid();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.usage.StorageSummary> CREATOR;
+ method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
public final class UsageEvents implements android.os.Parcelable {
@@ -6788,6 +6785,7 @@ package android.appwidget {
method protected android.view.View getErrorView();
method protected void prepareView(android.view.View);
method public void setAppWidget(int, android.appwidget.AppWidgetProviderInfo);
+ method public void setAsyncExecutor(java.util.concurrent.Executor);
method public void updateAppWidget(android.widget.RemoteViews);
method public void updateAppWidgetOptions(android.os.Bundle);
method public void updateAppWidgetSize(android.os.Bundle, int, int, int, int);
@@ -24003,11 +24001,8 @@ package android.net {
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
- method public deprecated boolean requestRouteToHost(int, int);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
- method public deprecated int startUsingNetworkFeature(int, java.lang.String);
- method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
method public void unregisterNetworkCallback(android.app.PendingIntent);
field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
@@ -28584,7 +28579,7 @@ package android.opengl {
method public void surfaceChanged(android.view.SurfaceHolder, int, int, int);
method public void surfaceCreated(android.view.SurfaceHolder);
method public void surfaceDestroyed(android.view.SurfaceHolder);
- method public void surfaceRedrawNeeded(android.view.SurfaceHolder);
+ method public deprecated void surfaceRedrawNeeded(android.view.SurfaceHolder);
field public static final int DEBUG_CHECK_GL_ERROR = 1; // 0x1
field public static final int DEBUG_LOG_GL_CALLS = 2; // 0x2
field public static final int RENDERMODE_CONTINUOUSLY = 1; // 0x1
@@ -30937,6 +30932,7 @@ package android.provider {
field public static final java.lang.String ACTION_SET_ALARM = "android.intent.action.SET_ALARM";
field public static final java.lang.String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
field public static final java.lang.String ACTION_SHOW_ALARMS = "android.intent.action.SHOW_ALARMS";
+ field public static final java.lang.String ACTION_SHOW_TIMERS = "android.intent.action.SHOW_TIMERS";
field public static final java.lang.String ACTION_SNOOZE_ALARM = "android.intent.action.SNOOZE_ALARM";
field public static final java.lang.String ALARM_SEARCH_MODE_ALL = "android.all";
field public static final java.lang.String ALARM_SEARCH_MODE_LABEL = "android.label";
@@ -35045,26 +35041,19 @@ package android.service.autofill {
method public void onDisconnected();
method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback);
method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.SaveCallback);
+ field public static final java.lang.String EXTRA_DATASET_EXTRAS = "android.service.autofill.extra.DATASET_EXTRAS";
+ field public static final java.lang.String EXTRA_RESPONSE_EXTRAS = "android.service.autofill.extra.RESPONSE_EXTRAS";
field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
}
public final class FillCallback {
method public void onFailure(java.lang.CharSequence);
- method public void onSuccess(android.service.autofill.FillCallback.FillData);
- }
-
- public static final class FillCallback.FillData {
- }
-
- public static class FillCallback.FillData.Builder {
- ctor public FillCallback.FillData.Builder();
- method public android.service.autofill.FillCallback.FillData build();
- method public android.service.autofill.FillCallback.FillData.Builder setTextField(int, java.lang.String);
+ method public void onSuccess(android.view.autofill.FillResponse);
}
public final class SaveCallback {
method public void onFailure(java.lang.CharSequence);
- method public void onSuccess(int[]);
+ method public void onSuccess(android.view.autofill.AutoFillId[]);
}
}
@@ -36729,6 +36718,7 @@ package android.telecom {
method public void unhold();
method public void unregisterCallback(android.telecom.Call.Callback);
field public static final java.lang.String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
+ field public static final java.lang.String EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS = "android.telecom.extra.LAST_EMERGENCY_CALLBACK_TIME_MILLIS";
field public static final int STATE_ACTIVE = 4; // 0x4
field public static final int STATE_CONNECTING = 9; // 0x9
field public static final int STATE_DIALING = 1; // 0x1
@@ -39462,6 +39452,7 @@ package android.text {
method public android.text.StaticLayout.Builder setHyphenationFrequency(int);
method public android.text.StaticLayout.Builder setIncludePad(boolean);
method public android.text.StaticLayout.Builder setIndents(int[], int[]);
+ method public android.text.StaticLayout.Builder setJustify(boolean);
method public android.text.StaticLayout.Builder setLineSpacing(float, float);
method public android.text.StaticLayout.Builder setMaxLines(int);
method public android.text.StaticLayout.Builder setText(java.lang.CharSequence);
@@ -41847,7 +41838,7 @@ package android.view {
method public android.view.View findNearestTouchable(android.view.ViewGroup, int, int, int, int[]);
method public final android.view.View findNextFocus(android.view.ViewGroup, android.view.View, int);
method public android.view.View findNextFocusFromRect(android.view.ViewGroup, android.graphics.Rect, int);
- method public android.view.View findNextKeyboardNavigationCluster(int, android.view.View, android.view.View, int);
+ method public android.view.View findNextKeyboardNavigationGroup(int, android.view.View, android.view.View, int);
method public static android.view.FocusFinder getInstance();
}
@@ -43070,6 +43061,7 @@ package android.view {
public static abstract interface SurfaceHolder.Callback2 implements android.view.SurfaceHolder.Callback {
method public abstract void surfaceRedrawNeeded(android.view.SurfaceHolder);
+ method public default void surfaceRedrawNeededAsync(android.view.SurfaceHolder, java.lang.Runnable);
}
public class SurfaceView extends android.view.View {
@@ -43144,12 +43136,13 @@ package android.view {
method public void addChildrenForAccessibility(java.util.ArrayList<android.view.View>);
method public void addFocusables(java.util.ArrayList<android.view.View>, int);
method public void addFocusables(java.util.ArrayList<android.view.View>, int, int);
- method public void addKeyboardNavigationClusters(int, java.util.Collection<android.view.View>, int);
+ method public void addKeyboardNavigationGroups(int, java.util.Collection<android.view.View>, int);
method public void addOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void addOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
method public void announceForAccessibility(java.lang.CharSequence);
+ method public void autoFill(android.view.autofill.AutoFillValue);
method protected boolean awakenScrollBars();
method protected boolean awakenScrollBars(int);
method protected boolean awakenScrollBars(int, boolean);
@@ -43201,8 +43194,8 @@ package android.view {
method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
method public boolean dispatchNestedScroll(int, int, int, int, int[]);
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public deprecated void dispatchProvideStructure(android.view.ViewStructure);
- method public void dispatchProvideStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideStructure(android.view.ViewStructure);
method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSetActivated(boolean);
@@ -43237,6 +43230,8 @@ package android.view {
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
+ method public android.view.autofill.AutoFillType getAutoFillType();
+ method public android.view.autofill.VirtualViewDelegate getAutoFillVirtualViewDelegate(android.view.autofill.VirtualViewDelegate.Callback);
method public android.graphics.drawable.Drawable getBackground();
method public android.content.res.ColorStateList getBackgroundTintList();
method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
@@ -43432,7 +43427,7 @@ package android.view {
method public boolean isVerticalFadingEdgeEnabled();
method public boolean isVerticalScrollBarEnabled();
method public void jumpDrawablesToCurrentState();
- method public android.view.View keyboardNavigationClusterSearch(int, android.view.View, int);
+ method public android.view.View keyboardNavigationGroupSearch(int, android.view.View, int);
method public void layout(int, int, int, int);
method public final void measure(int, int);
method protected static int[] mergeDrawableStates(int[], int[]);
@@ -43473,10 +43468,10 @@ package android.view {
method protected void onMeasure(int, int);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public deprecated void onProvideStructure(android.view.ViewStructure);
- method public void onProvideStructure(android.view.ViewStructure, int);
- method public deprecated void onProvideVirtualStructure(android.view.ViewStructure);
- method public void onProvideVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideStructure(android.view.ViewStructure);
+ method public void onProvideVirtualStructure(android.view.ViewStructure);
method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
method protected void onRestoreInstanceState(android.os.Parcelable);
method public void onRtlPropertiesChanged(int);
@@ -43683,8 +43678,8 @@ package android.view {
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
- field public static final int ASSIST_FLAG_NON_SANITIZED_TEXT = 2; // 0x2
- field public static final int ASSIST_FLAG_SANITIZED_TEXT = 1; // 0x1
+ field public static final int AUTO_FILL_FLAG_TYPE_FILL = 1; // 0x1
+ field public static final int AUTO_FILL_FLAG_TYPE_SAVE = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -43714,8 +43709,6 @@ package android.view {
field public static final int FOCUS_BACKWARD = 1; // 0x1
field public static final int FOCUS_DOWN = 130; // 0x82
field public static final int FOCUS_FORWARD = 2; // 0x2
- field public static final int FOCUS_GROUP_CLUSTER = 1; // 0x1
- field public static final int FOCUS_GROUP_SECTION = 2; // 0x2
field public static final int FOCUS_LEFT = 17; // 0x11
field public static final int FOCUS_RIGHT = 66; // 0x42
field public static final int FOCUS_UP = 33; // 0x21
@@ -43727,6 +43720,8 @@ package android.view {
field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
field public static final int INVISIBLE = 4; // 0x4
field public static final int KEEP_SCREEN_ON = 67108864; // 0x4000000
+ field public static final int KEYBOARD_NAVIGATION_GROUP_CLUSTER = 1; // 0x1
+ field public static final int KEYBOARD_NAVIGATION_GROUP_SECTION = 2; // 0x2
field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
field public static final int LAYER_TYPE_NONE = 0; // 0x0
field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
@@ -44245,7 +44240,7 @@ package android.view {
method public abstract boolean isLayoutRequested();
method public abstract boolean isTextAlignmentResolved();
method public abstract boolean isTextDirectionResolved();
- method public abstract android.view.View keyboardNavigationClusterSearch(int, android.view.View, int);
+ method public abstract android.view.View keyboardNavigationGroupSearch(int, android.view.View, int);
method public abstract void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
method public abstract boolean onNestedPreFling(android.view.View, float, float);
@@ -44314,6 +44309,7 @@ package android.view {
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
+ method public abstract android.view.ViewStructure asyncNewChild(int, int);
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -44322,9 +44318,11 @@ package android.view {
method public abstract int getTextSelectionStart();
method public abstract boolean hasExtras();
method public abstract android.view.ViewStructure newChild(int);
+ method public abstract android.view.ViewStructure newChild(int, int);
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
+ method public abstract void setAutoFillType(android.view.autofill.AutoFillType);
method public abstract void setCheckable(boolean);
method public abstract void setChecked(boolean);
method public abstract void setChildCount(int);
@@ -45545,6 +45543,80 @@ package android.view.animation {
}
+package android.view.autofill {
+
+ public final class AutoFillId implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillId> CREATOR;
+ }
+
+ public final class AutoFillType implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.view.autofill.AutoFillType forList();
+ method public static android.view.autofill.AutoFillType forText(int);
+ method public static android.view.autofill.AutoFillType forToggle();
+ method public int getSubType();
+ method public boolean isList();
+ method public boolean isText();
+ method public boolean isToggle();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillType> CREATOR;
+ }
+
+ public final class AutoFillValue implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.view.autofill.AutoFillValue forList(int);
+ method public static android.view.autofill.AutoFillValue forText(java.lang.CharSequence);
+ method public static android.view.autofill.AutoFillValue forToggle(boolean);
+ method public int getListValue();
+ method public java.lang.CharSequence getTextValue();
+ method public boolean getToggleValue();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillValue> CREATOR;
+ }
+
+ public final class Dataset implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.Dataset> CREATOR;
+ }
+
+ public static final class Dataset.Builder {
+ ctor public Dataset.Builder(java.lang.CharSequence);
+ method public android.view.autofill.Dataset build();
+ method public android.view.autofill.Dataset.Builder setExtras(android.os.Bundle);
+ method public android.view.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
+ }
+
+ public final class FillResponse implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.FillResponse> CREATOR;
+ }
+
+ public static final class FillResponse.Builder {
+ ctor public FillResponse.Builder();
+ method public android.view.autofill.FillResponse.Builder addDataset(android.view.autofill.Dataset);
+ method public android.view.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
+ method public android.view.autofill.FillResponse build();
+ method public android.view.autofill.FillResponse.Builder setExtras(android.os.Bundle);
+ }
+
+ public abstract class VirtualViewDelegate {
+ ctor public VirtualViewDelegate();
+ method public abstract void autoFill(int, android.view.autofill.AutoFillValue);
+ }
+
+ public static abstract class VirtualViewDelegate.Callback {
+ ctor public VirtualViewDelegate.Callback();
+ method public void onFocusChanged(int, boolean);
+ method public void onNodeRemoved(int...);
+ method public void onValueChanged(int);
+ }
+
+}
+
package android.view.inputmethod {
public class BaseInputConnection implements android.view.inputmethod.InputConnection {
@@ -48990,6 +49062,7 @@ package android.widget {
method public boolean getIncludeFontPadding();
method public android.os.Bundle getInputExtras(boolean);
method public int getInputType();
+ method public boolean getJustify();
method public final android.text.method.KeyListener getKeyListener();
method public final android.text.Layout getLayout();
method public float getLetterSpacing();
@@ -49098,6 +49171,7 @@ package android.widget {
method public void setIncludeFontPadding(boolean);
method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public void setInputType(int);
+ method public void setJustify(boolean);
method public void setKeyListener(android.text.method.KeyListener);
method public void setLetterSpacing(float);
method public void setLineSpacing(float, float);
diff --git a/api/removed.txt b/api/removed.txt
index d7a8bce2d00b..ab22b6ec1720 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -126,6 +126,12 @@ package android.media.tv {
package android.net {
+ public class ConnectivityManager {
+ method public deprecated boolean requestRouteToHost(int, int);
+ method public deprecated int startUsingNetworkFeature(int, java.lang.String);
+ method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
+ }
+
public abstract class PskKeyManager {
ctor public PskKeyManager();
field public static final int MAX_IDENTITY_HINT_LENGTH_BYTES = 128; // 0x80
diff --git a/api/system-current.txt b/api/system-current.txt
index cc1832d6ec68..4c9cada100b5 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5586,7 +5586,8 @@ package android.app {
method public void cancel(int);
method public void cancel(java.lang.String, int);
method public void cancelAll();
- method public void createNotificationChannel(android.app.NotificationChannel, android.app.NotificationManager.OnNotificationChannelCreatedListener, android.os.Handler);
+ method public void createNotificationChannel(android.app.NotificationChannel);
+ method public void createNotificationChannels(java.util.List<android.app.NotificationChannel>);
method public void deleteNotificationChannel(java.lang.String);
method public android.service.notification.StatusBarNotification[] getActiveNotifications();
method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String);
@@ -5620,10 +5621,6 @@ package android.app {
field public static final int INTERRUPTION_FILTER_UNKNOWN = 0; // 0x0
}
- public static abstract interface NotificationManager.OnNotificationChannelCreatedListener {
- method public abstract void onNotificationChannelCreated(android.app.NotificationChannel);
- }
-
public static class NotificationManager.Policy implements android.os.Parcelable {
ctor public NotificationManager.Policy(int, int, int);
ctor public NotificationManager.Policy(int, int, int, int);
@@ -6325,6 +6322,7 @@ package android.app.admin {
method public boolean isSecurityLoggingEnabled(android.content.ComponentName);
method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String);
method public void lockNow();
+ method public void lockNow(int);
method public void notifyPendingSystemUpdate(long);
method public void reboot(android.content.ComponentName);
method public void removeActiveAdmin(android.content.ComponentName);
@@ -6448,6 +6446,7 @@ package android.app.admin {
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
+ field public static final int FLAG_EVICT_CE_KEY = 1; // 0x1
field public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 2; // 0x2
field public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 1; // 0x1
field public static final int KEYGUARD_DISABLE_FEATURES_ALL = 2147483647; // 0x7fffffff
@@ -6572,7 +6571,8 @@ package android.app.assist {
public static class AssistStructure.ViewNode {
method public float getAlpha();
- method public int getAutoFillId();
+ method public android.view.autofill.AutoFillId getAutoFillId();
+ method public android.view.autofill.AutoFillType getAutoFillType();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
method public int getChildCount();
method public java.lang.String getClassName();
@@ -6940,6 +6940,16 @@ package android.app.usage {
field public static final android.os.Parcelable.Creator<android.app.usage.ConfigurationStats> CREATOR;
}
+ public final class ExternalStorageStats implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getAudioBytes();
+ method public long getImageBytes();
+ method public long getTotalBytes();
+ method public long getVideoBytes();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.usage.ExternalStorageStats> CREATOR;
+ }
+
public final class NetworkStats implements java.lang.AutoCloseable {
method public void close();
method public boolean getNextBucket(android.app.usage.NetworkStats.Bucket);
@@ -6994,31 +7004,18 @@ package android.app.usage {
public final class StorageStats implements android.os.Parcelable {
method public int describeContents();
method public long getCacheBytes();
- method public long getCacheQuotaBytes();
method public long getCodeBytes();
method public long getDataBytes();
- method public int getUid();
- method public java.lang.String getVolumeUuid();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.usage.StorageStats> CREATOR;
}
public class StorageStatsManager {
+ method public long getFreeBytes(java.lang.String);
+ method public long getTotalBytes(java.lang.String);
+ method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
- method public android.app.usage.StorageSummary querySummary(java.lang.String);
- }
-
- public final class StorageSummary implements android.os.Parcelable {
- method public int describeContents();
- method public long getFreeBytes();
- method public long getSharedAudioBytes();
- method public long getSharedImagesBytes();
- method public long getSharedTotalBytes();
- method public long getSharedVideoBytes();
- method public long getTotalBytes();
- method public java.lang.String getVolumeUuid();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.usage.StorageSummary> CREATOR;
+ method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
public final class UsageEvents implements android.os.Parcelable {
@@ -7102,6 +7099,7 @@ package android.appwidget {
method protected android.view.View getErrorView();
method protected void prepareView(android.view.View);
method public void setAppWidget(int, android.appwidget.AppWidgetProviderInfo);
+ method public void setAsyncExecutor(java.util.concurrent.Executor);
method public void updateAppWidget(android.widget.RemoteViews);
method public void updateAppWidgetOptions(android.os.Bundle);
method public void updateAppWidgetSize(android.os.Bundle, int, int, int, int);
@@ -25795,14 +25793,11 @@ package android.net {
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
- method public deprecated boolean requestRouteToHost(int, int);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
method public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback);
method public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler);
- method public deprecated int startUsingNetworkFeature(int, java.lang.String);
method public void stopTethering(int);
- method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
method public void unregisterNetworkCallback(android.app.PendingIntent);
field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
@@ -31148,7 +31143,7 @@ package android.opengl {
method public void surfaceChanged(android.view.SurfaceHolder, int, int, int);
method public void surfaceCreated(android.view.SurfaceHolder);
method public void surfaceDestroyed(android.view.SurfaceHolder);
- method public void surfaceRedrawNeeded(android.view.SurfaceHolder);
+ method public deprecated void surfaceRedrawNeeded(android.view.SurfaceHolder);
field public static final int DEBUG_CHECK_GL_ERROR = 1; // 0x1
field public static final int DEBUG_LOG_GL_CALLS = 2; // 0x2
field public static final int RENDERMODE_CONTINUOUSLY = 1; // 0x1
@@ -33657,6 +33652,7 @@ package android.provider {
field public static final java.lang.String ACTION_SET_ALARM = "android.intent.action.SET_ALARM";
field public static final java.lang.String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
field public static final java.lang.String ACTION_SHOW_ALARMS = "android.intent.action.SHOW_ALARMS";
+ field public static final java.lang.String ACTION_SHOW_TIMERS = "android.intent.action.SHOW_TIMERS";
field public static final java.lang.String ACTION_SNOOZE_ALARM = "android.intent.action.SNOOZE_ALARM";
field public static final java.lang.String ALARM_SEARCH_MODE_ALL = "android.all";
field public static final java.lang.String ALARM_SEARCH_MODE_LABEL = "android.label";
@@ -37908,26 +37904,19 @@ package android.service.autofill {
method public void onDisconnected();
method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback);
method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.SaveCallback);
+ field public static final java.lang.String EXTRA_DATASET_EXTRAS = "android.service.autofill.extra.DATASET_EXTRAS";
+ field public static final java.lang.String EXTRA_RESPONSE_EXTRAS = "android.service.autofill.extra.RESPONSE_EXTRAS";
field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
}
public final class FillCallback {
method public void onFailure(java.lang.CharSequence);
- method public void onSuccess(android.service.autofill.FillCallback.FillData);
- }
-
- public static final class FillCallback.FillData {
- }
-
- public static class FillCallback.FillData.Builder {
- ctor public FillCallback.FillData.Builder();
- method public android.service.autofill.FillCallback.FillData build();
- method public android.service.autofill.FillCallback.FillData.Builder setTextField(int, java.lang.String);
+ method public void onSuccess(android.view.autofill.FillResponse);
}
public final class SaveCallback {
method public void onFailure(java.lang.CharSequence);
- method public void onSuccess(int[]);
+ method public void onSuccess(android.view.autofill.AutoFillId[]);
}
}
@@ -39663,6 +39652,7 @@ package android.telecom {
method public void unhold();
method public void unregisterCallback(android.telecom.Call.Callback);
field public static final java.lang.String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
+ field public static final java.lang.String EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS = "android.telecom.extra.LAST_EMERGENCY_CALLBACK_TIME_MILLIS";
field public static final int STATE_ACTIVE = 4; // 0x4
field public static final int STATE_CONNECTING = 9; // 0x9
field public static final int STATE_DIALING = 1; // 0x1
@@ -42680,6 +42670,7 @@ package android.text {
method public android.text.StaticLayout.Builder setHyphenationFrequency(int);
method public android.text.StaticLayout.Builder setIncludePad(boolean);
method public android.text.StaticLayout.Builder setIndents(int[], int[]);
+ method public android.text.StaticLayout.Builder setJustify(boolean);
method public android.text.StaticLayout.Builder setLineSpacing(float, float);
method public android.text.StaticLayout.Builder setMaxLines(int);
method public android.text.StaticLayout.Builder setText(java.lang.CharSequence);
@@ -45065,7 +45056,7 @@ package android.view {
method public android.view.View findNearestTouchable(android.view.ViewGroup, int, int, int, int[]);
method public final android.view.View findNextFocus(android.view.ViewGroup, android.view.View, int);
method public android.view.View findNextFocusFromRect(android.view.ViewGroup, android.graphics.Rect, int);
- method public android.view.View findNextKeyboardNavigationCluster(int, android.view.View, android.view.View, int);
+ method public android.view.View findNextKeyboardNavigationGroup(int, android.view.View, android.view.View, int);
method public static android.view.FocusFinder getInstance();
}
@@ -46288,6 +46279,7 @@ package android.view {
public static abstract interface SurfaceHolder.Callback2 implements android.view.SurfaceHolder.Callback {
method public abstract void surfaceRedrawNeeded(android.view.SurfaceHolder);
+ method public default void surfaceRedrawNeededAsync(android.view.SurfaceHolder, java.lang.Runnable);
}
public class SurfaceView extends android.view.View {
@@ -46362,12 +46354,13 @@ package android.view {
method public void addChildrenForAccessibility(java.util.ArrayList<android.view.View>);
method public void addFocusables(java.util.ArrayList<android.view.View>, int);
method public void addFocusables(java.util.ArrayList<android.view.View>, int, int);
- method public void addKeyboardNavigationClusters(int, java.util.Collection<android.view.View>, int);
+ method public void addKeyboardNavigationGroups(int, java.util.Collection<android.view.View>, int);
method public void addOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void addOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
method public void announceForAccessibility(java.lang.CharSequence);
+ method public void autoFill(android.view.autofill.AutoFillValue);
method protected boolean awakenScrollBars();
method protected boolean awakenScrollBars(int);
method protected boolean awakenScrollBars(int, boolean);
@@ -46419,8 +46412,8 @@ package android.view {
method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
method public boolean dispatchNestedScroll(int, int, int, int, int[]);
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public deprecated void dispatchProvideStructure(android.view.ViewStructure);
- method public void dispatchProvideStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideStructure(android.view.ViewStructure);
method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSetActivated(boolean);
@@ -46455,6 +46448,8 @@ package android.view {
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
+ method public android.view.autofill.AutoFillType getAutoFillType();
+ method public android.view.autofill.VirtualViewDelegate getAutoFillVirtualViewDelegate(android.view.autofill.VirtualViewDelegate.Callback);
method public android.graphics.drawable.Drawable getBackground();
method public android.content.res.ColorStateList getBackgroundTintList();
method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
@@ -46650,7 +46645,7 @@ package android.view {
method public boolean isVerticalFadingEdgeEnabled();
method public boolean isVerticalScrollBarEnabled();
method public void jumpDrawablesToCurrentState();
- method public android.view.View keyboardNavigationClusterSearch(int, android.view.View, int);
+ method public android.view.View keyboardNavigationGroupSearch(int, android.view.View, int);
method public void layout(int, int, int, int);
method public final void measure(int, int);
method protected static int[] mergeDrawableStates(int[], int[]);
@@ -46691,10 +46686,10 @@ package android.view {
method protected void onMeasure(int, int);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public deprecated void onProvideStructure(android.view.ViewStructure);
- method public void onProvideStructure(android.view.ViewStructure, int);
- method public deprecated void onProvideVirtualStructure(android.view.ViewStructure);
- method public void onProvideVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideStructure(android.view.ViewStructure);
+ method public void onProvideVirtualStructure(android.view.ViewStructure);
method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
method protected void onRestoreInstanceState(android.os.Parcelable);
method public void onRtlPropertiesChanged(int);
@@ -46901,8 +46896,8 @@ package android.view {
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
- field public static final int ASSIST_FLAG_NON_SANITIZED_TEXT = 2; // 0x2
- field public static final int ASSIST_FLAG_SANITIZED_TEXT = 1; // 0x1
+ field public static final int AUTO_FILL_FLAG_TYPE_FILL = 1; // 0x1
+ field public static final int AUTO_FILL_FLAG_TYPE_SAVE = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -46932,8 +46927,6 @@ package android.view {
field public static final int FOCUS_BACKWARD = 1; // 0x1
field public static final int FOCUS_DOWN = 130; // 0x82
field public static final int FOCUS_FORWARD = 2; // 0x2
- field public static final int FOCUS_GROUP_CLUSTER = 1; // 0x1
- field public static final int FOCUS_GROUP_SECTION = 2; // 0x2
field public static final int FOCUS_LEFT = 17; // 0x11
field public static final int FOCUS_RIGHT = 66; // 0x42
field public static final int FOCUS_UP = 33; // 0x21
@@ -46945,6 +46938,8 @@ package android.view {
field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
field public static final int INVISIBLE = 4; // 0x4
field public static final int KEEP_SCREEN_ON = 67108864; // 0x4000000
+ field public static final int KEYBOARD_NAVIGATION_GROUP_CLUSTER = 1; // 0x1
+ field public static final int KEYBOARD_NAVIGATION_GROUP_SECTION = 2; // 0x2
field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
field public static final int LAYER_TYPE_NONE = 0; // 0x0
field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
@@ -47463,7 +47458,7 @@ package android.view {
method public abstract boolean isLayoutRequested();
method public abstract boolean isTextAlignmentResolved();
method public abstract boolean isTextDirectionResolved();
- method public abstract android.view.View keyboardNavigationClusterSearch(int, android.view.View, int);
+ method public abstract android.view.View keyboardNavigationGroupSearch(int, android.view.View, int);
method public abstract void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
method public abstract boolean onNestedPreFling(android.view.View, float, float);
@@ -47532,6 +47527,7 @@ package android.view {
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
+ method public abstract android.view.ViewStructure asyncNewChild(int, int);
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -47540,9 +47536,11 @@ package android.view {
method public abstract int getTextSelectionStart();
method public abstract boolean hasExtras();
method public abstract android.view.ViewStructure newChild(int);
+ method public abstract android.view.ViewStructure newChild(int, int);
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
+ method public abstract void setAutoFillType(android.view.autofill.AutoFillType);
method public abstract void setCheckable(boolean);
method public abstract void setChecked(boolean);
method public abstract void setChildCount(int);
@@ -48766,6 +48764,80 @@ package android.view.animation {
}
+package android.view.autofill {
+
+ public final class AutoFillId implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillId> CREATOR;
+ }
+
+ public final class AutoFillType implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.view.autofill.AutoFillType forList();
+ method public static android.view.autofill.AutoFillType forText(int);
+ method public static android.view.autofill.AutoFillType forToggle();
+ method public int getSubType();
+ method public boolean isList();
+ method public boolean isText();
+ method public boolean isToggle();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillType> CREATOR;
+ }
+
+ public final class AutoFillValue implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.view.autofill.AutoFillValue forList(int);
+ method public static android.view.autofill.AutoFillValue forText(java.lang.CharSequence);
+ method public static android.view.autofill.AutoFillValue forToggle(boolean);
+ method public int getListValue();
+ method public java.lang.CharSequence getTextValue();
+ method public boolean getToggleValue();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillValue> CREATOR;
+ }
+
+ public final class Dataset implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.Dataset> CREATOR;
+ }
+
+ public static final class Dataset.Builder {
+ ctor public Dataset.Builder(java.lang.CharSequence);
+ method public android.view.autofill.Dataset build();
+ method public android.view.autofill.Dataset.Builder setExtras(android.os.Bundle);
+ method public android.view.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
+ }
+
+ public final class FillResponse implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.FillResponse> CREATOR;
+ }
+
+ public static final class FillResponse.Builder {
+ ctor public FillResponse.Builder();
+ method public android.view.autofill.FillResponse.Builder addDataset(android.view.autofill.Dataset);
+ method public android.view.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
+ method public android.view.autofill.FillResponse build();
+ method public android.view.autofill.FillResponse.Builder setExtras(android.os.Bundle);
+ }
+
+ public abstract class VirtualViewDelegate {
+ ctor public VirtualViewDelegate();
+ method public abstract void autoFill(int, android.view.autofill.AutoFillValue);
+ }
+
+ public static abstract class VirtualViewDelegate.Callback {
+ ctor public VirtualViewDelegate.Callback();
+ method public void onFocusChanged(int, boolean);
+ method public void onNodeRemoved(int...);
+ method public void onValueChanged(int);
+ }
+
+}
+
package android.view.inputmethod {
public class BaseInputConnection implements android.view.inputmethod.InputConnection {
@@ -50281,8 +50353,8 @@ package android.webkit {
method public abstract boolean onKeyUp(int, android.view.KeyEvent);
method public abstract void onMeasure(int, int);
method public abstract void onOverScrolled(int, int, boolean, boolean);
+ method public default void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
method public abstract void onProvideVirtualStructure(android.view.ViewStructure);
- method public default void onProvideVirtualStructure(android.view.ViewStructure, int);
method public abstract void onScrollChanged(int, int, int, int);
method public abstract void onSizeChanged(int, int, int, int);
method public abstract void onStartTemporaryDetach();
@@ -52568,6 +52640,7 @@ package android.widget {
method public boolean getIncludeFontPadding();
method public android.os.Bundle getInputExtras(boolean);
method public int getInputType();
+ method public boolean getJustify();
method public final android.text.method.KeyListener getKeyListener();
method public final android.text.Layout getLayout();
method public float getLetterSpacing();
@@ -52676,6 +52749,7 @@ package android.widget {
method public void setIncludeFontPadding(boolean);
method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public void setInputType(int);
+ method public void setJustify(boolean);
method public void setKeyListener(android.text.method.KeyListener);
method public void setLetterSpacing(float);
method public void setLineSpacing(float, float);
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 7ba88bdb9d33..1ba26f5975d1 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -124,6 +124,12 @@ package android.media.tv {
package android.net {
+ public class ConnectivityManager {
+ method public deprecated boolean requestRouteToHost(int, int);
+ method public deprecated int startUsingNetworkFeature(int, java.lang.String);
+ method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
+ }
+
public abstract class PskKeyManager {
ctor public PskKeyManager();
field public static final int MAX_IDENTITY_HINT_LENGTH_BYTES = 128; // 0x80
diff --git a/api/test-current.txt b/api/test-current.txt
index e6148835639f..c1ec21df688c 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -5423,7 +5423,8 @@ package android.app {
method public void cancel(int);
method public void cancel(java.lang.String, int);
method public void cancelAll();
- method public void createNotificationChannel(android.app.NotificationChannel, android.app.NotificationManager.OnNotificationChannelCreatedListener, android.os.Handler);
+ method public void createNotificationChannel(android.app.NotificationChannel);
+ method public void createNotificationChannels(java.util.List<android.app.NotificationChannel>);
method public void deleteNotificationChannel(java.lang.String);
method public android.service.notification.StatusBarNotification[] getActiveNotifications();
method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String);
@@ -5458,10 +5459,6 @@ package android.app {
field public static final int INTERRUPTION_FILTER_UNKNOWN = 0; // 0x0
}
- public static abstract interface NotificationManager.OnNotificationChannelCreatedListener {
- method public abstract void onNotificationChannelCreated(android.app.NotificationChannel);
- }
-
public static class NotificationManager.Policy implements android.os.Parcelable {
ctor public NotificationManager.Policy(int, int, int);
ctor public NotificationManager.Policy(int, int, int, int);
@@ -6156,6 +6153,7 @@ package android.app.admin {
method public boolean isSecurityLoggingEnabled(android.content.ComponentName);
method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String);
method public void lockNow();
+ method public void lockNow(int);
method public void reboot(android.content.ComponentName);
method public void removeActiveAdmin(android.content.ComponentName);
method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String);
@@ -6272,6 +6270,7 @@ package android.app.admin {
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
+ field public static final int FLAG_EVICT_CE_KEY = 1; // 0x1
field public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 2; // 0x2
field public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 1; // 0x1
field public static final int KEYGUARD_DISABLE_FEATURES_ALL = 2147483647; // 0x7fffffff
@@ -6391,7 +6390,8 @@ package android.app.assist {
public static class AssistStructure.ViewNode {
method public float getAlpha();
- method public int getAutoFillId();
+ method public android.view.autofill.AutoFillId getAutoFillId();
+ method public android.view.autofill.AutoFillType getAutoFillType();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
method public int getChildCount();
method public java.lang.String getClassName();
@@ -6649,6 +6649,16 @@ package android.app.usage {
field public static final android.os.Parcelable.Creator<android.app.usage.ConfigurationStats> CREATOR;
}
+ public final class ExternalStorageStats implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getAudioBytes();
+ method public long getImageBytes();
+ method public long getTotalBytes();
+ method public long getVideoBytes();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.usage.ExternalStorageStats> CREATOR;
+ }
+
public final class NetworkStats implements java.lang.AutoCloseable {
method public void close();
method public boolean getNextBucket(android.app.usage.NetworkStats.Bucket);
@@ -6703,31 +6713,18 @@ package android.app.usage {
public final class StorageStats implements android.os.Parcelable {
method public int describeContents();
method public long getCacheBytes();
- method public long getCacheQuotaBytes();
method public long getCodeBytes();
method public long getDataBytes();
- method public int getUid();
- method public java.lang.String getVolumeUuid();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.usage.StorageStats> CREATOR;
}
public class StorageStatsManager {
+ method public long getFreeBytes(java.lang.String);
+ method public long getTotalBytes(java.lang.String);
+ method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
- method public android.app.usage.StorageSummary querySummary(java.lang.String);
- }
-
- public final class StorageSummary implements android.os.Parcelable {
- method public int describeContents();
- method public long getFreeBytes();
- method public long getSharedAudioBytes();
- method public long getSharedImagesBytes();
- method public long getSharedTotalBytes();
- method public long getSharedVideoBytes();
- method public long getTotalBytes();
- method public java.lang.String getVolumeUuid();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.usage.StorageSummary> CREATOR;
+ method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
public final class UsageEvents implements android.os.Parcelable {
@@ -6810,6 +6807,7 @@ package android.appwidget {
method protected android.view.View getErrorView();
method protected void prepareView(android.view.View);
method public void setAppWidget(int, android.appwidget.AppWidgetProviderInfo);
+ method public void setAsyncExecutor(java.util.concurrent.Executor);
method public void updateAppWidget(android.widget.RemoteViews);
method public void updateAppWidgetOptions(android.os.Bundle);
method public void updateAppWidgetSize(android.os.Bundle, int, int, int, int);
@@ -24090,11 +24088,8 @@ package android.net {
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
- method public deprecated boolean requestRouteToHost(int, int);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
- method public deprecated int startUsingNetworkFeature(int, java.lang.String);
- method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
method public void unregisterNetworkCallback(android.app.PendingIntent);
field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
@@ -28671,7 +28666,7 @@ package android.opengl {
method public void surfaceChanged(android.view.SurfaceHolder, int, int, int);
method public void surfaceCreated(android.view.SurfaceHolder);
method public void surfaceDestroyed(android.view.SurfaceHolder);
- method public void surfaceRedrawNeeded(android.view.SurfaceHolder);
+ method public deprecated void surfaceRedrawNeeded(android.view.SurfaceHolder);
field public static final int DEBUG_CHECK_GL_ERROR = 1; // 0x1
field public static final int DEBUG_LOG_GL_CALLS = 2; // 0x2
field public static final int RENDERMODE_CONTINUOUSLY = 1; // 0x1
@@ -31050,6 +31045,7 @@ package android.provider {
field public static final java.lang.String ACTION_SET_ALARM = "android.intent.action.SET_ALARM";
field public static final java.lang.String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
field public static final java.lang.String ACTION_SHOW_ALARMS = "android.intent.action.SHOW_ALARMS";
+ field public static final java.lang.String ACTION_SHOW_TIMERS = "android.intent.action.SHOW_TIMERS";
field public static final java.lang.String ACTION_SNOOZE_ALARM = "android.intent.action.SNOOZE_ALARM";
field public static final java.lang.String ALARM_SEARCH_MODE_ALL = "android.all";
field public static final java.lang.String ALARM_SEARCH_MODE_LABEL = "android.label";
@@ -35163,26 +35159,19 @@ package android.service.autofill {
method public void onDisconnected();
method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback);
method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.SaveCallback);
+ field public static final java.lang.String EXTRA_DATASET_EXTRAS = "android.service.autofill.extra.DATASET_EXTRAS";
+ field public static final java.lang.String EXTRA_RESPONSE_EXTRAS = "android.service.autofill.extra.RESPONSE_EXTRAS";
field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
}
public final class FillCallback {
method public void onFailure(java.lang.CharSequence);
- method public void onSuccess(android.service.autofill.FillCallback.FillData);
- }
-
- public static final class FillCallback.FillData {
- }
-
- public static class FillCallback.FillData.Builder {
- ctor public FillCallback.FillData.Builder();
- method public android.service.autofill.FillCallback.FillData build();
- method public android.service.autofill.FillCallback.FillData.Builder setTextField(int, java.lang.String);
+ method public void onSuccess(android.view.autofill.FillResponse);
}
public final class SaveCallback {
method public void onFailure(java.lang.CharSequence);
- method public void onSuccess(int[]);
+ method public void onSuccess(android.view.autofill.AutoFillId[]);
}
}
@@ -36847,6 +36836,7 @@ package android.telecom {
method public void unhold();
method public void unregisterCallback(android.telecom.Call.Callback);
field public static final java.lang.String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
+ field public static final java.lang.String EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS = "android.telecom.extra.LAST_EMERGENCY_CALLBACK_TIME_MILLIS";
field public static final int STATE_ACTIVE = 4; // 0x4
field public static final int STATE_CONNECTING = 9; // 0x9
field public static final int STATE_DIALING = 1; // 0x1
@@ -39582,6 +39572,7 @@ package android.text {
method public android.text.StaticLayout.Builder setHyphenationFrequency(int);
method public android.text.StaticLayout.Builder setIncludePad(boolean);
method public android.text.StaticLayout.Builder setIndents(int[], int[]);
+ method public android.text.StaticLayout.Builder setJustify(boolean);
method public android.text.StaticLayout.Builder setLineSpacing(float, float);
method public android.text.StaticLayout.Builder setMaxLines(int);
method public android.text.StaticLayout.Builder setText(java.lang.CharSequence);
@@ -42134,7 +42125,7 @@ package android.view {
method public android.view.View findNearestTouchable(android.view.ViewGroup, int, int, int, int[]);
method public final android.view.View findNextFocus(android.view.ViewGroup, android.view.View, int);
method public android.view.View findNextFocusFromRect(android.view.ViewGroup, android.graphics.Rect, int);
- method public android.view.View findNextKeyboardNavigationCluster(int, android.view.View, android.view.View, int);
+ method public android.view.View findNextKeyboardNavigationGroup(int, android.view.View, android.view.View, int);
method public static android.view.FocusFinder getInstance();
}
@@ -43359,6 +43350,7 @@ package android.view {
public static abstract interface SurfaceHolder.Callback2 implements android.view.SurfaceHolder.Callback {
method public abstract void surfaceRedrawNeeded(android.view.SurfaceHolder);
+ method public default void surfaceRedrawNeededAsync(android.view.SurfaceHolder, java.lang.Runnable);
}
public class SurfaceView extends android.view.View {
@@ -43433,12 +43425,13 @@ package android.view {
method public void addChildrenForAccessibility(java.util.ArrayList<android.view.View>);
method public void addFocusables(java.util.ArrayList<android.view.View>, int);
method public void addFocusables(java.util.ArrayList<android.view.View>, int, int);
- method public void addKeyboardNavigationClusters(int, java.util.Collection<android.view.View>, int);
+ method public void addKeyboardNavigationGroups(int, java.util.Collection<android.view.View>, int);
method public void addOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void addOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
method public void announceForAccessibility(java.lang.CharSequence);
+ method public void autoFill(android.view.autofill.AutoFillValue);
method protected boolean awakenScrollBars();
method protected boolean awakenScrollBars(int);
method protected boolean awakenScrollBars(int, boolean);
@@ -43490,8 +43483,8 @@ package android.view {
method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
method public boolean dispatchNestedScroll(int, int, int, int, int[]);
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public deprecated void dispatchProvideStructure(android.view.ViewStructure);
- method public void dispatchProvideStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideStructure(android.view.ViewStructure);
method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSetActivated(boolean);
@@ -43526,6 +43519,8 @@ package android.view {
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
+ method public android.view.autofill.AutoFillType getAutoFillType();
+ method public android.view.autofill.VirtualViewDelegate getAutoFillVirtualViewDelegate(android.view.autofill.VirtualViewDelegate.Callback);
method public android.graphics.drawable.Drawable getBackground();
method public android.content.res.ColorStateList getBackgroundTintList();
method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
@@ -43722,7 +43717,7 @@ package android.view {
method public boolean isVerticalFadingEdgeEnabled();
method public boolean isVerticalScrollBarEnabled();
method public void jumpDrawablesToCurrentState();
- method public android.view.View keyboardNavigationClusterSearch(int, android.view.View, int);
+ method public android.view.View keyboardNavigationGroupSearch(int, android.view.View, int);
method public void layout(int, int, int, int);
method public final void measure(int, int);
method protected static int[] mergeDrawableStates(int[], int[]);
@@ -43763,10 +43758,10 @@ package android.view {
method protected void onMeasure(int, int);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public deprecated void onProvideStructure(android.view.ViewStructure);
- method public void onProvideStructure(android.view.ViewStructure, int);
- method public deprecated void onProvideVirtualStructure(android.view.ViewStructure);
- method public void onProvideVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideStructure(android.view.ViewStructure);
+ method public void onProvideVirtualStructure(android.view.ViewStructure);
method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
method protected void onRestoreInstanceState(android.os.Parcelable);
method public void onRtlPropertiesChanged(int);
@@ -43973,8 +43968,8 @@ package android.view {
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
- field public static final int ASSIST_FLAG_NON_SANITIZED_TEXT = 2; // 0x2
- field public static final int ASSIST_FLAG_SANITIZED_TEXT = 1; // 0x1
+ field public static final int AUTO_FILL_FLAG_TYPE_FILL = 1; // 0x1
+ field public static final int AUTO_FILL_FLAG_TYPE_SAVE = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -44004,8 +43999,6 @@ package android.view {
field public static final int FOCUS_BACKWARD = 1; // 0x1
field public static final int FOCUS_DOWN = 130; // 0x82
field public static final int FOCUS_FORWARD = 2; // 0x2
- field public static final int FOCUS_GROUP_CLUSTER = 1; // 0x1
- field public static final int FOCUS_GROUP_SECTION = 2; // 0x2
field public static final int FOCUS_LEFT = 17; // 0x11
field public static final int FOCUS_RIGHT = 66; // 0x42
field public static final int FOCUS_UP = 33; // 0x21
@@ -44017,6 +44010,8 @@ package android.view {
field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
field public static final int INVISIBLE = 4; // 0x4
field public static final int KEEP_SCREEN_ON = 67108864; // 0x4000000
+ field public static final int KEYBOARD_NAVIGATION_GROUP_CLUSTER = 1; // 0x1
+ field public static final int KEYBOARD_NAVIGATION_GROUP_SECTION = 2; // 0x2
field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
field public static final int LAYER_TYPE_NONE = 0; // 0x0
field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
@@ -44539,7 +44534,7 @@ package android.view {
method public abstract boolean isLayoutRequested();
method public abstract boolean isTextAlignmentResolved();
method public abstract boolean isTextDirectionResolved();
- method public abstract android.view.View keyboardNavigationClusterSearch(int, android.view.View, int);
+ method public abstract android.view.View keyboardNavigationGroupSearch(int, android.view.View, int);
method public abstract void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
method public abstract boolean onNestedPreFling(android.view.View, float, float);
@@ -44608,6 +44603,7 @@ package android.view {
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
+ method public abstract android.view.ViewStructure asyncNewChild(int, int);
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -44616,9 +44612,11 @@ package android.view {
method public abstract int getTextSelectionStart();
method public abstract boolean hasExtras();
method public abstract android.view.ViewStructure newChild(int);
+ method public abstract android.view.ViewStructure newChild(int, int);
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
+ method public abstract void setAutoFillType(android.view.autofill.AutoFillType);
method public abstract void setCheckable(boolean);
method public abstract void setChecked(boolean);
method public abstract void setChildCount(int);
@@ -45841,6 +45839,80 @@ package android.view.animation {
}
+package android.view.autofill {
+
+ public final class AutoFillId implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillId> CREATOR;
+ }
+
+ public final class AutoFillType implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.view.autofill.AutoFillType forList();
+ method public static android.view.autofill.AutoFillType forText(int);
+ method public static android.view.autofill.AutoFillType forToggle();
+ method public int getSubType();
+ method public boolean isList();
+ method public boolean isText();
+ method public boolean isToggle();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillType> CREATOR;
+ }
+
+ public final class AutoFillValue implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.view.autofill.AutoFillValue forList(int);
+ method public static android.view.autofill.AutoFillValue forText(java.lang.CharSequence);
+ method public static android.view.autofill.AutoFillValue forToggle(boolean);
+ method public int getListValue();
+ method public java.lang.CharSequence getTextValue();
+ method public boolean getToggleValue();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillValue> CREATOR;
+ }
+
+ public final class Dataset implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.Dataset> CREATOR;
+ }
+
+ public static final class Dataset.Builder {
+ ctor public Dataset.Builder(java.lang.CharSequence);
+ method public android.view.autofill.Dataset build();
+ method public android.view.autofill.Dataset.Builder setExtras(android.os.Bundle);
+ method public android.view.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
+ }
+
+ public final class FillResponse implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.autofill.FillResponse> CREATOR;
+ }
+
+ public static final class FillResponse.Builder {
+ ctor public FillResponse.Builder();
+ method public android.view.autofill.FillResponse.Builder addDataset(android.view.autofill.Dataset);
+ method public android.view.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
+ method public android.view.autofill.FillResponse build();
+ method public android.view.autofill.FillResponse.Builder setExtras(android.os.Bundle);
+ }
+
+ public abstract class VirtualViewDelegate {
+ ctor public VirtualViewDelegate();
+ method public abstract void autoFill(int, android.view.autofill.AutoFillValue);
+ }
+
+ public static abstract class VirtualViewDelegate.Callback {
+ ctor public VirtualViewDelegate.Callback();
+ method public void onFocusChanged(int, boolean);
+ method public void onNodeRemoved(int...);
+ method public void onValueChanged(int);
+ }
+
+}
+
package android.view.inputmethod {
public class BaseInputConnection implements android.view.inputmethod.InputConnection {
@@ -49292,6 +49364,7 @@ package android.widget {
method public boolean getIncludeFontPadding();
method public android.os.Bundle getInputExtras(boolean);
method public int getInputType();
+ method public boolean getJustify();
method public final android.text.method.KeyListener getKeyListener();
method public final android.text.Layout getLayout();
method public float getLetterSpacing();
@@ -49400,6 +49473,7 @@ package android.widget {
method public void setIncludeFontPadding(boolean);
method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public void setInputType(int);
+ method public void setJustify(boolean);
method public void setKeyListener(android.text.method.KeyListener);
method public void setLetterSpacing(float);
method public void setLineSpacing(float, float);
diff --git a/api/test-removed.txt b/api/test-removed.txt
index d7a8bce2d00b..ab22b6ec1720 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -126,6 +126,12 @@ package android.media.tv {
package android.net {
+ public class ConnectivityManager {
+ method public deprecated boolean requestRouteToHost(int, int);
+ method public deprecated int startUsingNetworkFeature(int, java.lang.String);
+ method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
+ }
+
public abstract class PskKeyManager {
ctor public PskKeyManager();
field public static final int MAX_IDENTITY_HINT_LENGTH_BYTES = 128; // 0x80
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 2ccfe0e3b72d..87e54166b3a1 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -70,9 +70,8 @@ import android.os.ServiceManager.ServiceNotFoundException;
import android.os.StrictMode;
import android.os.SystemProperties;
import android.os.UserHandle;
-import android.service.autofill.FillableInputField;
import android.service.autofill.AutoFillService;
-import android.service.autofill.IAutoFillCallback;
+import android.service.autofill.IAutoFillAppCallback;
import android.text.Selection;
import android.text.SpannableStringBuilder;
import android.text.TextAssistant;
@@ -115,6 +114,11 @@ import android.view.Window.WindowControllerCallback;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
+import android.view.autofill.VirtualViewDelegate;
+import android.view.autofill.Dataset;
+import android.view.autofill.DatasetField;
+import android.view.autofill.AutoFillId;
+import android.view.autofill.FillResponse;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.Toast;
@@ -130,6 +134,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -697,6 +702,9 @@ public class Activity extends ContextThemeWrapper
private static final String TAG = "Activity";
private static final boolean DEBUG_LIFECYCLE = false;
+ // TODO(b/33197203): set to false once stable
+ private static final boolean DEBUG_AUTO_FILL = true;
+
/** Standard activity result: operation canceled. */
public static final int RESULT_CANCELED = 0;
/** Standard activity result: operation succeeded. */
@@ -847,7 +855,10 @@ public class Activity extends ContextThemeWrapper
private boolean mEatKeyUpEvent;
@GuardedBy("this")
- private IAutoFillCallback mAutoFillCallback;
+ private WeakReference<IAutoFillAppCallback> mAutoFillCallback;
+
+ @GuardedBy("this")
+ private VirtualViewDelegate.Callback mAutoFillDelegateCallback;
private static native String getDlWarning();
@@ -1718,47 +1729,73 @@ public class Activity extends ContextThemeWrapper
}
/**
- * Lazily gets the {@code IAutoFillCallback} for this activitity.
+ * Lazily sets the {@link #mAutoFillDelegateCallback}.
+ */
+ private void setAutoFillDelegateCallback() {
+ synchronized (this) {
+ if (mAutoFillDelegateCallback == null) {
+ mAutoFillDelegateCallback = new VirtualViewDelegate.Callback() {
+ // TODO(b/33197203): implement
+ };
+ }
+ }
+ }
+
+ /**
+ * Lazily gets the {@link IAutoFillAppCallback} for this activitity.
*
* <p>This callback is used by the {@link AutoFillService} app to auto-fill the activity fields.
*/
- IAutoFillCallback getAutoFillCallback() {
+ WeakReference<IAutoFillAppCallback> getAutoFillCallback() {
synchronized (this) {
if (mAutoFillCallback == null) {
- mAutoFillCallback = new IAutoFillCallback.Stub() {
+ final IAutoFillAppCallback cb = new IAutoFillAppCallback.Stub() {
@Override
- public void autofill(@SuppressWarnings("rawtypes") List fields)
- throws RemoteException {
+ public void autoFill(Dataset dataset) throws RemoteException {
+ // TODO(b/33197203): must keep the dataset so subsequent calls pass the same
+ // dataset.extras to service
runOnUiThread(() -> {
final View root = getWindow().getDecorView().getRootView();
- for (Object field : fields) {
- if (!(field instanceof FillableInputField)) {
- Slog.w(TAG, "autofill(): invalid type " + field.getClass());
+ for (DatasetField field : dataset.getFields()) {
+ final AutoFillId id = field.getId();
+ if (id == null) {
+ Log.w(TAG, "autoFill(): null id on " + field);
continue;
}
- FillableInputField autoFillField = (FillableInputField) field;
- final int viewId = autoFillField.getId();
+ final int viewId = id.getViewId();
final View view = root.findViewByAccessibilityIdTraversal(viewId);
- // TODO(b/33197203): should handle other types of view as well, but
- // that will require:
- // - a new interface like AutoFillable
- // - a way for the views to define the type of the autofield value
- if ((view instanceof EditText)) {
- ((EditText) view).setText(autoFillField.getValue());
+ if (view == null) {
+ Log.w(TAG, "autoFill(): no View with id " + viewId);
+ continue;
}
- }
- });
- }
- @Override
- public void showError(String message) {
- runOnUiThread(() -> {
- // TODO(b/33197203): temporary show a toast until it uses the Snack bar.
- Toast.makeText(Activity.this, "Auto-fill request failed: " + message,
- Toast.LENGTH_LONG).show();
+ // TODO(b/33197203): handle protected value (like credit card)
+ if (id.isVirtual()) {
+ // Delegate virtual fields to provider.
+ setAutoFillDelegateCallback();
+ final VirtualViewDelegate mgr = view
+ .getAutoFillVirtualViewDelegate(
+ mAutoFillDelegateCallback);
+ if (mgr == null) {
+ Log.w(TAG, "autoFill(): cannot fill virtual " + id
+ + "; no auto-fill provider for view "
+ + view.getClass());
+ continue;
+ }
+ if (DEBUG_AUTO_FILL) {
+ Log.d(TAG, "autoFill(): delegating " + id
+ + " to virtual manager " + mgr);
+ }
+ mgr.autoFill(id.getVirtualChildId(), field.getValue());
+ } else {
+ // Handle non-virtual fields itself.
+ view.autoFill(field.getValue());
+ }
+ }
});
}
};
+ mAutoFillCallback = new WeakReference<IAutoFillAppCallback>(cb);
}
}
return mAutoFillCallback;
@@ -4341,8 +4378,8 @@ public class Activity extends ContextThemeWrapper
* that are defined to return a result. In other protocols (such as
* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
* not get the result when you expect. For example, if the activity you
- * are launching uses the singleTask launch mode, it will not run in your
- * task and thus you will immediately receive a cancel result.
+ * are launching uses {@link Intent#FLAG_ACTIVITY_NEW_TASK}, it will not
+ * run in your task and thus you will immediately receive a cancel result.
*
* <p>As a special case, if you call startActivityForResult() with a requestCode
* >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
@@ -6096,7 +6133,7 @@ public class Activity extends ContextThemeWrapper
if (mAutoFillCallback != null) {
writer.print(prefix); writer.print("mAutoFillCallback: " );
- writer.println(mAutoFillCallback);
+ writer.println(mAutoFillCallback.get());
}
mHandler.getLooper().dump(new PrintWriterPrinter(writer), prefix);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index cd50c4dbec15..d362b012c000 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -483,6 +483,12 @@ public class ActivityManager {
/** @hide requestType for assist context: generate full AssistStructure. */
public static final int ASSIST_CONTEXT_FULL = 1;
+ /** @hide requestType for assist context: generate full AssistStructure for auto-fill. */
+ public static final int ASSIST_CONTEXT_AUTO_FILL = 2;
+
+ /** @hide requestType for assist context: generate full AssistStructure for auto-fill save. */
+ public static final int ASSIST_CONTEXT_AUTO_FILL_SAVE = 3;
+
/** @hide Flag for registerUidObserver: report changes in process state. */
public static final int UID_OBSERVER_PROCSTATE = 1<<0;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index e34fabced517..e3bbc92ad6c5 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -89,7 +89,7 @@ import android.provider.Settings;
import android.security.NetworkSecurityPolicy;
import android.security.net.config.NetworkSecurityConfigProvider;
import android.service.autofill.AutoFillService;
-import android.service.autofill.IAutoFillCallback;
+import android.service.autofill.IAutoFillAppCallback;
import android.service.voice.VoiceInteractionSession;
import android.util.AndroidRuntimeException;
import android.util.ArrayMap;
@@ -2884,9 +2884,8 @@ public final class ActivityThread {
// - it does not call onProvideAssistData()
// - it needs an IAutoFillCallback
// - it sets the flags so views can provide autofill-specific data (such as passwords)
- boolean forAutoFill = (cmd.flags
- & (View.ASSIST_FLAG_SANITIZED_TEXT
- | View.ASSIST_FLAG_NON_SANITIZED_TEXT)) != 0;
+ boolean forAutoFill = cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTO_FILL
+ || cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTO_FILL_SAVE;
// TODO(b/33197203): decide if lastSessionId logic applies to auto-fill sessions
if (mLastSessionId != cmd.sessionId) {
@@ -2910,22 +2909,23 @@ public final class ActivityThread {
if (!forAutoFill) {
r.activity.getApplication().dispatchOnProvideAssistData(r.activity, data);
r.activity.onProvideAssistData(data);
+ referrer = r.activity.onProvideReferrer();
}
- referrer = r.activity.onProvideReferrer();
if (cmd.requestType == ActivityManager.ASSIST_CONTEXT_FULL || forAutoFill) {
structure = new AssistStructure(r.activity, cmd.flags);
Intent activityIntent = r.activity.getIntent();
- if (cmd.flags > 0) {
+ if (forAutoFill) {
data.putInt(VoiceInteractionSession.KEY_FLAGS, cmd.flags);
}
+ boolean addAutoFillCallback = false;
// TODO(b/33197203): re-evaluate conditions below for auto-fill. In particular,
// FLAG_SECURE might be allowed on AUTO_FILL but not on AUTO_FILL_SAVE)
- if (activityIntent != null && (r.window == null ||
+ boolean notSecure = r.window == null ||
(r.window.getAttributes().flags
- & WindowManager.LayoutParams.FLAG_SECURE) == 0)) {
+ & WindowManager.LayoutParams.FLAG_SECURE) == 0;
+ if (activityIntent != null && notSecure) {
if (forAutoFill) {
- IAutoFillCallback autoFillCallback = r.activity.getAutoFillCallback();
- data.putBinder(AutoFillService.KEY_CALLBACK, autoFillCallback.asBinder());
+ addAutoFillCallback = true;
} else {
Intent intent = new Intent(activityIntent);
intent.setFlags(intent.getFlags() & ~(Intent.FLAG_GRANT_WRITE_URI_PERMISSION
@@ -2936,10 +2936,21 @@ public final class ActivityThread {
} else {
if (!forAutoFill) {
content.setDefaultIntent(new Intent());
+ } else {
+ // activityIntent is unlikely to be null, but if it is, we should still
+ // set the auto-fill callback.
+ addAutoFillCallback = notSecure;
}
}
if (!forAutoFill) {
r.activity.onProvideAssistContent(content);
+ } else if (addAutoFillCallback) {
+ IAutoFillAppCallback cb = r.activity.getAutoFillCallback().get();
+ if (cb != null) {
+ data.putBinder(AutoFillService.KEY_CALLBACK, cb.asBinder());
+ } else {
+ Slog.w(TAG, "handleRequestAssistContextExtras(): callback was GCed");
+ }
}
}
}
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index fd139f748fc6..a2d9c45035d3 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -586,8 +586,9 @@ interface IActivityManager {
void unregisterTaskStackListener(ITaskStackListener listener);
void moveStackToDisplay(int stackId, int displayId);
boolean requestAutoFillData(in IResultReceiver receiver, in Bundle receiverExtras,
- in IBinder activityToken, int flags);
+ int resultCode, in IBinder activityToken, int flags);
void dismissKeyguard(in IBinder token, in IKeyguardDismissCallback callback);
+ int restartUserInBackground(int userId);
// WARNING: when these transactions are updated, check if they are any callers on the native
// side. If so, make sure they are using the correct transaction ids and arguments.
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 4d5f67b0637e..81aeaef6d63b 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -17,7 +17,6 @@
package android.app;
-import android.app.IOnNotificationChannelCreatedListener;
import android.app.ITransientNotification;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -52,8 +51,7 @@ interface INotificationManager
boolean areNotificationsEnabled(String pkg);
int getPackageImportance(String pkg);
- void createNotificationChannel(String pkg, in NotificationChannel channel,
- in IOnNotificationChannelCreatedListener listener);
+ void createNotificationChannels(String pkg, in ParceledListSlice channelsList);
void updateNotificationChannelForPackage(String pkg, int uid, in NotificationChannel channel);
NotificationChannel getNotificationChannel(String pkg, String channelId);
NotificationChannel getNotificationChannelForPackage(String pkg, int uid, String channelId);
diff --git a/core/java/android/app/IOnNotificationChannelCreatedListener.aidl b/core/java/android/app/IOnNotificationChannelCreatedListener.aidl
deleted file mode 100644
index 8e6654200017..000000000000
--- a/core/java/android/app/IOnNotificationChannelCreatedListener.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-**
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-package android.app;
-
-import android.app.NotificationChannel;
-
-/** {@hide} */
-oneway interface IOnNotificationChannelCreatedListener {
- void onNotificationChannelCreated(in NotificationChannel channel);
-}
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index a9ff482ffdba..3551691b18be 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -47,6 +47,7 @@ import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -381,42 +382,26 @@ public class NotificationManager
}
/**
- * Listener passed to {@link NotificationManager#createNotificationChannel} to notify
- * caller of result.
+ * Creates a notification channel that notifications can be posted to.
+ *
+ * @param channel the channel to create. Note that the created channel may differ from this
+ * value. If the channel already exists, it will not be modified.
*/
- public interface OnNotificationChannelCreatedListener {
- /**
- * @param createdChannel NotificationChannel created by the system. Value is null iff an
- * exception was thrown during channel creation.
- */
- public void onNotificationChannelCreated(NotificationChannel createdChannel);
+ public void createNotificationChannel(@NonNull NotificationChannel channel) {
+ createNotificationChannels(Arrays.asList(channel));
}
/**
- * Creates a notification channel that notifications can be posted to.
+ * Creates multiple notification channels that different notifications can be posted to.
*
- * @param channel the channel to attempt to create. Note that the created channel may differ
- * from this value.
- * @param listener Called when operation is finished.
- * @param handler The handler to invoke the listener on, or {@code null} to use the main
- * handler.
+ * @param channels the list of channels to attempt to create. If any of these channels already
+ * exist, they will not be modified.
*/
- public void createNotificationChannel(
- @NonNull NotificationChannel channel,
- @NonNull OnNotificationChannelCreatedListener listener,
- @Nullable Handler handler) {
+ public void createNotificationChannels(@NonNull List<NotificationChannel> channels) {
INotificationManager service = getService();
try {
- final Handler actualHandler =
- handler != null ? handler : new Handler(Looper.getMainLooper());
- service.createNotificationChannel(mContext.getPackageName(), channel,
- new IOnNotificationChannelCreatedListener.Stub() {
- @Override public void onNotificationChannelCreated(
- NotificationChannel channel) {
- actualHandler.post(
- () -> { listener.onNotificationChannelCreated(channel); });
- }
- });
+ service.createNotificationChannels(mContext.getPackageName(),
+ new ParceledListSlice(channels));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 6f73388ff139..a56ff5e15e9b 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2715,6 +2715,24 @@ public class DevicePolicyManager {
}
/**
+ * Flag for {@link #lockNow(int)}: also evict the user's credential encryption key from the
+ * keyring. The user's credential will need to be entered again in order to derive the
+ * credential encryption key that will be stored back in the keyring for future use.
+ * <p>
+ * This flag can only be used by a profile owner when locking a managed profile on an FBE
+ * device.
+ * <p>
+ * In order to secure user data, the user will be stopped and restarted so apps should wait
+ * until they are next run to perform further actions.
+ */
+ public static final int FLAG_EVICT_CE_KEY = 1;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag=true, value={FLAG_EVICT_CE_KEY})
+ public @interface LockNowFlag {}
+
+ /**
* Make the device lock immediately, as if the lock screen timeout has expired at the point of
* this call.
* <p>
@@ -2723,14 +2741,40 @@ public class DevicePolicyManager {
* <p>
* This method can be called on the {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to lock the parent profile.
+ * <p>
+ * Equivalent to calling {@link #lockNow(int)} with no flags.
*
* @throws SecurityException if the calling application does not own an active administrator
* that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
*/
public void lockNow() {
+ lockNow(0);
+ }
+
+ /**
+ * Make the device lock immediately, as if the lock screen timeout has expired at the point of
+ * this call.
+ * <p>
+ * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
+ * to be able to call this method; if it has not, a security exception will be thrown.
+ * <p>
+ * This method can be called on the {@link DevicePolicyManager} instance returned by
+ * {@link #getParentProfileInstance(ComponentName)} in order to lock the parent profile.
+ *
+ * @param flags May be 0 or {@link #FLAG_EVICT_CE_KEY}.
+ * @throws SecurityException if the calling application does not own an active administrator
+ * that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} or the
+ * {@link #FLAG_EVICT_CE_KEY} flag is passed by an application that is not a profile
+ * owner of a managed profile.
+ * @throws IllegalArgumentException if the {@link #FLAG_EVICT_CE_KEY} flag is passed when
+ * locking the parent profile.
+ * @throws UnsupportedOperationException if the {@link #FLAG_EVICT_CE_KEY} flag is passed on a
+ * non-FBE device.
+ */
+ public void lockNow(@LockNowFlag int flags) {
if (mService != null) {
try {
- mService.lockNow(mParentInstance);
+ mService.lockNow(flags, mParentInstance);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 9be694e8a319..66185d53fb0a 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -90,7 +90,7 @@ interface IDevicePolicyManager {
void setRequiredStrongAuthTimeout(in ComponentName who, long timeMs, boolean parent);
long getRequiredStrongAuthTimeout(in ComponentName who, int userId, boolean parent);
- void lockNow(boolean parent);
+ void lockNow(int flags, boolean parent);
void wipeData(int flags);
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index 1988e4265fb0..b94264e1ac5d 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -21,6 +21,8 @@ import android.view.ViewStructure;
import android.view.ViewRootImpl;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
+import android.view.autofill.AutoFillType;
+import android.view.autofill.AutoFillId;
import java.util.ArrayList;
@@ -411,25 +413,30 @@ public class AssistStructure implements Parcelable {
mTitle = root.getTitle();
mDisplayId = root.getDisplayId();
mRoot = new ViewNode();
+
+ // Must explicitly call the proper method based on flags since we don't know which
+ // method (if any) was overridden by the View subclass.
+ boolean forAutoFill = (flags
+ & (View.AUTO_FILL_FLAG_TYPE_FILL
+ | View.AUTO_FILL_FLAG_TYPE_SAVE)) != 0;
+
ViewNodeBuilder builder = new ViewNodeBuilder(assist, mRoot, false);
if ((root.getWindowFlags()& WindowManager.LayoutParams.FLAG_SECURE) != 0) {
// This is a secure window, so it doesn't want a screenshot, and that
// means we should also not copy out its view hierarchy.
- // Must explicitly set which method to calls since View subclasses might
- // have implemented the deprecated method.
- if (flags == 0) {
- view.onProvideStructure(builder);
+ if (forAutoFill) {
+ view.onProvideAutoFillStructure(builder, flags);
} else {
- view.onProvideStructure(builder, flags);
+ view.onProvideStructure(builder);
}
builder.setAssistBlocked(true);
return;
}
- if (flags == 0) {
- view.dispatchProvideStructure(builder);
+ if (forAutoFill) {
+ view.dispatchProvideAutoFillStructure(builder, flags);
} else {
- view.dispatchProvideStructure(builder, flags);
+ view.dispatchProvideStructure(builder);
}
}
@@ -526,7 +533,10 @@ public class AssistStructure implements Parcelable {
String mIdPackage;
String mIdType;
String mIdEntry;
- int mAutoFillId = View.NO_ID;
+ // TODO(b/33197203): once we have more flags, it might be better to store the individual
+ // fields (viewId and childId) of the field.
+ AutoFillId mAutoFillId;
+ AutoFillType mAutoFillType;
int mX;
int mY;
int mScrollX;
@@ -551,7 +561,11 @@ public class AssistStructure implements Parcelable {
static final int FLAGS_ACTIVATED = 0x00002000;
static final int FLAGS_CONTEXT_CLICKABLE = 0x00004000;
- static final int FLAGS_HAS_AUTO_FILL_ID = 0x80000000;
+ // TODO(b/33197203): auto-fill data is made of many fields and ideally we should verify
+ // one-by-one to optimize what's sent over, but there isn't enough flag bits for that, we'd
+ // need to create a 'flags2' or 'autoFillFlags' field and add these flags there.
+ // So, to keep thinkg simpler for now, let's just use on flag for all of them...
+ static final int FLAGS_HAS_AUTO_FILL_DATA = 0x80000000;
static final int FLAGS_HAS_MATRIX = 0x40000000;
static final int FLAGS_HAS_ALPHA = 0x20000000;
static final int FLAGS_HAS_ELEVATION = 0x10000000;
@@ -595,8 +609,9 @@ public class AssistStructure implements Parcelable {
}
}
}
- if ((flags&FLAGS_HAS_AUTO_FILL_ID) != 0) {
- mAutoFillId = in.readInt();
+ if ((flags&FLAGS_HAS_AUTO_FILL_DATA) != 0) {
+ mAutoFillId = in.readParcelable(null);
+ mAutoFillType = in.readParcelable(null);
}
if ((flags&FLAGS_HAS_LARGE_COORDS) != 0) {
mX = in.readInt();
@@ -653,8 +668,8 @@ public class AssistStructure implements Parcelable {
if (mId != View.NO_ID) {
flags |= FLAGS_HAS_ID;
}
- if (mAutoFillId != View.NO_ID) {
- flags |= FLAGS_HAS_AUTO_FILL_ID;
+ if (mAutoFillId != null) {
+ flags |= FLAGS_HAS_AUTO_FILL_DATA;
}
if ((mX&~0x7fff) != 0 || (mY&~0x7fff) != 0
|| (mWidth&~0x7fff) != 0 | (mHeight&~0x7fff) != 0) {
@@ -700,8 +715,9 @@ public class AssistStructure implements Parcelable {
}
}
}
- if ((flags&FLAGS_HAS_AUTO_FILL_ID) != 0) {
- out.writeInt(mAutoFillId);
+ if ((flags&FLAGS_HAS_AUTO_FILL_DATA) != 0) {
+ out.writeParcelable(mAutoFillId, 0);
+ out.writeParcelable(mAutoFillType, 0);
}
if ((flags&FLAGS_HAS_LARGE_COORDS) != 0) {
out.writeInt(mX);
@@ -773,16 +789,26 @@ public class AssistStructure implements Parcelable {
}
/**
- * Returns the id that can be used to auto-fill the view.
+ * Gets the id that can be used to auto-fill the view contents.
*
* <p>It's only set when the {@link AssistStructure} is used for auto-filling purposes, not
* for assist.
*/
- public int getAutoFillId() {
+ public AutoFillId getAutoFillId() {
return mAutoFillId;
}
/**
+ * Gets the the type of value that can be used to auto-fill the view contents.
+ *
+ * <p>It's only set when the {@link AssistStructure} is used for auto-filling purposes, not
+ * for assist.
+ */
+ public AutoFillType getAutoFillType() {
+ return mAutoFillType;
+ }
+
+ /**
* Returns the left edge of this view, in pixels, relative to the left edge of its parent.
*/
public int getLeft() {
@@ -1318,17 +1344,23 @@ public class AssistStructure implements Parcelable {
return mNode.mChildren != null ? mNode.mChildren.length : 0;
}
- @Override
- public ViewStructure newChild(int index) {
+ private void setAutoFillId(ViewNode child, boolean forAutoFill, int virtualId) {
+ if (forAutoFill) {
+ child.mAutoFillId = new AutoFillId(mNode.mAutoFillId, virtualId);
+ }
+ }
+
+ private ViewStructure newChild(int index, boolean forAutoFill, int virtualId) {
ViewNode node = new ViewNode();
+ setAutoFillId(node, forAutoFill, virtualId);
mNode.mChildren[index] = node;
return new ViewNodeBuilder(mAssist, node, false);
}
- @Override
- public ViewStructure asyncNewChild(int index) {
+ private ViewStructure asyncNewChild(int index, boolean forAutoFill, int virtualId) {
synchronized (mAssist) {
ViewNode node = new ViewNode();
+ setAutoFillId(node, forAutoFill, virtualId);
mNode.mChildren[index] = node;
ViewNodeBuilder builder = new ViewNodeBuilder(mAssist, node, true);
mAssist.mPendingAsyncChildren.add(builder);
@@ -1337,6 +1369,26 @@ public class AssistStructure implements Parcelable {
}
@Override
+ public ViewStructure newChild(int index) {
+ return newChild(index, false, 0);
+ }
+
+ @Override
+ public ViewStructure newChild(int index, int virtualId) {
+ return newChild(index, true, virtualId);
+ }
+
+ @Override
+ public ViewStructure asyncNewChild(int index) {
+ return asyncNewChild(index, false, 0);
+ }
+
+ @Override
+ public ViewStructure asyncNewChild(int index, int virtualId) {
+ return asyncNewChild(index, true, virtualId);
+ }
+
+ @Override
public void asyncCommit() {
synchronized (mAssist) {
if (!mAsync) {
@@ -1356,9 +1408,20 @@ public class AssistStructure implements Parcelable {
}
@Override
- public void setAutoFillId(int autoFillId) {
- mNode.mAutoFillId = autoFillId;
+ public void setAutoFillId(int viewId) {
+ mNode.mAutoFillId = new AutoFillId(viewId);
+ }
+
+ @Override
+ public AutoFillId getAutoFillId() {
+ return mNode.mAutoFillId;
}
+
+ @Override
+ public void setAutoFillType(AutoFillType type) {
+ mNode.mAutoFillType = type;
+ }
+
}
/** @hide */
diff --git a/core/java/android/app/usage/StorageSummary.aidl b/core/java/android/app/usage/ExternalStorageStats.aidl
index b20e025130e6..2d9375c1f9dc 100644
--- a/core/java/android/app/usage/StorageSummary.aidl
+++ b/core/java/android/app/usage/ExternalStorageStats.aidl
@@ -16,4 +16,4 @@
package android.app.usage;
-parcelable StorageSummary;
+parcelable ExternalStorageStats;
diff --git a/core/java/android/app/usage/ExternalStorageStats.java b/core/java/android/app/usage/ExternalStorageStats.java
new file mode 100644
index 000000000000..1166df06c917
--- /dev/null
+++ b/core/java/android/app/usage/ExternalStorageStats.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.usage;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.UserHandle;
+
+/**
+ * Shared/external storage statistics for a {@link UserHandle} on a single
+ * storage volume.
+ *
+ * @see StorageStatsManager
+ */
+public final class ExternalStorageStats implements Parcelable {
+ /** {@hide} */ public long totalBytes;
+ /** {@hide} */ public long audioBytes;
+ /** {@hide} */ public long videoBytes;
+ /** {@hide} */ public long imageBytes;
+
+ /**
+ * Return the total bytes used by all files in the shared/external storage
+ * hosted on this volume.
+ */
+ public long getTotalBytes() {
+ return totalBytes;
+ }
+
+ /**
+ * Return the total bytes used by audio files in the shared/external storage
+ * hosted on this volume.
+ */
+ public long getAudioBytes() {
+ return audioBytes;
+ }
+
+ /**
+ * Return the total bytes used by video files in the shared/external storage
+ * hosted on this volume.
+ */
+ public long getVideoBytes() {
+ return videoBytes;
+ }
+
+ /**
+ * Return the total bytes used by image files in the shared/external storage
+ * hosted on this volume.
+ */
+ public long getImageBytes() {
+ return imageBytes;
+ }
+
+ /** {@hide} */
+ public ExternalStorageStats() {
+ }
+
+ /** {@hide} */
+ public ExternalStorageStats(Parcel in) {
+ this.totalBytes = in.readLong();
+ this.audioBytes = in.readLong();
+ this.videoBytes = in.readLong();
+ this.imageBytes = in.readLong();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeLong(totalBytes);
+ dest.writeLong(audioBytes);
+ dest.writeLong(videoBytes);
+ dest.writeLong(imageBytes);
+ }
+
+ public static final Creator<ExternalStorageStats> CREATOR = new Creator<ExternalStorageStats>() {
+ @Override
+ public ExternalStorageStats createFromParcel(Parcel in) {
+ return new ExternalStorageStats(in);
+ }
+
+ @Override
+ public ExternalStorageStats[] newArray(int size) {
+ return new ExternalStorageStats[size];
+ }
+ };
+}
diff --git a/core/java/android/app/usage/IStorageStatsManager.aidl b/core/java/android/app/usage/IStorageStatsManager.aidl
index 96125a17b3a6..62ebf6085aba 100644
--- a/core/java/android/app/usage/IStorageStatsManager.aidl
+++ b/core/java/android/app/usage/IStorageStatsManager.aidl
@@ -17,10 +17,13 @@
package android.app.usage;
import android.app.usage.StorageStats;
-import android.app.usage.StorageSummary;
+import android.app.usage.ExternalStorageStats;
/** {@hide} */
interface IStorageStatsManager {
- StorageStats queryStats(String volumeUuid, int uid, String callingPackage);
- StorageSummary querySummary(String volumeUuid, String callingPackage);
+ long getTotalBytes(String volumeUuid, String callingPackage);
+ long getFreeBytes(String volumeUuid, String callingPackage);
+ StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage);
+ StorageStats queryStatsForUser(String volumeUuid, int userId, String callingPackage);
+ ExternalStorageStats queryExternalStatsForUser(String volumeUuid, int userId, String callingPackage);
}
diff --git a/core/java/android/app/usage/StorageStats.java b/core/java/android/app/usage/StorageStats.java
index b2486d8c6b23..b3104f6821e2 100644
--- a/core/java/android/app/usage/StorageStats.java
+++ b/core/java/android/app/usage/StorageStats.java
@@ -17,13 +17,13 @@
package android.app.usage;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.UserHandle;
/**
- * Storage statistics for a single UID on a single storage volume.
+ * Storage statistics for a UID or {@link UserHandle} on a single storage
+ * volume.
* <p class="note">
* Note: multiple packages using the same {@code sharedUserId} in their manifest
* will be merged into a single UID.
@@ -32,40 +32,13 @@ import android.os.Parcelable;
* @see StorageStatsManager
*/
public final class StorageStats implements Parcelable {
- /** {@hide} */ public final String volumeUuid;
- /** {@hide} */ public final int uid;
-
/** {@hide} */ public long codeBytes;
/** {@hide} */ public long dataBytes;
- /** {@hide} */ public long cacheQuotaBytes;
/** {@hide} */ public long cacheBytes;
/**
- * Return the UUID of the storage volume that these statistics refer to. The
- * value {@code null} indicates the default internal storage.
- */
- public String getVolumeUuid() {
- return volumeUuid;
- }
-
- /**
- * Return the UID that these statistics refer to.
- *
- * @see ApplicationInfo#uid
- * @see PackageManager#getPackagesForUid(int)
- */
- public int getUid() {
- return uid;
- }
-
- /**
- * Return the size of all code associated with {@link #getUid()} on
- * {@link #getVolumeUuid()}. This includes {@code APK} files and optimized
- * compiler output.
- * <p>
- * If the primary shared storage location is also hosted on
- * {@link #getVolumeUuid()} then this includes files stored under
- * {@link Context#getObbDir()}.
+ * Return the size of all code. This includes {@code APK} files and
+ * optimized compiler output.
* <p>
* Code is shared between all users on a multiuser device.
*/
@@ -74,16 +47,10 @@ public final class StorageStats implements Parcelable {
}
/**
- * Return the size of all data associated with {@link #getUid()} on
- * {@link #getVolumeUuid()}. This includes files stored under
+ * Return the size of all data. This includes files stored under
* {@link Context#getDataDir()}, {@link Context#getCacheDir()},
* {@link Context#getCodeCacheDir()}.
* <p>
- * If the primary shared storage location is also hosted on
- * {@link #getVolumeUuid()} then this includes files stored under
- * {@link Context#getExternalFilesDir(String)} and
- * {@link Context#getExternalCacheDir()}.
- * <p>
* Data is isolated for each user on a multiuser device.
*/
public long getDataBytes() {
@@ -91,26 +58,9 @@ public final class StorageStats implements Parcelable {
}
/**
- * Return the quota for cached data associated with {@link #getUid()} on
- * {@link #getVolumeUuid()}. This quota value is calculated based on how
- * frequently the user has interacted with the UID.
- * <p>
- * When clearing cached data, the system will first focus on packages whose
- * cached data is larger than their allocated quota.
- */
- public long getCacheQuotaBytes() {
- return cacheQuotaBytes;
- }
-
- /**
- * Return the size of all cached data associated with {@link #getUid()} on
- * {@link #getVolumeUuid()}. This includes files stored under
+ * Return the size of all cached data. This includes files stored under
* {@link Context#getCacheDir()} and {@link Context#getCodeCacheDir()}.
* <p>
- * If the primary shared storage location is also hosted on
- * {@link #getVolumeUuid()} then this includes files stored under
- * {@link Context#getExternalCacheDir()}.
- * <p>
* Cached data is isolated for each user on a multiuser device.
*/
public long getCacheBytes() {
@@ -118,18 +68,13 @@ public final class StorageStats implements Parcelable {
}
/** {@hide} */
- public StorageStats(String uuid, int uid) {
- this.volumeUuid = uuid;
- this.uid = uid;
+ public StorageStats() {
}
/** {@hide} */
public StorageStats(Parcel in) {
- this.volumeUuid = in.readString();
- this.uid = in.readInt();
this.codeBytes = in.readLong();
this.dataBytes = in.readLong();
- this.cacheQuotaBytes = in.readLong();
this.cacheBytes = in.readLong();
}
@@ -140,11 +85,8 @@ public final class StorageStats implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(volumeUuid);
- dest.writeInt(uid);
dest.writeLong(codeBytes);
dest.writeLong(dataBytes);
- dest.writeLong(cacheQuotaBytes);
dest.writeLong(cacheBytes);
}
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index cdfbe0c0b82f..695994b4eae3 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -19,9 +19,12 @@ package android.app.usage;
import android.annotation.WorkerThread;
import android.content.Context;
import android.os.RemoteException;
+import android.os.UserHandle;
import com.android.internal.util.Preconditions;
+import java.io.File;
+
/**
* Provides access to detailed storage statistics.
* <p class="note">
@@ -43,8 +46,52 @@ public class StorageStatsManager {
}
/**
- * Return detailed statistics for the a specific UID on the requested
- * storage volume.
+ * Return the total space on the requested storage volume.
+ * <p>
+ * To reduce end user confusion, this value is the total storage size
+ * advertised in a retail environment, which is typically larger than the
+ * actual writable partition total size.
+ * <p>
+ * This method may take several seconds to calculate the requested values,
+ * so it should only be called from a worker thread.
+ *
+ * @param volumeUuid the UUID of the storage volume you're interested in, or
+ * {@code null} to specify the default internal storage.
+ */
+ @WorkerThread
+ public long getTotalBytes(String volumeUuid) {
+ try {
+ return mService.getTotalBytes(volumeUuid, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Return the free space on the requested storage volume.
+ * <p>
+ * The free space is equivalent to {@link File#getFreeSpace()} plus the size
+ * of any cached data that can be automatically deleted by the system as
+ * additional space is needed.
+ * <p>
+ * This method may take several seconds to calculate the requested values,
+ * so it should only be called from a worker thread.
+ *
+ * @param volumeUuid the UUID of the storage volume you're interested in, or
+ * {@code null} to specify the default internal storage.
+ */
+ @WorkerThread
+ public long getFreeBytes(String volumeUuid) {
+ try {
+ return mService.getFreeBytes(volumeUuid, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Return storage statistics for a specific UID on the requested storage
+ * volume.
* <p>
* This method may take several seconds to calculate the requested values,
* so it should only be called from a worker thread.
@@ -56,25 +103,50 @@ public class StorageStatsManager {
@WorkerThread
public StorageStats queryStatsForUid(String volumeUuid, int uid) {
try {
- return mService.queryStats(volumeUuid, uid, mContext.getOpPackageName());
+ return mService.queryStatsForUid(volumeUuid, uid, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Return storage statistics for a specific {@link UserHandle} on the
+ * requested storage volume.
+ * <p>
+ * This method may take several seconds to calculate the requested values,
+ * so it should only be called from a worker thread.
+ *
+ * @param volumeUuid the UUID of the storage volume you're interested in, or
+ * {@code null} to specify the default internal storage.
+ * @param user the user you're interested in.
+ * @see android.os.Process#myUserHandle()
+ */
+ @WorkerThread
+ public StorageStats queryStatsForUser(String volumeUuid, UserHandle user) {
+ try {
+ return mService.queryStatsForUser(volumeUuid, user.getIdentifier(),
+ mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
- * Return summary statistics for the requested storage volume.
+ * Return shared/external storage statistics for a specific
+ * {@link UserHandle} on the requested storage volume.
* <p>
* This method may take several seconds to calculate the requested values,
* so it should only be called from a worker thread.
*
* @param volumeUuid the UUID of the storage volume you're interested in, or
* {@code null} to specify the default internal storage.
+ * @see android.os.Process#myUserHandle()
*/
@WorkerThread
- public StorageSummary querySummary(String volumeUuid) {
+ public ExternalStorageStats queryExternalStatsForUser(String volumeUuid, UserHandle user) {
try {
- return mService.querySummary(volumeUuid, mContext.getOpPackageName());
+ return mService.queryExternalStatsForUser(volumeUuid, user.getIdentifier(),
+ mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/usage/StorageSummary.java b/core/java/android/app/usage/StorageSummary.java
deleted file mode 100644
index e72c9ecd2e25..000000000000
--- a/core/java/android/app/usage/StorageSummary.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app.usage;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.io.File;
-
-/**
- * Storage summary for a single storage volume.
- * <p>
- * When presenting this summary to users, the
- * <p>
- * Details for specific UIDs are available through {@link StorageStats}.
- *
- * @see StorageStatsManager
- */
-public final class StorageSummary implements Parcelable {
- /** {@hide} */ public final String volumeUuid;
-
- /** {@hide} */ public long totalBytes;
- /** {@hide} */ public long freeBytes;
-
- /** {@hide} */ public long sharedTotalBytes;
- /** {@hide} */ public long sharedAudioBytes;
- /** {@hide} */ public long sharedVideoBytes;
- /** {@hide} */ public long sharedImagesBytes;
-
- /**
- * Return the UUID of the storage volume that these statistics refer to. The
- * value {@code null} indicates the default internal storage.
- */
- public String getVolumeUuid() {
- return volumeUuid;
- }
-
- /**
- * Return the total size of the storage volume.
- * <p>
- * To reduce end user confusion, this value is the total storage size
- * advertised in a retail environment, which is typically larger than the
- * actual writable partition total size.
- */
- public long getTotalBytes() {
- return totalBytes;
- }
-
- /**
- * Return the free space on this storage volume.
- * <p>
- * The free space is equivalent to {@link File#getFreeSpace()} plus the size
- * of any cached data that can be automatically deleted by the system as
- * additional space is needed.
- */
- public long getFreeBytes() {
- return freeBytes;
- }
-
- /**
- * Return the total bytes used by all files in the shared storage hosted on
- * this volume.
- *
- * @return total bytes, or {@code -1} if no shared storage is hosted on this
- * volume.
- */
- public long getSharedTotalBytes() {
- return sharedTotalBytes;
- }
-
- /**
- * Return the total bytes used by audio files in the shared storage hosted
- * on this volume.
- *
- * @return total bytes, or {@code -1} if no shared storage is hosted on this
- * volume.
- */
- public long getSharedAudioBytes() {
- return sharedAudioBytes;
- }
-
- /**
- * Return the total bytes used by video files in the shared storage hosted
- * on this volume.
- *
- * @return total bytes, or {@code -1} if no shared storage is hosted on this
- * volume.
- */
- public long getSharedVideoBytes() {
- return sharedVideoBytes;
- }
-
- /**
- * Return the total bytes used by image files in the shared storage hosted
- * on this volume.
- *
- * @return total bytes, or {@code -1} if no shared storage is hosted on this
- * volume.
- */
- public long getSharedImagesBytes() {
- return sharedImagesBytes;
- }
-
- /** {@hide} */
- public StorageSummary(String uuid) {
- this.volumeUuid = uuid;
- }
-
- /** {@hide} */
- public StorageSummary(Parcel in) {
- this.volumeUuid = in.readString();
- this.totalBytes = in.readLong();
- this.freeBytes = in.readLong();
- this.sharedTotalBytes = in.readLong();
- this.sharedAudioBytes = in.readLong();
- this.sharedVideoBytes = in.readLong();
- this.sharedImagesBytes = in.readLong();
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(volumeUuid);
- dest.writeLong(totalBytes);
- dest.writeLong(freeBytes);
- dest.writeLong(sharedTotalBytes);
- dest.writeLong(sharedAudioBytes);
- dest.writeLong(sharedVideoBytes);
- dest.writeLong(sharedImagesBytes);
- }
-
- public static final Creator<StorageSummary> CREATOR = new Creator<StorageSummary>() {
- @Override
- public StorageSummary createFromParcel(Parcel in) {
- return new StorageSummary(in);
- }
-
- @Override
- public StorageSummary[] newArray(int size) {
- return new StorageSummary[size];
- }
- };
-}
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index 4c8360f6c345..ef3b1c50ffd3 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -347,11 +347,11 @@ public class AppWidgetHostView extends FrameLayout {
}
/**
- * Sets an executor which can be used for asynchronously inflating and applying the remoteviews.
- * @see {@link RemoteViews#applyAsync(Context, ViewGroup, RemoteViews.OnViewAppliedListener, Executor)}
+ * Sets an executor which can be used for asynchronously inflating. CPU intensive tasks like
+ * view inflation or loading images will be performed on the executor. The updates will still
+ * be applied on the UI thread.
*
* @param executor the executor to use or null.
- * @hide
*/
public void setAsyncExecutor(Executor executor) {
if (mLastExecutionSignal != null) {
diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java
index b68693880acf..98a5341b3025 100644
--- a/core/java/android/bluetooth/BluetoothSocket.java
+++ b/core/java/android/bluetooth/BluetoothSocket.java
@@ -243,7 +243,7 @@ public final class BluetoothSocket implements Closeable {
}
as.mPfd = new ParcelFileDescriptor(fds[0]);
- as.mSocket = new LocalSocket(fds[0]);
+ as.mSocket = LocalSocket.createConnectedLocalSocket(fds[0]);
as.mSocketIS = as.mSocket.getInputStream();
as.mSocketOS = as.mSocket.getOutputStream();
as.mAddress = RemoteAddr;
@@ -367,7 +367,7 @@ public final class BluetoothSocket implements Closeable {
if (mSocketState == SocketState.CLOSED) throw new IOException("socket closed");
if (mPfd == null) throw new IOException("bt socket connect failed");
FileDescriptor fd = mPfd.getFileDescriptor();
- mSocket = new LocalSocket(fd);
+ mSocket = LocalSocket.createConnectedLocalSocket(fd);
mSocketIS = mSocket.getInputStream();
mSocketOS = mSocket.getOutputStream();
}
@@ -416,9 +416,9 @@ public final class BluetoothSocket implements Closeable {
if(mSocketState != SocketState.INIT) return EBADFD;
if(mPfd == null) return -1;
FileDescriptor fd = mPfd.getFileDescriptor();
- if (DBG) Log.d(TAG, "bindListen(), new LocalSocket ");
- mSocket = new LocalSocket(fd);
- if (DBG) Log.d(TAG, "bindListen(), new LocalSocket.getInputStream() ");
+ if (DBG) Log.d(TAG, "bindListen(), Create LocalSocket");
+ mSocket = LocalSocket.createConnectedLocalSocket(fd);
+ if (DBG) Log.d(TAG, "bindListen(), new LocalSocket.getInputStream()");
mSocketIS = mSocket.getInputStream();
mSocketOS = mSocket.getOutputStream();
}
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index 13ba6cc37d22..aea125835748 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -167,6 +167,8 @@ public abstract class DisplayManagerInternal {
public static final int POLICY_DIM = 2;
// Policy: Make the screen bright as usual.
public static final int POLICY_BRIGHT = 3;
+ // Policy: Keep the screen and display optimized for VR mode.
+ public static final int POLICY_VR = 4;
// The basic overall policy to apply: off, doze, dim or bright.
public int policy;
@@ -233,6 +235,10 @@ public abstract class DisplayManagerInternal {
return policy == POLICY_BRIGHT || policy == POLICY_DIM;
}
+ public boolean isVr() {
+ return policy == POLICY_VR;
+ }
+
public void copyFrom(DisplayPowerRequest other) {
policy = other.policy;
useProximitySensor = other.useProximitySensor;
@@ -301,6 +307,8 @@ public abstract class DisplayManagerInternal {
return "DIM";
case POLICY_BRIGHT:
return "BRIGHT";
+ case POLICY_VR:
+ return "VR";
default:
return Integer.toString(policy);
}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index d1d5f40739db..ac0c0dc5a916 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -1163,6 +1163,7 @@ public class ConnectivityManager {
* {@link #requestNetwork(NetworkRequest, NetworkCallback)} API.
* In {@link VERSION_CODES#M}, and above, this method is unsupported and will
* throw {@code UnsupportedOperationException} if called.
+ * @removed
*/
@Deprecated
public int startUsingNetworkFeature(int networkType, String feature) {
@@ -1219,6 +1220,7 @@ public class ConnectivityManager {
* {@link #unregisterNetworkCallback(NetworkCallback)} API.
* In {@link VERSION_CODES#M}, and above, this method is unsupported and will
* throw {@code UnsupportedOperationException} if called.
+ * @removed
*/
@Deprecated
public int stopUsingNetworkFeature(int networkType, String feature) {
@@ -1633,6 +1635,7 @@ public class ConnectivityManager {
* {@link #bindProcessToNetwork} and {@link Network#getSocketFactory} API.
* In {@link VERSION_CODES#M}, and above, this method is unsupported and will
* throw {@code UnsupportedOperationException} if called.
+ * @removed
*/
@Deprecated
public boolean requestRouteToHost(int networkType, int hostAddress) {
diff --git a/core/java/android/net/INetworkScoreService.aidl b/core/java/android/net/INetworkScoreService.aidl
index 932f03116f15..9573953e6e13 100644
--- a/core/java/android/net/INetworkScoreService.aidl
+++ b/core/java/android/net/INetworkScoreService.aidl
@@ -100,4 +100,21 @@ interface INetworkScoreService
* @hide
*/
boolean requestScores(in NetworkKey[] networks);
+
+ /**
+ * Determine whether the application with the given UID is the enabled scorer.
+ *
+ * @param callingUid the UID to check
+ * @return true if the provided UID is the active scorer, false otherwise.
+ * @hide
+ */
+ boolean isCallerActiveScorer(int callingUid);
+
+ /**
+ * Obtain the package name of the current active network scorer.
+ *
+ * @return the full package name of the current active scorer, or null if there is no active
+ * scorer.
+ */
+ String getActiveScorerPackage();
}
diff --git a/core/java/android/net/LocalServerSocket.java b/core/java/android/net/LocalServerSocket.java
index e1eaf00d0f20..3fcde33071e9 100644
--- a/core/java/android/net/LocalServerSocket.java
+++ b/core/java/android/net/LocalServerSocket.java
@@ -89,7 +89,7 @@ public class LocalServerSocket {
impl.accept(acceptedImpl);
- return LocalSocket.createLocalSocketForAccept(acceptedImpl, LocalSocket.SOCKET_UNKNOWN);
+ return LocalSocket.createLocalSocketForAccept(acceptedImpl);
}
/**
diff --git a/core/java/android/net/LocalSocket.java b/core/java/android/net/LocalSocket.java
index d9ad74beb016..8afa1ed3e4a5 100644
--- a/core/java/android/net/LocalSocket.java
+++ b/core/java/android/net/LocalSocket.java
@@ -31,6 +31,7 @@ import java.net.SocketOptions;
public class LocalSocket implements Closeable {
private final LocalSocketImpl impl;
+ /** false if impl.create() needs to be called */
private volatile boolean implCreated;
private LocalSocketAddress localAddress;
private boolean isBound;
@@ -61,19 +62,6 @@ public class LocalSocket implements Closeable {
*/
public LocalSocket(int sockType) {
this(new LocalSocketImpl(), sockType);
- isBound = false;
- isConnected = false;
- }
-
- /**
- * Creates a AF_LOCAL/UNIX domain stream socket with FileDescriptor.
- * @hide
- */
- public LocalSocket(FileDescriptor fd) throws IOException {
- this(new LocalSocketImpl(fd), SOCKET_UNKNOWN);
- isBound = true;
- isConnected = true;
- implCreated = true;
}
private LocalSocket(LocalSocketImpl impl, int sockType) {
@@ -84,9 +72,27 @@ public class LocalSocket implements Closeable {
}
/**
+ * Creates a LocalSocket instances using the FileDescriptor for an already-connected
+ * AF_LOCAL/UNIX domain stream socket. Note: the FileDescriptor must be closed by the caller:
+ * closing the LocalSocket will not close it.
+ *
+ * @hide - used by BluetoothSocket.
+ */
+ public static LocalSocket createConnectedLocalSocket(FileDescriptor fd) {
+ return createConnectedLocalSocket(new LocalSocketImpl(fd), SOCKET_UNKNOWN);
+ }
+
+ /**
* for use with LocalServerSocket.accept()
*/
- static LocalSocket createLocalSocketForAccept(LocalSocketImpl impl, int sockType) {
+ static LocalSocket createLocalSocketForAccept(LocalSocketImpl impl) {
+ return createConnectedLocalSocket(impl, SOCKET_UNKNOWN);
+ }
+
+ /**
+ * Creates a LocalSocket from an existing LocalSocketImpl that is already connected.
+ */
+ private static LocalSocket createConnectedLocalSocket(LocalSocketImpl impl, int sockType) {
LocalSocket socket = new LocalSocket(impl, sockType);
socket.isConnected = true;
socket.isBound = true;
diff --git a/core/java/android/net/LocalSocketImpl.java b/core/java/android/net/LocalSocketImpl.java
index d8f782115cf8..05c8afb358b0 100644
--- a/core/java/android/net/LocalSocketImpl.java
+++ b/core/java/android/net/LocalSocketImpl.java
@@ -218,7 +218,7 @@ class LocalSocketImpl
*
* @param fd non-null; bound file descriptor
*/
- /*package*/ LocalSocketImpl(FileDescriptor fd) throws IOException
+ /*package*/ LocalSocketImpl(FileDescriptor fd)
{
this.fd = fd;
}
diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java
index 717ac70ab430..2870dd6c5778 100644
--- a/core/java/android/net/NetworkScoreManager.java
+++ b/core/java/android/net/NetworkScoreManager.java
@@ -168,11 +168,11 @@ public class NetworkScoreManager {
* scorer.
*/
public String getActiveScorerPackage() {
- NetworkScorerAppData app = new NetworkScorerAppManager(mContext).getActiveScorer();
- if (app == null) {
- return null;
+ try {
+ return mService.getActiveScorerPackage();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
}
- return app.packageName;
}
/**
@@ -339,4 +339,19 @@ public class NetworkScoreManager {
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Determine whether the application with the given UID is the enabled scorer.
+ *
+ * @param callingUid the UID to check
+ * @return true if the provided UID is the active scorer, false otherwise.
+ * @hide
+ */
+ public boolean isCallerActiveScorer(int callingUid) {
+ try {
+ return mService.isCallerActiveScorer(callingUid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/net/NetworkScorerAppManager.java b/core/java/android/net/NetworkScorerAppManager.java
index ec0bb25d28eb..23d5af55641c 100644
--- a/core/java/android/net/NetworkScorerAppManager.java
+++ b/core/java/android/net/NetworkScorerAppManager.java
@@ -16,7 +16,6 @@
package android.net;
-import android.Manifest;
import android.Manifest.permission;
import android.annotation.Nullable;
import android.content.ContentResolver;
@@ -28,7 +27,9 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
+
import com.android.internal.R;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -226,6 +227,7 @@ public class NetworkScorerAppManager {
}
/** Determine whether the application with the given UID is the enabled scorer. */
+ @Deprecated // Use NetworkScoreManager.isCallerActiveScorer()
public boolean isCallerActiveScorer(int callingUid) {
NetworkScorerAppData defaultApp = getActiveScorer();
if (defaultApp == null) {
diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl
index d443b66af77c..9513854c1e29 100644
--- a/core/java/android/os/IUserManager.aidl
+++ b/core/java/android/os/IUserManager.aidl
@@ -40,6 +40,7 @@ interface IUserManager {
in String[] disallowedPackages);
UserInfo createRestrictedProfile(String name, int parentUserHandle);
void setUserEnabled(int userHandle);
+ void evictCredentialEncryptionKey(int userHandle);
boolean removeUser(int userHandle);
void setUserName(int userHandle, String name);
void setUserIcon(int userHandle, in Bitmap icon);
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 9d04929b2c8f..dff0a287e25c 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -49,23 +49,23 @@ import android.util.Log;
* <i>These levels are mutually exclusive - you may only specify one of them.</i>
*
* <table>
- * <tr><th>Flag Value</th>
+ * <tr><th>Flag Value</th>
* <th>CPU</th> <th>Screen</th> <th>Keyboard</th></tr>
*
* <tr><td>{@link #PARTIAL_WAKE_LOCK}</td>
- * <td>On*</td> <td>Off</td> <td>Off</td>
+ * <td>On*</td> <td>Off</td> <td>Off</td>
* </tr>
- *
+ *
* <tr><td>{@link #SCREEN_DIM_WAKE_LOCK}</td>
- * <td>On</td> <td>Dim</td> <td>Off</td>
+ * <td>On</td> <td>Dim</td> <td>Off</td>
* </tr>
*
* <tr><td>{@link #SCREEN_BRIGHT_WAKE_LOCK}</td>
- * <td>On</td> <td>Bright</td> <td>Off</td>
+ * <td>On</td> <td>Bright</td> <td>Off</td>
* </tr>
- *
+ *
* <tr><td>{@link #FULL_WAKE_LOCK}</td>
- * <td>On</td> <td>Bright</td> <td>Bright</td>
+ * <td>On</td> <td>Bright</td> <td>Bright</td>
* </tr>
* </table>
* </p><p>
@@ -85,13 +85,13 @@ import android.util.Log;
* the illumination to remain on once it turns on (e.g. from user activity). This flag
* will force the screen and/or keyboard to turn on immediately, when the WakeLock is
* acquired. A typical use would be for notifications which are important for the user to
- * see immediately.</td>
+ * see immediately.</td>
* </tr>
- *
+ *
* <tr><td>{@link #ON_AFTER_RELEASE}</td>
* <td>If this flag is set, the user activity timer will be reset when the WakeLock is
- * released, causing the illumination to remain on a bit longer. This can be used to
- * reduce flicker if you are cycling between wake lock conditions.</td>
+ * released, causing the illumination to remain on a bit longer. This can be used to
+ * reduce flicker if you are cycling between wake lock conditions.</td>
* </tr>
* </table>
* <p>
@@ -479,6 +479,35 @@ public final class PowerManager {
}
/**
+ * Gets the minimum supported screen brightness setting for VR Mode.
+ * @hide
+ */
+ public int getMinimumScreenBrightnessForVrSetting() {
+ return mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_screenBrightnessForVrSettingMinimum);
+ }
+
+ /**
+ * Gets the maximum supported screen brightness setting for VR Mode.
+ * The screen may be allowed to become dimmer than this value but
+ * this is the maximum value that can be set by the user.
+ * @hide
+ */
+ public int getMaximumScreenBrightnessForVrSetting() {
+ return mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_screenBrightnessForVrSettingMaximum);
+ }
+
+ /**
+ * Gets the default screen brightness for VR setting.
+ * @hide
+ */
+ public int getDefaultScreenBrightnessForVrSetting() {
+ return mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_screenBrightnessForVrSettingDefault);
+ }
+
+ /**
* Returns true if the twilight service should be used to adjust screen brightness
* policy. This setting is experimental and disabled by default.
* @hide
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 802b1804c71d..3478eaa83982 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1641,6 +1641,19 @@ public class UserManager {
}
/**
+ * Evicts the user's credential encryption key from memory by stopping and restarting the user.
+ *
+ * @hide
+ */
+ public void evictCredentialEncryptionKey(@UserIdInt int userHandle) {
+ try {
+ mService.evictCredentialEncryptionKey(userHandle);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Return the number of users currently created on the device.
*/
public int getUserCount() {
diff --git a/core/java/android/provider/AlarmClock.java b/core/java/android/provider/AlarmClock.java
index 63ae9a96c8a6..23134cd0fef7 100644
--- a/core/java/android/provider/AlarmClock.java
+++ b/core/java/android/provider/AlarmClock.java
@@ -153,6 +153,15 @@ public final class AlarmClock {
public static final String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
/**
+ * Activity Action: Show the timers.
+ * <p>
+ * This action opens the timers page.
+ * </p>
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_SHOW_TIMERS = "android.intent.action.SHOW_TIMERS";
+
+ /**
* Activity Action: Show the alarms.
* <p>
* This action opens the alarms page.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index cede9eb5e675..2d4a9e93af7e 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2889,6 +2889,15 @@ public final class Settings {
new InclusiveIntegerRangeValidator(0, 255);
/**
+ * The screen backlight brightness between 0 and 255.
+ * @hide
+ */
+ public static final String SCREEN_BRIGHTNESS_FOR_VR = "screen_brightness_for_vr";
+
+ private static final Validator SCREEN_BRIGHTNESS_FOR_VR_VALIDATOR =
+ new InclusiveIntegerRangeValidator(0, 255);
+
+ /**
* Control whether to enable automatic brightness mode.
*/
public static final String SCREEN_BRIGHTNESS_MODE = "screen_brightness_mode";
@@ -3882,6 +3891,7 @@ public final class Settings {
VALIDATORS.put(DIM_SCREEN, DIM_SCREEN_VALIDATOR);
VALIDATORS.put(SCREEN_OFF_TIMEOUT, SCREEN_OFF_TIMEOUT_VALIDATOR);
VALIDATORS.put(SCREEN_BRIGHTNESS, SCREEN_BRIGHTNESS_VALIDATOR);
+ VALIDATORS.put(SCREEN_BRIGHTNESS_FOR_VR, SCREEN_BRIGHTNESS_FOR_VR_VALIDATOR);
VALIDATORS.put(SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_VALIDATOR);
VALIDATORS.put(MODE_RINGER_STREAMS_AFFECTED, MODE_RINGER_STREAMS_AFFECTED_VALIDATOR);
VALIDATORS.put(MUTE_STREAMS_AFFECTED, MUTE_STREAMS_AFFECTED_VALIDATOR);
diff --git a/core/java/android/service/autofill/AutoFillService.java b/core/java/android/service/autofill/AutoFillService.java
index a7941c7ebeeb..c2e980c5c277 100644
--- a/core/java/android/service/autofill/AutoFillService.java
+++ b/core/java/android/service/autofill/AutoFillService.java
@@ -17,8 +17,8 @@ package android.service.autofill;
import static android.service.voice.VoiceInteractionSession.KEY_FLAGS;
import static android.service.voice.VoiceInteractionSession.KEY_STRUCTURE;
-import static android.view.View.ASSIST_FLAG_SANITIZED_TEXT;
-import static android.view.View.ASSIST_FLAG_NON_SANITIZED_TEXT;
+import static android.view.View.AUTO_FILL_FLAG_TYPE_FILL;
+import static android.view.View.AUTO_FILL_FLAG_TYPE_SAVE;
import android.annotation.SdkConstant;
import android.app.Activity;
@@ -32,12 +32,15 @@ import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
+import android.view.autofill.AutoFillId;
+import android.view.autofill.FillResponse;
import com.android.internal.os.HandlerCaller;
import com.android.internal.os.IResultReceiver;
import com.android.internal.os.SomeArgs;
-// TODO(b/33197203): improve javadoc (class and methods)
+// TODO(b/33197203): improve javadoc (of both class and methods); in particular, make sure the
+// life-cycle (and how state could be maintained on server-side) is well documented.
/**
* Top-level service of the current auto-fill service for a given user.
@@ -58,40 +61,50 @@ public abstract class AutoFillService extends Service {
@SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
public static final String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
- // Bundle keys.
- /** @hide */
- public static final String KEY_CALLBACK = "callback";
+ // Internal bundle keys.
+ /** @hide */ public static final String KEY_CALLBACK = "callback";
+ /** @hide */ public static final String KEY_SAVABLE_IDS = "savable_ids";
+
+ // Prefix for public bundle keys.
+ private static final String KEY_PREFIX = "android.service.autofill.extra.";
+
+ /**
+ * Key of the {@link Bundle} passed to methods such as
+ * {@link #onSaveRequest(AssistStructure, Bundle, CancellationSignal, SaveCallback)}
+ * containing the extras set by
+ * {@link android.view.autofill.FillResponse.Builder#setExtras(Bundle)}.
+ */
+ public static final String EXTRA_RESPONSE_EXTRAS = KEY_PREFIX + "RESPONSE_EXTRAS";
+
+ /**
+ * Key of the {@link Bundle} passed to methods such as
+ * {@link #onSaveRequest(AssistStructure, Bundle, CancellationSignal, SaveCallback)}
+ * containing the extras set by
+ * {@link android.view.autofill.Dataset.Builder#setExtras(Bundle)}.
+ */
+ public static final String EXTRA_DATASET_EXTRAS = KEY_PREFIX + "DATASET_EXTRAS";
// Handler messages.
private static final int MSG_CONNECT = 1;
private static final int MSG_AUTO_FILL_ACTIVITY = 2;
private static final int MSG_DISCONNECT = 3;
- private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() {
- @Override
- public void send(int resultCode, Bundle resultData) throws RemoteException {
- final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE);
- final IBinder binder = resultData.getBinder(KEY_CALLBACK);
- final int flags = resultData.getInt(KEY_FLAGS, 0);
+ private final IAutoFillService mInterface = new IAutoFillService.Stub() {
+ @Override
+ public void autoFill(AssistStructure structure, IAutoFillServerCallback callback,
+ Bundle extras, int flags) {
mHandlerCaller
- .obtainMessageIOO(MSG_AUTO_FILL_ACTIVITY, flags, structure, binder).sendToTarget();
+ .obtainMessageIOOO(MSG_AUTO_FILL_ACTIVITY, flags, structure, extras, callback)
+ .sendToTarget();
}
- };
-
- private final IAutoFillService mInterface = new IAutoFillService.Stub() {
@Override
public void onConnected() {
mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CONNECT));
}
@Override
- public IResultReceiver getAssistReceiver() {
- return mAssistReceiver;
- }
-
- @Override
public void onDisconnected() {
mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DISCONNECT));
}
@@ -107,10 +120,11 @@ public abstract class AutoFillService extends Service {
break;
} case MSG_AUTO_FILL_ACTIVITY: {
final SomeArgs args = (SomeArgs) msg.obj;
- final AssistStructure structure = (AssistStructure) args.arg1;
- final IBinder binder = (IBinder) args.arg2;
final int flags = msg.arg1;
- requestAutoFill(structure, flags, binder);
+ final AssistStructure structure = (AssistStructure) args.arg1;
+ final Bundle extras = (Bundle) args.arg2;
+ final IAutoFillServerCallback callback = (IAutoFillServerCallback) args.arg3;
+ requestAutoFill(callback, structure, extras, flags);
break;
} case MSG_DISCONNECT: {
onDisconnected();
@@ -146,7 +160,7 @@ public abstract class AutoFillService extends Service {
}
/**
- * Called when the Android System connects to service.
+ * Called when the Android system connects to service.
*
* <p>You should generally do initialization here rather than in {@link #onCreate}.
*/
@@ -155,12 +169,19 @@ public abstract class AutoFillService extends Service {
}
/**
- * Called when user requests service to auto-fill an {@link Activity}.
+ * Called by the Android system do decide if an {@link Activity} can be auto-filled by the
+ * service.
+ *
+ * <p>Service must call one of the {@link FillCallback} methods (like
+ * {@link FillCallback#onSuccess(FillResponse)} or {@link FillCallback#onFailure(CharSequence)})
+ * to notify the result of the request.
*
- * @param structure {@link Activity}'s view structure .
- * @param data bundle with optional parameters (currently none) which is passed along on
- * subsequent calls (so it can be used by the service to share data).
+ * @param structure {@link Activity}'s view structure.
+ * @param data bundle containing additional arguments set by the Android system (currently none)
+ * or data passed by the service on previous calls to fullfill other sections of this activity
+ * (see {@link FillResponse} Javadoc for examples of multiple-sections requests).
* @param cancellationSignal signal for observing cancel requests.
+ * @param callback object used to notify the result of the request.
*/
public abstract void onFillRequest(AssistStructure structure,
Bundle data, CancellationSignal cancellationSignal, FillCallback callback);
@@ -168,29 +189,31 @@ public abstract class AutoFillService extends Service {
/**
* Called when user requests service to save the fields of an {@link Activity}.
*
+ * <p>Service must call one of the {@link SaveCallback} methods (like
+ * {@link SaveCallback#onSuccess(AutoFillId[])} or {@link SaveCallback#onFailure(CharSequence)})
+ * to notify the result of the request.
+ *
* @param structure {@link Activity}'s view structure.
- * @param data same bundle passed to
- * {@link #onFillRequest(AssistStructure, Bundle, CancellationSignal, FillCallback)};
- * might also contain with optional parameters (currently none).
+ * @param data bundle containing additional arguments set by the Android system (currently none)
+ * or data passed by the service in the {@link FillResponse} that originated this call.
* @param cancellationSignal signal for observing cancel requests.
* @param callback object used to notify the result of the request.
*/
public abstract void onSaveRequest(AssistStructure structure,
Bundle data, CancellationSignal cancellationSignal, SaveCallback callback);
- private void requestAutoFill(AssistStructure structure, int flags, IBinder binder) {
- // TODO(b/33197203): pass the Bundle received from mAssistReceiver instead?
- final Bundle data = new Bundle();
+ private void requestAutoFill(IAutoFillServerCallback callback, AssistStructure structure,
+ Bundle data, int flags) {
switch (flags) {
- case ASSIST_FLAG_SANITIZED_TEXT:
- final FillCallback fillCallback = new FillCallback(binder);
+ case AUTO_FILL_FLAG_TYPE_FILL:
+ final FillCallback fillCallback = new FillCallback(callback);
// TODO(b/33197203): hook up the cancelationSignal
onFillRequest(structure, data, new CancellationSignal(), fillCallback);
break;
- case ASSIST_FLAG_NON_SANITIZED_TEXT:
- final SaveCallback saveCallback = new SaveCallback(binder);
+ case AUTO_FILL_FLAG_TYPE_SAVE:
+ final SaveCallback saveCallback = new SaveCallback(callback);
// TODO(b/33197203): hook up the cancelationSignal
- onSaveRequest(structure, null, new CancellationSignal(), saveCallback);
+ onSaveRequest(structure, data, new CancellationSignal(), saveCallback);
break;
default:
Log.w(TAG, "invalid flag on requestAutoFill(): " + flags);
@@ -198,7 +221,7 @@ public abstract class AutoFillService extends Service {
}
/**
- * Called when the Android System disconnects from the service.
+ * Called when the Android system disconnects from the service.
*
* <p> At this point this service may no longer be an active {@link AutoFillService}.
*/
diff --git a/core/java/android/service/autofill/FillCallback.java b/core/java/android/service/autofill/FillCallback.java
index 3284b90304f5..5a9a9f68486c 100644
--- a/core/java/android/service/autofill/FillCallback.java
+++ b/core/java/android/service/autofill/FillCallback.java
@@ -18,19 +18,16 @@ package android.service.autofill;
import static android.service.autofill.AutoFillService.DEBUG;
+import android.annotation.Nullable;
import android.app.Activity;
-import android.app.assist.AssistStructure.ViewNode;
+import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
-import android.util.SparseArray;
+import android.view.autofill.FillResponse;
import com.android.internal.util.Preconditions;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
/**
* Handles auto-fill requests from the {@link AutoFillService} into the {@link Activity} being
* auto-filled.
@@ -39,40 +36,50 @@ public final class FillCallback {
private static final String TAG = "FillCallback";
- private final IAutoFillCallback mCallback;
+ private final IAutoFillServerCallback mCallback;
+
+ private boolean mReplied = false;
/** @hide */
- FillCallback(IBinder binder) {
- mCallback = IAutoFillCallback.Stub.asInterface(binder);
+ FillCallback(IAutoFillServerCallback callback) {
+ mCallback = callback;
}
/**
- * Auto-fills the {@link Activity}.
+ * Notifies the Android System that an
+ * {@link AutoFillService#onFillRequest(android.app.assist.AssistStructure, Bundle, android.os.CancellationSignal, FillCallback)}
+ * was successfully fulfilled by the service.
*
- * @throws RuntimeException if an error occurred while auto-filling it.
+ * @param response auto-fill information for that activity, or {@code null} when the activity
+ * cannot be auto-filled (for example, if it only contains read-only fields).
+ *
+ * @throws RuntimeException if an error occurred while calling the Android System.
*/
- public void onSuccess(FillData data) {
- if (DEBUG) Log.d(TAG, "onSuccess(): data=" + data);
+ public void onSuccess(@Nullable FillResponse response) {
+ if (DEBUG) Log.d(TAG, "onSuccess(): respose=" + response);
- Preconditions.checkArgument(data != null, "data cannot be null");
+ checkNotRepliedYet();
try {
- mCallback.autofill(data.asList());
+ mCallback.showResponse(response);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
}
/**
- * Notifies the {@link Activity} that the auto-fill request failed.
+ * Notifies the Android System that an
+ * {@link AutoFillService#onFillRequest(android.app.assist.AssistStructure, Bundle, android.os.CancellationSignal, FillCallback)}
+ * could not be fulfilled by the service.
*
- * @param message error message to be displayed.
+ * @param message error message to be displayed to the user.
*
- * @throws RuntimeException if an error occurred while notifying the activity.
+ * @throws RuntimeException if an error occurred while calling the Android System.
*/
public void onFailure(CharSequence message) {
if (DEBUG) Log.d(TAG, "onFailure(): message=" + message);
+ checkNotRepliedYet();
Preconditions.checkArgument(message != null, "message cannot be null");
try {
@@ -82,70 +89,9 @@ public final class FillCallback {
}
}
- /**
- * Data used to fill the fields of an {@link Activity}.
- *
- * <p>This class is immutable.
- */
- public static final class FillData {
-
- private final List<FillableInputField> mList;
-
- private FillData(Builder builder) {
- final int size = builder.mFields.size();
- final List<FillableInputField> list = new ArrayList<>(size);
- for (int i = 0; i < size; i++) {
- list.add(builder.mFields.valueAt(i));
- }
- mList = Collections.unmodifiableList(list);
- // TODO: use FastImmutableArraySet or a similar structure instead?
- }
-
- /**
- * Gets the response as a {@code List} so it can be used in a binder call.
- */
- List<FillableInputField> asList() {
- return mList;
- }
-
- @Override
- public String toString() {
- return "[AutoFillResponse: " + mList + "]";
- }
-
- /**
- * Builder for {@link FillData} objects.
- *
- * <p>Typical usage:
- *
- * <pre class="prettyprint">
- * FillCallback.FillData data = new FillCallback.FillData.Builder()
- * .setTextField(id1, "value 1")
- * .setTextField(id2, "value 2")
- * .build()
- * </pre>
- */
- public static class Builder {
- private final SparseArray<FillableInputField> mFields = new SparseArray<>();
-
- /**
- * Auto-fills a text field.
- *
- * @param id view id as returned by {@link ViewNode#getAutoFillId()}.
- * @param text text to be auto-filled.
- * @return same builder so it can be chained.
- */
- public Builder setTextField(int id, String text) {
- mFields.put(id, FillableInputField.forText(id, text));
- return this;
- }
-
- /**
- * Builds a new {@link FillData} instance.
- */
- public FillData build() {
- return new FillData(this);
- }
- }
+ // There can be only one!!
+ private void checkNotRepliedYet() {
+ Preconditions.checkState(!mReplied, "already replied");
+ mReplied = true;
}
}
diff --git a/core/java/android/service/autofill/FillableInputField.java b/core/java/android/service/autofill/FillableInputField.java
deleted file mode 100644
index 62950b40e5e1..000000000000
--- a/core/java/android/service/autofill/FillableInputField.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.service.autofill;
-
-import android.app.assist.AssistStructure.ViewNode;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * Represents a view field that can be auto-filled.
- *
- * <p>Currently only text-fields are supported, so the value of the field can be obtained through
- * {@link #getValue()}.
- *
- * @hide
- */
-public final class FillableInputField implements Parcelable {
-
- private final int mId;
- private final String mValue;
-
- private FillableInputField(int id, String value) {
- mId = id;
- mValue = value;
- }
-
- private FillableInputField(Parcel parcel) {
- mId = parcel.readInt();
- mValue = parcel.readString();
- }
-
- /**
- * Gets the view id as returned by {@link ViewNode#getAutoFillId()}.
- */
- public int getId() {
- return mId;
- }
-
- /**
- * Gets the value of this field.
- */
- public String getValue() {
- return mValue;
-
- }
-
- @Override
- public String toString() {
- return "[AutoFillField: " + mId + "=" + mValue + "]";
- }
-
- /**
- * Creates an {@code AutoFillField} for a text field.
- *
- * @param id view id as returned by {@link ViewNode#getAutoFillId()}.
- * @param text value to be auto-filled.
- */
- public static FillableInputField forText(int id, String text) {
- return new FillableInputField(id, text);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeInt(mId);
- parcel.writeString(mValue);
- }
-
- public static final Parcelable.Creator<FillableInputField> CREATOR =
- new Parcelable.Creator<FillableInputField>() {
- @Override
- public FillableInputField createFromParcel(Parcel source) {
- return new FillableInputField(source);
- }
-
- @Override
- public FillableInputField[] newArray(int size) {
- return new FillableInputField[size];
- }
- };
-}
diff --git a/core/java/android/service/autofill/IAutoFillCallback.aidl b/core/java/android/service/autofill/IAutoFillAppCallback.aidl
index d6d4f39651da..629b1f008d8f 100644
--- a/core/java/android/service/autofill/IAutoFillCallback.aidl
+++ b/core/java/android/service/autofill/IAutoFillAppCallback.aidl
@@ -18,10 +18,11 @@ package android.service.autofill;
import java.util.List;
+import android.view.autofill.Dataset;
+
/**
* @hide
*/
-oneway interface IAutoFillCallback {
- void autofill(in List values);
- void showError(String message);
+oneway interface IAutoFillAppCallback {
+ void autoFill(in Dataset dataset);
}
diff --git a/core/java/android/service/autofill/IAutoFillManagerService.aidl b/core/java/android/service/autofill/IAutoFillManagerService.aidl
index f1251c036469..f8ae57bb8809 100644
--- a/core/java/android/service/autofill/IAutoFillManagerService.aidl
+++ b/core/java/android/service/autofill/IAutoFillManagerService.aidl
@@ -24,6 +24,5 @@ import android.os.Bundle;
* {@hide}
*/
oneway interface IAutoFillManagerService {
-
- void requestAutoFill(IBinder activityToken, int userId, int flags);
+ void requestAutoFill(IBinder activityToken, int userId, in Bundle extras, int flags);
}
diff --git a/core/java/android/service/autofill/IAutoFillServerCallback.aidl b/core/java/android/service/autofill/IAutoFillServerCallback.aidl
new file mode 100644
index 000000000000..9d58c9956a25
--- /dev/null
+++ b/core/java/android/service/autofill/IAutoFillServerCallback.aidl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import java.util.List;
+
+import android.view.autofill.AutoFillId;
+import android.view.autofill.FillResponse;
+
+/**
+ * @hide
+ */
+oneway interface IAutoFillServerCallback {
+ void showResponse(in FillResponse response);
+ void showError(String message);
+ void highlightSavedFields(in AutoFillId[] ids);
+}
diff --git a/core/java/android/service/autofill/IAutoFillService.aidl b/core/java/android/service/autofill/IAutoFillService.aidl
index bb122e5eff7d..a1f22bf114e3 100644
--- a/core/java/android/service/autofill/IAutoFillService.aidl
+++ b/core/java/android/service/autofill/IAutoFillService.aidl
@@ -18,14 +18,15 @@ package android.service.autofill;
import android.app.assist.AssistStructure;
import android.os.Bundle;
-import android.service.autofill.IAutoFillCallback;
+import android.service.autofill.IAutoFillServerCallback;
import com.android.internal.os.IResultReceiver;
/**
* @hide
*/
-interface IAutoFillService {
- oneway void onConnected();
- oneway void onDisconnected();
- IResultReceiver getAssistReceiver();
+oneway interface IAutoFillService {
+ void autoFill(in AssistStructure structure, in IAutoFillServerCallback callback,
+ in Bundle extras, int flags);
+ void onConnected();
+ void onDisconnected();
}
diff --git a/core/java/android/service/autofill/SaveCallback.java b/core/java/android/service/autofill/SaveCallback.java
index 4dc7392a963c..627d74c8e349 100644
--- a/core/java/android/service/autofill/SaveCallback.java
+++ b/core/java/android/service/autofill/SaveCallback.java
@@ -20,9 +20,11 @@ import static android.service.autofill.AutoFillService.DEBUG;
import android.app.Activity;
import android.app.assist.AssistStructure.ViewNode;
+import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
+import android.view.autofill.AutoFillId;
import com.android.internal.util.Preconditions;
@@ -34,41 +36,53 @@ public final class SaveCallback {
private static final String TAG = "SaveCallback";
- private final IAutoFillCallback mCallback;
+ private final IAutoFillServerCallback mCallback;
+
+ private boolean mReplied = false;
/** @hide */
- SaveCallback(IBinder binder) {
- mCallback = IAutoFillCallback.Stub.asInterface(binder);
+ SaveCallback(IAutoFillServerCallback callback) {
+ mCallback = callback;
}
/**
- * Notifies the {@link Activity} that the save request succeeded.
+ * Notifies the Android System that an
+ * {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle, android.os.CancellationSignal, SaveCallback)}
+ * was successfully fulfilled by the service.
*
* @param ids ids ({@link ViewNode#getAutoFillId()}) of the fields that were saved.
*
- * @throws RuntimeException if an error occurred while saving the data.
+ * @throws RuntimeException if an error occurred while calling the Android System.
*/
- public void onSuccess(int[] ids) {
+ public void onSuccess(AutoFillId[] ids) {
+ if (DEBUG) Log.d(TAG, "onSuccess(): ids=" + ((ids == null) ? "null" : ids.length));
+
Preconditions.checkArgument(ids != null, "ids cannot be null");
+ checkNotRepliedYet();
Preconditions.checkArgument(ids.length > 0, "ids cannot be empty");
- if (DEBUG) Log.d(TAG, "onSuccess(): ids=" + ids.length);
-
- // TODO(b/33197203): display which ids were saved
+ try {
+ mCallback.highlightSavedFields(ids);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
}
/**
- * Notifies the {@link Activity} that the save request failed.
+ * Notifies the Android System that an
+ * {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle, android.os.CancellationSignal, SaveCallback)}
+ * could not be fulfilled by the service.
*
- * @param message error message to be displayed.
+ * @param message error message to be displayed to the user.
*
- * @throws RuntimeException if an error occurred while notifying the activity.
+ * @throws RuntimeException if an error occurred while calling the Android System.
*/
public void onFailure(CharSequence message) {
if (DEBUG) Log.d(TAG, "onFailure(): message=" + message);
Preconditions.checkArgument(message != null, "message cannot be null");
+ checkNotRepliedYet();
try {
mCallback.showError(message.toString());
@@ -76,4 +90,10 @@ public final class SaveCallback {
e.rethrowAsRuntimeException();
}
}
+
+ // There can be only one!!
+ private void checkNotRepliedYet() {
+ Preconditions.checkState(!mReplied, "already replied");
+ mReplied = true;
+ }
}
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index 9ac89960ab95..1e9deebd8dcf 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -85,7 +85,7 @@ public class DynamicLayout extends Layout
this(base, display, paint, width, align, TextDirectionHeuristics.FIRSTSTRONG_LTR,
spacingmult, spacingadd, includepad,
StaticLayout.BREAK_STRATEGY_SIMPLE, StaticLayout.HYPHENATION_FREQUENCY_NONE,
- ellipsize, ellipsizedWidth);
+ false /* justify */, ellipsize, ellipsizedWidth);
}
/**
@@ -102,7 +102,8 @@ public class DynamicLayout extends Layout
int width, Alignment align, TextDirectionHeuristic textDir,
float spacingmult, float spacingadd,
boolean includepad, int breakStrategy, int hyphenationFrequency,
- TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
+ boolean justify, TextUtils.TruncateAt ellipsize,
+ int ellipsizedWidth) {
super((ellipsize == null)
? display
: (display instanceof Spanned)
@@ -127,6 +128,7 @@ public class DynamicLayout extends Layout
mIncludePad = includepad;
mBreakStrategy = breakStrategy;
+ mJustify = justify;
mHyphenationFrequency = hyphenationFrequency;
/*
@@ -300,7 +302,8 @@ public class DynamicLayout extends Layout
.setEllipsizedWidth(mEllipsizedWidth)
.setEllipsize(mEllipsizeAt)
.setBreakStrategy(mBreakStrategy)
- .setHyphenationFrequency(mHyphenationFrequency);
+ .setHyphenationFrequency(mHyphenationFrequency)
+ .setJustify(mJustify);
reflowed.generate(b, false, true);
int n = reflowed.getLineCount();
// If the new layout has a blank line at the end, but it is not
@@ -808,6 +811,7 @@ public class DynamicLayout extends Layout
private TextUtils.TruncateAt mEllipsizeAt;
private int mBreakStrategy;
private int mHyphenationFrequency;
+ private boolean mJustify;
private PackedIntVector mInts;
private PackedObjectVector<Directions> mObjects;
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 3cb81b0a250f..2fc12d30ffd8 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -218,6 +218,11 @@ public abstract class Layout {
mTextDir = textDir;
}
+ /** @hide */
+ protected void setJustify(boolean justify) {
+ mJustify = justify;
+ }
+
/**
* Replace constructor properties of this Layout with new ones. Be careful.
*/
@@ -266,6 +271,99 @@ public abstract class Layout {
drawText(canvas, firstLine, lastLine);
}
+ private boolean isJustificationRequired(int lineNum) {
+ if (!mJustify) return false;
+ final int lineEnd = getLineEnd(lineNum);
+ return lineEnd < mText.length() && mText.charAt(lineEnd - 1) != '\n';
+ }
+
+ private float getJustifyWidth(int lineNum) {
+ Alignment paraAlign = mAlignment;
+ TabStops tabStops = null;
+ boolean tabStopsIsInitialized = false;
+
+ int left = 0;
+ int right = mWidth;
+
+ final int dir = getParagraphDirection(lineNum);
+
+ ParagraphStyle[] spans = NO_PARA_SPANS;
+ if (mSpannedText) {
+ Spanned sp = (Spanned) mText;
+ final int start = getLineStart(lineNum);
+
+ final boolean isFirstParaLine = (start == 0 || mText.charAt(start - 1) == '\n');
+
+ if (isFirstParaLine) {
+ final int spanEnd = sp.nextSpanTransition(start, mText.length(),
+ ParagraphStyle.class);
+ spans = getParagraphSpans(sp, start, spanEnd, ParagraphStyle.class);
+
+ for (int n = spans.length - 1; n >= 0; n--) {
+ if (spans[n] instanceof AlignmentSpan) {
+ paraAlign = ((AlignmentSpan) spans[n]).getAlignment();
+ break;
+ }
+ }
+ }
+
+ final int length = spans.length;
+ boolean useFirstLineMargin = isFirstParaLine;
+ for (int n = 0; n < length; n++) {
+ if (spans[n] instanceof LeadingMarginSpan2) {
+ int count = ((LeadingMarginSpan2) spans[n]).getLeadingMarginLineCount();
+ int startLine = getLineForOffset(sp.getSpanStart(spans[n]));
+ if (lineNum < startLine + count) {
+ useFirstLineMargin = true;
+ break;
+ }
+ }
+ }
+ for (int n = 0; n < length; n++) {
+ if (spans[n] instanceof LeadingMarginSpan) {
+ LeadingMarginSpan margin = (LeadingMarginSpan) spans[n];
+ if (dir == DIR_RIGHT_TO_LEFT) {
+ right -= margin.getLeadingMargin(useFirstLineMargin);
+ } else {
+ left += margin.getLeadingMargin(useFirstLineMargin);
+ }
+ }
+ }
+ }
+
+ if (getLineContainsTab(lineNum)) {
+ tabStops = new TabStops(TAB_INCREMENT, spans);
+ }
+
+ final Alignment align;
+ if (paraAlign == Alignment.ALIGN_LEFT) {
+ align = (dir == DIR_LEFT_TO_RIGHT) ? Alignment.ALIGN_NORMAL : Alignment.ALIGN_OPPOSITE;
+ } else if (paraAlign == Alignment.ALIGN_RIGHT) {
+ align = (dir == DIR_LEFT_TO_RIGHT) ? Alignment.ALIGN_OPPOSITE : Alignment.ALIGN_NORMAL;
+ } else {
+ align = paraAlign;
+ }
+
+ final int indentWidth;
+ if (align == Alignment.ALIGN_NORMAL) {
+ if (dir == DIR_LEFT_TO_RIGHT) {
+ indentWidth = getIndentAdjust(lineNum, Alignment.ALIGN_LEFT);
+ } else {
+ indentWidth = -getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT);
+ }
+ } else if (align == Alignment.ALIGN_OPPOSITE) {
+ if (dir == DIR_LEFT_TO_RIGHT) {
+ indentWidth = -getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT);
+ } else {
+ indentWidth = getIndentAdjust(lineNum, Alignment.ALIGN_LEFT);
+ }
+ } else { // Alignment.ALIGN_CENTER
+ indentWidth = getIndentAdjust(lineNum, Alignment.ALIGN_CENTER);
+ }
+
+ return right - left - indentWidth;
+ }
+
/**
* @hide
*/
@@ -274,7 +372,7 @@ public abstract class Layout {
int previousLineEnd = getLineStart(firstLine);
ParagraphStyle[] spans = NO_PARA_SPANS;
int spanEnd = 0;
- TextPaint paint = mPaint;
+ final TextPaint paint = mPaint;
CharSequence buf = mText;
Alignment paraAlign = mAlignment;
@@ -288,6 +386,7 @@ public abstract class Layout {
for (int lineNum = firstLine; lineNum <= lastLine; lineNum++) {
int start = previousLineEnd;
previousLineEnd = getLineStart(lineNum + 1);
+ final boolean justify = isJustificationRequired(lineNum);
int end = getLineVisibleEnd(lineNum, start, previousLineEnd);
int ltop = previousLineBottom;
@@ -386,34 +485,42 @@ public abstract class Layout {
}
int x;
+ final int indentWidth;
if (align == Alignment.ALIGN_NORMAL) {
if (dir == DIR_LEFT_TO_RIGHT) {
- x = left + getIndentAdjust(lineNum, Alignment.ALIGN_LEFT);
+ indentWidth = getIndentAdjust(lineNum, Alignment.ALIGN_LEFT);
+ x = left + indentWidth;
} else {
- x = right + getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT);
+ indentWidth = -getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT);
+ x = right - indentWidth;
}
} else {
int max = (int)getLineExtent(lineNum, tabStops, false);
if (align == Alignment.ALIGN_OPPOSITE) {
if (dir == DIR_LEFT_TO_RIGHT) {
- x = right - max + getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT);
+ indentWidth = -getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT);
+ x = right - max - indentWidth;
} else {
- x = left - max + getIndentAdjust(lineNum, Alignment.ALIGN_LEFT);
+ indentWidth = getIndentAdjust(lineNum, Alignment.ALIGN_LEFT);
+ x = left - max + indentWidth;
}
} else { // Alignment.ALIGN_CENTER
+ indentWidth = getIndentAdjust(lineNum, Alignment.ALIGN_CENTER);
max = max & ~1;
- x = ((right + left - max) >> 1) +
- getIndentAdjust(lineNum, Alignment.ALIGN_CENTER);
+ x = ((right + left - max) >> 1) + indentWidth;
}
}
paint.setHyphenEdit(getHyphen(lineNum));
Directions directions = getLineDirections(lineNum);
- if (directions == DIRS_ALL_LEFT_TO_RIGHT && !mSpannedText && !hasTab) {
+ if (directions == DIRS_ALL_LEFT_TO_RIGHT && !mSpannedText && !hasTab && !justify) {
// XXX: assumes there's nothing additional to be done
canvas.drawText(buf, start, end, x, lbaseline, paint);
} else {
tl.set(paint, buf, start, end, dir, directions, hasTab, tabStops);
+ if (justify) {
+ tl.justify(right - left - indentWidth);
+ }
tl.draw(canvas, x, ltop, lbaseline, lbottom);
}
paint.setHyphenEdit(0);
@@ -1094,6 +1201,9 @@ public abstract class Layout {
TextLine tl = TextLine.obtain();
mPaint.setHyphenEdit(getHyphen(line));
tl.set(mPaint, mText, start, end, dir, directions, hasTabs, tabStops);
+ if (isJustificationRequired(line)) {
+ tl.justify(getJustifyWidth(line));
+ }
float width = tl.metrics(null);
mPaint.setHyphenEdit(0);
TextLine.recycle(tl);
@@ -1118,6 +1228,9 @@ public abstract class Layout {
TextLine tl = TextLine.obtain();
mPaint.setHyphenEdit(getHyphen(line));
tl.set(mPaint, mText, start, end, dir, directions, hasTabs, tabStops);
+ if (isJustificationRequired(line)) {
+ tl.justify(getJustifyWidth(line));
+ }
float width = tl.metrics(null);
mPaint.setHyphenEdit(0);
TextLine.recycle(tl);
@@ -1303,10 +1416,7 @@ public abstract class Layout {
return end - 1;
}
- // Note: keep this in sync with Minikin LineBreaker::isLineEndSpace()
- if (!(ch == ' ' || ch == '\t' || ch == 0x1680 ||
- (0x2000 <= ch && ch <= 0x200A && ch != 0x2007) ||
- ch == 0x205F || ch == 0x3000)) {
+ if (!TextLine.isLineEndSpace(ch)) {
break;
}
@@ -2086,6 +2196,7 @@ public abstract class Layout {
private boolean mSpannedText;
private TextDirectionHeuristic mTextDir;
private SpanSet<LineBackgroundSpan> mLineBackgroundSpans;
+ private boolean mJustify;
public static final int DIR_LEFT_TO_RIGHT = 1;
public static final int DIR_RIGHT_TO_LEFT = -1;
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index 081be3afd6d3..cb5b073318d8 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -94,6 +94,7 @@ public class StaticLayout extends Layout {
b.mMaxLines = Integer.MAX_VALUE;
b.mBreakStrategy = Layout.BREAK_STRATEGY_SIMPLE;
b.mHyphenationFrequency = Layout.HYPHENATION_FREQUENCY_NONE;
+ b.mJustify = false;
b.mMeasuredText = MeasuredText.obtain();
return b;
@@ -320,6 +321,17 @@ public class StaticLayout extends Layout {
}
/**
+ * Enables or disables paragraph justification. The default value is disabled (false).
+ *
+ * @param justify true for enabling and false for disabling paragraph justification.
+ * @return this builder, useful for chaining.
+ */
+ public Builder setJustify(boolean justify) {
+ mJustify = justify;
+ return this;
+ }
+
+ /**
* Measurement and break iteration is done in native code. The protocol for using
* the native code is as follows.
*
@@ -404,6 +416,7 @@ public class StaticLayout extends Layout {
int mHyphenationFrequency;
int[] mLeftIndents;
int[] mRightIndents;
+ boolean mJustify;
Paint.FontMetricsInt mFontMetricsInt = new Paint.FontMetricsInt();
@@ -557,6 +570,7 @@ public class StaticLayout extends Layout {
mLeftIndents = b.mLeftIndents;
mRightIndents = b.mRightIndents;
+ setJustify(b.mJustify);
generate(b, b.mIncludePad, b.mIncludePad);
}
@@ -676,7 +690,8 @@ public class StaticLayout extends Layout {
nSetupParagraph(b.mNativePtr, chs, paraEnd - paraStart,
firstWidth, firstWidthLineCount, restWidth,
- variableTabStops, TAB_INCREMENT, b.mBreakStrategy, b.mHyphenationFrequency);
+ variableTabStops, TAB_INCREMENT, b.mBreakStrategy, b.mHyphenationFrequency,
+ b.mJustify);
if (mLeftIndents != null || mRightIndents != null) {
// TODO(raph) performance: it would be better to do this once per layout rather
// than once per paragraph, but that would require a change to the native
@@ -1284,7 +1299,8 @@ public class StaticLayout extends Layout {
// Set up paragraph text and settings; done as one big method to minimize jni crossings
private static native void nSetupParagraph(long nativePtr, char[] text, int length,
float firstWidth, int firstWidthLineCount, float restWidth,
- int[] variableTabStops, int defaultTabStop, int breakStrategy, int hyphenationFrequency);
+ int[] variableTabStops, int defaultTabStop, int breakStrategy, int hyphenationFrequency,
+ boolean isJustified);
private static native float nAddStyleRun(long nativePtr, long nativePaint,
long nativeTypeface, int start, int end, boolean isRtl);
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index c4118605b44c..fcff9a2e5fca 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -54,6 +54,10 @@ class TextLine {
private char[] mChars;
private boolean mCharsValid;
private Spanned mSpanned;
+
+ // Additional width of whitespace for justification. This value is per whitespace, thus
+ // the line width will increase by mAddedWidth x (number of stretchable whitespaces).
+ private float mAddedWidth;
private final TextPaint mWorkPaint = new TextPaint();
private final SpanSet<MetricAffectingSpan> mMetricAffectingSpanSpanSet =
new SpanSet<MetricAffectingSpan>(MetricAffectingSpan.class);
@@ -177,6 +181,25 @@ class TextLine {
}
}
mTabs = tabStops;
+ mAddedWidth = 0;
+ }
+
+ /**
+ * Justify the line to the given width.
+ */
+ void justify(float justifyWidth) {
+ int end = mLen;
+ while (end > 0 && isLineEndSpace(mText.charAt(mStart + end - 1))) {
+ end--;
+ }
+ final int spaces = countStretchableSpaces(0, end);
+ if (spaces == 0) {
+ // There are no stretchable spaces, so we can't help the justification by adding any
+ // width.
+ return;
+ }
+ final float width = Math.abs(measure(end, false, null));
+ mAddedWidth = (justifyWidth - width) / spaces;
}
/**
@@ -595,6 +618,7 @@ class TextLine {
TextPaint wp = mWorkPaint;
wp.set(mPaint);
+ wp.setWordSpacing(mAddedWidth);
int spanStart = runStart;
int spanLimit;
@@ -695,6 +719,7 @@ class TextLine {
Canvas c, float x, int top, int y, int bottom,
FontMetricsInt fmi, boolean needWidth, int offset) {
+ wp.setWordSpacing(mAddedWidth);
// Get metrics first (even for empty strings or "0" width runs)
if (fmi != null) {
expandMetricsFromPaint(fmi, wp);
@@ -981,5 +1006,34 @@ class TextLine {
return TabStops.nextDefaultStop(h, TAB_INCREMENT);
}
+ private boolean isStretchableWhitespace(int ch) {
+ // TODO: Support other stretchable whitespace. (Bug: 34013491)
+ return ch == 0x0020 || ch == 0x00A0;
+ }
+
+ private int nextStretchableSpace(int start, int end) {
+ for (int i = start; i < end; i++) {
+ final char c = mCharsValid ? mChars[i] : mText.charAt(i + mStart);
+ if (isStretchableWhitespace(c)) return i;
+ }
+ return end;
+ }
+
+ /* Return the number of spaces in the text line, for the purpose of justification */
+ private int countStretchableSpaces(int start, int end) {
+ int count = 0;
+ for (int i = start; i < end; i = nextStretchableSpace(i + 1, end)) {
+ count++;
+ }
+ return count;
+ }
+
+ // Note: keep this in sync with Minikin LineBreaker::isLineEndSpace()
+ public static boolean isLineEndSpace(char ch) {
+ return ch == ' ' || ch == '\t' || ch == 0x1680
+ || (0x2000 <= ch && ch <= 0x200A && ch != 0x2007)
+ || ch == 0x205F || ch == 0x3000;
+ }
+
private static final int TAB_INCREMENT = 20;
}
diff --git a/core/java/android/transition/ArcMotion.java b/core/java/android/transition/ArcMotion.java
index 70443ba90f45..da1483499220 100644
--- a/core/java/android/transition/ArcMotion.java
+++ b/core/java/android/transition/ArcMotion.java
@@ -199,83 +199,77 @@ public class ArcMotion extends PathMotion {
float ex;
float ey;
- if (startY == endY) {
- ex = (startX + endX) / 2;
- ey = startY + mMinimumHorizontalTangent * Math.abs(endX - startX) / 2;
- } else if (startX == endX) {
- ex = startX + mMinimumVerticalTangent * Math.abs(endY - startY) / 2;
- ey = (startY + endY) / 2;
- } else {
- float deltaX = endX - startX;
- float deltaY = endY - startY;
- // hypotenuse squared.
- float h2 = deltaX * deltaX + deltaY * deltaY;
+ float deltaX = endX - startX;
+ float deltaY = endY - startY;
+
+ // hypotenuse squared.
+ float h2 = deltaX * deltaX + deltaY * deltaY;
- // Midpoint between start and end
- float dx = (startX + endX) / 2;
- float dy = (startY + endY) / 2;
+ // Midpoint between start and end
+ float dx = (startX + endX) / 2;
+ float dy = (startY + endY) / 2;
- // Distance squared between end point and mid point is (1/2 hypotenuse)^2
- float midDist2 = h2 * 0.25f;
+ // Distance squared between end point and mid point is (1/2 hypotenuse)^2
+ float midDist2 = h2 * 0.25f;
- float minimumArcDist2 = 0;
- boolean isQuadrant1Or3 = (deltaX * deltaY) > 0;
+ float minimumArcDist2 = 0;
- if ((Math.abs(deltaX) < Math.abs(deltaY))) {
- // Similar triangles bfa and bde mean that (ab/fb = eb/bd)
- // Therefore, eb = ab * bd / fb
- // ab = hypotenuse
- // bd = hypotenuse/2
- // fb = deltaY
- float eDistY = h2 / (2 * deltaY);
- if (isQuadrant1Or3) {
- ey = startY + eDistY;
- ex = startX;
- } else {
- ey = endY - eDistY;
- ex = endX;
- }
+ boolean isMovingUpwards = startY > endY;
- minimumArcDist2 = midDist2 * mMinimumVerticalTangent
- * mMinimumVerticalTangent;
+ if ((Math.abs(deltaX) < Math.abs(deltaY))) {
+ // Similar triangles bfa and bde mean that (ab/fb = eb/bd)
+ // Therefore, eb = ab * bd / fb
+ // ab = hypotenuse
+ // bd = hypotenuse/2
+ // fb = deltaY
+ float eDistY = Math.abs(h2 / (2 * deltaY));
+ if (isMovingUpwards) {
+ ey = endY + eDistY;
+ ex = endX;
} else {
- // Same as above, but flip X & Y
- float eDistX = h2 / (2 * deltaX);
- if (isQuadrant1Or3) {
- ex = endX - eDistX;
- ey = endY;
- } else {
- ex = startX + eDistX;
- ey = startY;
- }
+ ey = startY + eDistY;
+ ex = startX;
+ }
- minimumArcDist2 = midDist2 * mMinimumHorizontalTangent
- * mMinimumHorizontalTangent;
+ minimumArcDist2 = midDist2 * mMinimumVerticalTangent
+ * mMinimumVerticalTangent;
+ } else {
+ // Same as above, but flip X & Y and account for negative eDist
+ float eDistX = h2 / (2 * deltaX);
+ if (isMovingUpwards) {
+ ex = startX + eDistX;
+ ey = startY;
+ } else {
+ ex = endX - eDistX;
+ ey = endY;
}
- float arcDistX = dx - ex;
- float arcDistY = dy - ey;
- float arcDist2 = arcDistX * arcDistX + arcDistY * arcDistY;
- float maximumArcDist2 = midDist2 * mMaximumTangent * mMaximumTangent;
+ minimumArcDist2 = midDist2 * mMinimumHorizontalTangent
+ * mMinimumHorizontalTangent;
+ }
+ float arcDistX = dx - ex;
+ float arcDistY = dy - ey;
+ float arcDist2 = arcDistX * arcDistX + arcDistY * arcDistY;
- float newArcDistance2 = 0;
- if (arcDist2 < minimumArcDist2) {
- newArcDistance2 = minimumArcDist2;
- } else if (arcDist2 > maximumArcDist2) {
- newArcDistance2 = maximumArcDist2;
- }
- if (newArcDistance2 != 0) {
- float ratio2 = newArcDistance2 / arcDist2;
- float ratio = (float) Math.sqrt(ratio2);
- ex = dx + (ratio * (ex - dx));
- ey = dy + (ratio * (ey - dy));
- }
+ float maximumArcDist2 = midDist2 * mMaximumTangent * mMaximumTangent;
+
+ float newArcDistance2 = 0;
+ if (arcDist2 < minimumArcDist2) {
+ newArcDistance2 = minimumArcDist2;
+ } else if (arcDist2 > maximumArcDist2) {
+ newArcDistance2 = maximumArcDist2;
+ }
+ if (newArcDistance2 != 0) {
+ float ratio2 = newArcDistance2 / arcDist2;
+ float ratio = (float) Math.sqrt(ratio2);
+ ex = dx + (ratio * (ex - dx));
+ ey = dy + (ratio * (ey - dy));
}
- float controlX1 = (startX + ex) / 2;
- float controlY1 = (startY + ey) / 2;
- float controlX2 = (ex + endX) / 2;
- float controlY2 = (ey + endY) / 2;
- path.cubicTo(controlX1, controlY1, controlX2, controlY2, endX, endY);
+ float control1X = (startX + ex) / 2;
+ float control1Y = (startY + ey) / 2;
+ float control2X = (ex + endX) / 2;
+ float control2Y = (ey + endY) / 2;
+ path.cubicTo(control1X, control1Y, control2X, control2Y, endX, endY);
return path;
}
}
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 3beb00fc8d9e..b37ea8ebeaa0 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -282,6 +282,15 @@ public final class Display {
*/
public static final int STATE_DOZE_SUSPEND = 4;
+ /**
+ * Display state: The display is on and optimized for VR mode.
+ *
+ * @see #getState
+ * @see android.os.PowerManager#isInteractive
+ * @hide
+ */
+ public static final int STATE_VR = 5;
+
/* The color mode constants defined below must be kept in sync with the ones in
* system/graphics.h */
@@ -866,7 +875,8 @@ public final class Display {
* Gets the state of the display, such as whether it is on or off.
*
* @return The state of the display: one of {@link #STATE_OFF}, {@link #STATE_ON},
- * {@link #STATE_DOZE}, {@link #STATE_DOZE_SUSPEND}, or {@link #STATE_UNKNOWN}.
+ * {@link #STATE_DOZE}, {@link #STATE_DOZE_SUSPEND}, or
+ * {@link #STATE_UNKNOWN}.
*/
public int getState() {
synchronized (this) {
@@ -982,6 +992,8 @@ public final class Display {
return "DOZE";
case STATE_DOZE_SUSPEND:
return "DOZE_SUSPEND";
+ case STATE_VR:
+ return "VR";
default:
return Integer.toString(state);
}
diff --git a/core/java/android/view/FocusFinder.java b/core/java/android/view/FocusFinder.java
index 1a4f0d1ae803..a07a7ef600bf 100644
--- a/core/java/android/view/FocusFinder.java
+++ b/core/java/android/view/FocusFinder.java
@@ -16,8 +16,8 @@
package android.view;
-import static android.view.View.FOCUS_GROUP_CLUSTER;
-import static android.view.View.FOCUS_GROUP_SECTION;
+import static android.view.View.KEYBOARD_NAVIGATION_GROUP_CLUSTER;
+import static android.view.View.KEYBOARD_NAVIGATION_GROUP_SECTION;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -25,7 +25,7 @@ import android.graphics.Rect;
import android.util.ArrayMap;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
-import android.view.View.FocusGroupType;
+import android.view.View.KeyboardNavigationGroupType;
import java.util.ArrayList;
import java.util.Collections;
@@ -110,30 +110,31 @@ public class FocusFinder {
}
/**
- * Find the root of the next keyboard navigation cluster after the current one.
- * @param focusGroupType Type of the focus group
+ * Find the root of the next keyboard navigation group after the current one. The group type can
+ * be either a cluster or a section.
+ * @param groupType Type of the keyboard navigation group
* @param root The view tree to look inside. Cannot be null
- * @param currentCluster The starting point of the search. Null means the default cluster
+ * @param currentGroup The starting point of the search. Null means the default group
* @param direction Direction to look
- * @return The next cluster, or null if none exists
+ * @return The next group, or null if none exists
*/
- public View findNextKeyboardNavigationCluster(
- @FocusGroupType int focusGroupType,
+ public View findNextKeyboardNavigationGroup(
+ @KeyboardNavigationGroupType int groupType,
@NonNull View root,
- @Nullable View currentCluster,
+ @Nullable View currentGroup,
int direction) {
View next = null;
- final ArrayList<View> clusters = mTempList;
+ final ArrayList<View> groups = mTempList;
try {
- clusters.clear();
- root.addKeyboardNavigationClusters(focusGroupType, clusters, direction);
- if (!clusters.isEmpty()) {
- next = findNextKeyboardNavigationCluster(
- focusGroupType, root, currentCluster, clusters, direction);
+ groups.clear();
+ root.addKeyboardNavigationGroups(groupType, groups, direction);
+ if (!groups.isEmpty()) {
+ next = findNextKeyboardNavigationGroup(
+ groupType, root, currentGroup, groups, direction);
}
} finally {
- clusters.clear();
+ groups.clear();
}
return next;
}
@@ -206,25 +207,25 @@ public class FocusFinder {
}
}
- private View findNextKeyboardNavigationCluster(
- @FocusGroupType int focusGroupType,
+ private View findNextKeyboardNavigationGroup(
+ @KeyboardNavigationGroupType int groupType,
View root,
- View currentCluster,
- List<View> clusters,
+ View currentGroup,
+ List<View> groups,
int direction) {
- final int count = clusters.size();
+ final int count = groups.size();
switch (direction) {
case View.FOCUS_FORWARD:
case View.FOCUS_DOWN:
case View.FOCUS_RIGHT:
- return getNextKeyboardNavigationCluster(
- focusGroupType, root, currentCluster, clusters, count);
+ return getNextKeyboardNavigationGroup(
+ groupType, root, currentGroup, groups, count);
case View.FOCUS_BACKWARD:
case View.FOCUS_UP:
case View.FOCUS_LEFT:
- return getPreviousKeyboardNavigationCluster(
- focusGroupType, root, currentCluster, clusters, count);
+ return getPreviousKeyboardNavigationGroup(
+ groupType, root, currentGroup, groups, count);
default:
throw new IllegalArgumentException("Unknown direction: " + direction);
}
@@ -330,67 +331,69 @@ public class FocusFinder {
return null;
}
- private static View getNextKeyboardNavigationCluster(
- @FocusGroupType int focusGroupType,
+ private static View getNextKeyboardNavigationGroup(
+ @KeyboardNavigationGroupType int groupType,
View root,
- View currentCluster,
- List<View> clusters,
+ View currentGroup,
+ List<View> groups,
int count) {
- if (currentCluster == null) {
- // The current cluster is the default one.
- // The next cluster after the default one is the first one.
- // Note that the caller guarantees that 'clusters' is not empty.
- return clusters.get(0);
+ if (currentGroup == null) {
+ // The current group is the default one.
+ // The next group after the default one is the first one.
+ // Note that the caller guarantees that 'group' is not empty.
+ return groups.get(0);
}
- final int position = clusters.lastIndexOf(currentCluster);
+ final int position = groups.lastIndexOf(currentGroup);
if (position >= 0 && position + 1 < count) {
- // Return the next non-default cluster if we can find it.
- return clusters.get(position + 1);
+ // Return the next non-default group if we can find it.
+ return groups.get(position + 1);
}
- switch (focusGroupType) {
- case FOCUS_GROUP_CLUSTER:
+ switch (groupType) {
+ case KEYBOARD_NAVIGATION_GROUP_CLUSTER:
// The current cluster is the last one. The next one is the default one, i.e. the
// root.
return root;
- case FOCUS_GROUP_SECTION:
+ case KEYBOARD_NAVIGATION_GROUP_SECTION:
// There is no "default section", hence returning the first one.
- return clusters.get(0);
+ return groups.get(0);
default:
- throw new IllegalArgumentException("Unknown focus group type: " + focusGroupType);
+ throw new IllegalArgumentException(
+ "Unknown keyboard navigation group type: " + groupType);
}
}
- private static View getPreviousKeyboardNavigationCluster(
- @FocusGroupType int focusGroupType,
+ private static View getPreviousKeyboardNavigationGroup(
+ @KeyboardNavigationGroupType int groupType,
View root,
- View currentCluster,
- List<View> clusters,
+ View currentGroup,
+ List<View> groups,
int count) {
- if (currentCluster == null) {
- // The current cluster is the default one.
- // The previous cluster before the default one is the last one.
- // Note that the caller guarantees that 'clusters' is not empty.
- return clusters.get(count - 1);
+ if (currentGroup == null) {
+ // The current group is the default one.
+ // The previous group before the default one is the last one.
+ // Note that the caller guarantees that 'groups' is not empty.
+ return groups.get(count - 1);
}
- final int position = clusters.indexOf(currentCluster);
+ final int position = groups.indexOf(currentGroup);
if (position > 0) {
- // Return the previous non-default cluster if we can find it.
- return clusters.get(position - 1);
+ // Return the previous non-default group if we can find it.
+ return groups.get(position - 1);
}
- switch (focusGroupType) {
- case FOCUS_GROUP_CLUSTER:
+ switch (groupType) {
+ case KEYBOARD_NAVIGATION_GROUP_CLUSTER:
// The current cluster is the first one. The previous one is the default one, i.e.
// the root.
return root;
- case FOCUS_GROUP_SECTION:
+ case KEYBOARD_NAVIGATION_GROUP_SECTION:
// There is no "default section", hence returning the last one.
- return clusters.get(count - 1);
+ return groups.get(count - 1);
default:
- throw new IllegalArgumentException("Unknown focus group type: " + focusGroupType);
+ throw new IllegalArgumentException(
+ "Unknown keyboard navigation group type: " + groupType);
}
}
diff --git a/core/java/android/view/SurfaceHolder.java b/core/java/android/view/SurfaceHolder.java
index a3e8312c0a64..2fd2e966dc38 100644
--- a/core/java/android/view/SurfaceHolder.java
+++ b/core/java/android/view/SurfaceHolder.java
@@ -116,9 +116,34 @@ public interface SurfaceHolder {
* size before it has been correctly drawn that way). This will
* typically be preceeded by a call to {@link #surfaceChanged}.
*
+ * As of O, {@link #surfaceRedrawNeededAsync} may be implemented
+ * to provide a non-blocking implementation. If {@link #surfaceRedrawNeededAsync}
+ * is not implemented, then this will be called instead.
+ *
* @param holder The SurfaceHolder whose surface has changed.
*/
- public void surfaceRedrawNeeded(SurfaceHolder holder);
+ void surfaceRedrawNeeded(SurfaceHolder holder);
+
+ /**
+ * An alternative to surfaceRedrawNeeded where it is not required to block
+ * until the redraw is complete. You should initiate the redraw, and return,
+ * later invoking drawingFinished when your redraw is complete.
+ *
+ * This can be useful to avoid blocking your main application thread on rendering.
+ *
+ * As of O, if this is implemented {@link #surfaceRedrawNeeded} will not be called.
+ * However it is still recommended to implement {@link #surfaceRedrawNeeded} for
+ * compatibility with older versions of the platform.
+ *
+ * @param holder The SurfaceHolder which needs redrawing.
+ * @param drawingFinished A runnable to signal completion. This may be invoked
+ * from any thread.
+ *
+ */
+ default void surfaceRedrawNeededAsync(SurfaceHolder holder, Runnable drawingFinished) {
+ surfaceRedrawNeeded(holder);
+ drawingFinished.run();
+ }
}
/**
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index d46910c2139c..018be866cd8b 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -33,6 +33,7 @@ import android.util.AttributeSet;
import android.util.Log;
import com.android.internal.view.BaseIWindow;
+import com.android.internal.view.SurfaceCallbackHelper;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -639,21 +640,13 @@ public class SurfaceView extends View {
if (callbacks == null) {
callbacks = getSurfaceCallbacks();
}
- for (SurfaceHolder.Callback c : callbacks) {
- if (c instanceof SurfaceHolder.Callback2) {
- ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(
- mSurfaceHolder);
- }
- }
+ SurfaceCallbackHelper sch =
+ new SurfaceCallbackHelper(mSession, mWindow);
+ sch.dispatchSurfaceRedrawNeededAsync(mSurfaceHolder, callbacks);
}
}
} finally {
mIsCreating = false;
- if (redrawNeeded) {
- if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " "
- + "finishedDrawing");
- mSession.finishDrawing(mWindow);
- }
mSession.performDeferredDestroy(mWindow);
}
} catch (RemoteException ex) {
@@ -876,7 +869,6 @@ public class SurfaceView extends View {
}
private final SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
-
private static final String LOG_TAG = "SurfaceHolder";
@Override
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 5012215cf55b..f3ebcb4b326b 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -28,7 +28,6 @@ import android.graphics.drawable.AnimatedVectorDrawable;
import android.os.Binder;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.Trace;
import android.util.Log;
@@ -72,17 +71,6 @@ public final class ThreadedRenderer {
private static final String CACHE_PATH_SHADERS = "com.android.opengl.shaders_cache";
/**
- * System property used to enable or disable dirty regions invalidation.
- * This property is only queried if {@link #RENDER_DIRTY_REGIONS} is true.
- * The default value of this property is assumed to be true.
- *
- * Possible values:
- * "true", to enable partial invalidates
- * "false", to disable partial invalidates
- */
- static final String RENDER_DIRTY_REGIONS_PROPERTY = "debug.hwui.render_dirty_regions";
-
- /**
* System property used to enable or disable threaded rendering profiling.
* The default value of this property is assumed to be false.
*
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index aad7e0a12398..aedd0df4e4f0 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -39,6 +39,7 @@ import android.annotation.Nullable;
import android.annotation.Size;
import android.annotation.TestApi;
import android.annotation.UiThread;
+import android.app.Application.OnProvideAssistDataListener;
import android.content.ClipData;
import android.content.Context;
import android.content.ContextWrapper;
@@ -103,6 +104,9 @@ import android.view.accessibility.AccessibilityNodeProvider;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Transformation;
+import android.view.autofill.AutoFillType;
+import android.view.autofill.AutoFillValue;
+import android.view.autofill.VirtualViewDelegate;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
@@ -1250,11 +1254,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/** @hide */
@IntDef({
- FOCUS_GROUP_CLUSTER,
- FOCUS_GROUP_SECTION
+ KEYBOARD_NAVIGATION_GROUP_CLUSTER,
+ KEYBOARD_NAVIGATION_GROUP_SECTION
})
@Retention(RetentionPolicy.SOURCE)
- public @interface FocusGroupType {}
+ public @interface KeyboardNavigationGroupType {}
/**
* Use with {@link #focusSearch(int)}. Move focus to the previous selectable
@@ -1289,16 +1293,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public static final int FOCUS_DOWN = 0x00000082;
/**
- * Use with {@link #keyboardNavigationClusterSearch(int, View, int)}. Search for a keyboard
+ * Use with {@link #keyboardNavigationGroupSearch(int, View, int)}. Search for a keyboard
* navigation cluster.
*/
- public static final int FOCUS_GROUP_CLUSTER = 1;
+ public static final int KEYBOARD_NAVIGATION_GROUP_CLUSTER = 1;
/**
- * Use with {@link #keyboardNavigationClusterSearch(int, View, int)}. Search for a keyboard
+ * Use with {@link #keyboardNavigationGroupSearch(int, View, int)}. Search for a keyboard
* navigation section.
*/
- public static final int FOCUS_GROUP_SECTION = 2;
+ public static final int KEYBOARD_NAVIGATION_GROUP_SECTION = 2;
/**
* Bits of {@link #getMeasuredWidthAndState()} and
@@ -3313,7 +3317,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@ViewDebug.FlagToString(mask = PFLAG_DIRTY_MASK, equals = PFLAG_DIRTY_OPAQUE, name = "DIRTY_OPAQUE"),
@ViewDebug.FlagToString(mask = PFLAG_DIRTY_MASK, equals = PFLAG_DIRTY, name = "DIRTY")
}, formatToHexString = true)
- int mPrivateFlags;
+
+ /* @hide */
+ public int mPrivateFlags;
int mPrivateFlags2;
int mPrivateFlags3;
@@ -4023,18 +4029,34 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
- * <p>When setting a {@link android.app.assist.AssistStructure}, its nodes should not contain
- * PII (Personally Identifiable Information).
+ * Set when a request was made to decide if views in an {@link android.app.Activity} can be
+ * auto-filled by an {@link android.service.autofill.AutoFillService}.
+ *
+ * <p>Since this request is made without a explicit user consent, the resulting
+ * {@link android.app.assist.AssistStructure} should not contain any PII
+ * (Personally Identifiable Information).
+ *
+ * <p>Examples:
+ * <ul>
+ * <li>{@link android.widget.TextView} texts should only be included when they were set by
+ * static resources.
+ * <li>{@link android.webkit.WebView} virtual children should be restricted to a subset of
+ * input fields and tags (like {@code id}).
+ * </ul>
*/
- // TODO(b/33197203) (b/33269702): improve documentation: mention all cases, show examples, etc.
- public static final int ASSIST_FLAG_SANITIZED_TEXT = 0x1;
+ // TODO(b/33197203) (b/34078930): improve documentation: mention all cases, show examples, etc.
+ // In particular, be more specific about webview restrictions
+ public static final int AUTO_FILL_FLAG_TYPE_FILL = 0x1;
/**
- * <p>When setting a {@link android.app.assist.AssistStructure}, its nodes should contain all
- * type of data, even sensitive PII (Personally Identifiable Information) like passwords or
- * credit card numbers.
+ * Set when the user explicitly asked a {@link android.service.autofill.AutoFillService} to save
+ * the value of the {@link View}s in an {@link android.app.Activity}.
+ *
+ * <p>The resulting {@link android.app.assist.AssistStructure} can contain any kind of PII
+ * (Personally Identifiable Information). For example, the text of password fields should be
+ * included since that's what's typically saved.
*/
- public static final int ASSIST_FLAG_NON_SANITIZED_TEXT = 0x2;
+ public static final int AUTO_FILL_FLAG_TYPE_SAVE = 0x2;
/**
* Set to true when drawing cache is enabled and cannot be created.
@@ -6871,35 +6893,32 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}.
* @param structure Fill in with structured view data. The default implementation
* fills in all data that can be inferred from the view itself.
- *
- * @deprecated As of API O sub-classes should override
- * {@link #onProvideStructure(ViewStructure, int)} instead.
*/
- // TODO(b/33197203): set proper API above
- @Deprecated
public void onProvideStructure(ViewStructure structure) {
- onProvideStructure(structure, 0);
+ onProvideStructureForAssistOrAutoFill(structure, 0);
}
/**
- * Called when assist structure is being retrieved from a view as part of
- * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData} or as part
- * of an auto-fill request.
- *
- * <p>The default implementation fills in all data that can be inferred from the view itself.
+ * Called when assist structure is being retrieved from a view as part of an auto-fill request.
*
* <p>The structure must be filled according to the request type, which is set in the
* {@code flags} parameter - see the documentation on each flag for more details.
*
- * @param structure Fill in with structured view data. The default implementation
+ * @param structure Fill in with structured view data. The default implementation
* fills in all data that can be inferred from the view itself.
- * @param flags optional flags (see {@link #ASSIST_FLAG_SANITIZED_TEXT} and
- * {@link #ASSIST_FLAG_NON_SANITIZED_TEXT} for more info).
+ * @param flags optional flags (see {@link #AUTO_FILL_FLAG_TYPE_FILL} and
+ * {@link #AUTO_FILL_FLAG_TYPE_SAVE} for more info).
*/
- public void onProvideStructure(ViewStructure structure, int flags) {
+ public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
+ onProvideStructureForAssistOrAutoFill(structure, flags);
+ }
+
+ private void onProvideStructureForAssistOrAutoFill(ViewStructure structure, int flags) {
+ // NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
+ // this method should take a boolean with the type of request.
boolean forAutoFill = (flags
- & (View.ASSIST_FLAG_SANITIZED_TEXT
- | View.ASSIST_FLAG_NON_SANITIZED_TEXT)) != 0;
+ & (View.AUTO_FILL_FLAG_TYPE_FILL
+ | View.AUTO_FILL_FLAG_TYPE_SAVE)) != 0;
final int id = mID;
if (id > 0 && (id&0xff000000) != 0 && (id&0x00ff0000) != 0
&& (id&0x0000ffff) != 0) {
@@ -6921,6 +6940,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// The auto-fill id needs to be unique, but its value doesn't matter, so it's better to
// reuse the accessibility id to save space.
structure.setAutoFillId(getAccessibilityViewId());
+
+ structure.setAutoFillType(getAutoFillType());
}
structure.setDimens(mLeft, mTop, mScrollX, mScrollY, mRight - mLeft, mBottom - mTop);
@@ -6971,40 +6992,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* uses {@link #getAccessibilityNodeProvider()} to try to generate this from the
* view's virtual accessibility nodes, if any. You can override this for a more
* optimal implementation providing this data.
- *
- * @deprecated As of API O, sub-classes should override
- * {@link #onProvideVirtualStructure(ViewStructure, int)} instead.
*/
- // TODO(b/33197203): set proper API above
- @Deprecated
public void onProvideVirtualStructure(ViewStructure structure) {
- onProvideVirtualStructure(structure, 0);
+ onProvideVirtualStructureForAssistOrAutoFill(structure, 0);
}
/**
- * Called when assist structure is being retrieved from a view as part of
- * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData} or as part
- * of an auto-fill request to generate additional virtual structure under this view.
+ * Called when assist structure is being retrieved from a view as part of an auto-fill request
+ * to generate additional virtual structure under this view.
*
* <p>The defaullt implementation uses {@link #getAccessibilityNodeProvider()} to try to
- * generate this from the view's virtual accessibility nodes, if any. You can override this
+ * generate this from the view's virtual accessibility nodes, if any. You can override this
* for a more optimal implementation providing this data.
*
* <p>The structure must be filled according to the request type, which is set in the
* {@code flags} parameter - see the documentation on each flag for more details.
*
* @param structure Fill in with structured view data.
- * @param flags optional flags (see {@link #ASSIST_FLAG_SANITIZED_TEXT} and
- * {@link #ASSIST_FLAG_NON_SANITIZED_TEXT} for more info).
+ * @param flags optional flags (see {@link #AUTO_FILL_FLAG_TYPE_FILL} and
+ * {@link #AUTO_FILL_FLAG_TYPE_SAVE} for more info).
*/
- public void onProvideVirtualStructure(ViewStructure structure, int flags) {
- boolean sanitize = (flags & View.ASSIST_FLAG_SANITIZED_TEXT) != 0;
-
- if (sanitize) {
- // TODO(b/33197203): change populateVirtualStructure so it sanitizes data in this case.
- return;
- }
+ public void onProvideAutoFillVirtualStructure(ViewStructure structure, int flags) {
+ onProvideVirtualStructureForAssistOrAutoFill(structure, flags);
+ }
+ private void onProvideVirtualStructureForAssistOrAutoFill(ViewStructure structure, int flags) {
+ // NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
+ // this method should take a boolean with the type of request.
AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
if (provider != null) {
AccessibilityNodeInfo info = createAccessibilityNodeInfo();
@@ -7015,8 +7029,66 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
}
+ /**
+ * Gets the {@link VirtualViewDelegate} responsible for auto-filling the virtual children of
+ * this view.
+ *
+ * <p>By default returns {@code null} but should be overridden when view provides a virtual
+ * hierachy on {@link OnProvideAssistDataListener} that takes flags used by the AutoFill
+ * Framework (such as {@link #AUTO_FILL_FLAG_TYPE_FILL} and
+ * {@link #AUTO_FILL_FLAG_TYPE_SAVE}).
+ */
+ @Nullable
+ public VirtualViewDelegate getAutoFillVirtualViewDelegate(
+ @SuppressWarnings("unused") VirtualViewDelegate.Callback callback) {
+ return null;
+ }
+
+ /**
+ * Automatically fills the content of this view with the {@code value}.
+ *
+ * <p>By default does nothing, but views should override it (and {@link #getAutoFillType()} to
+ * support the AutoFill Framework.
+ *
+ * <p>Typically, it is implemented by:
+ *
+ * <ol>
+ * <li>Call the proper getter method on {@link AutoFillValue} to fetch the actual value.
+ * <li>Pass the actual value to the equivalent setter in the view.
+ * <ol>
+ *
+ * <p>For example, a text-field view would call:
+ *
+ * <pre class="prettyprint">
+ * CharSequence text = value.getTextValue();
+ * if (text != null) {
+ * setText(text);
+ * }
+ * </pre>
+ */
+ public void autoFill(@SuppressWarnings("unused") AutoFillValue value) {
+ }
+
+ /**
+ * Describes the auto-fill type that should be used on callas to
+ * {@link #autoFill(AutoFillValue)} and
+ * {@link VirtualViewDelegate#autoFill(int, AutoFillValue)}.
+ *
+ * <p>By default returns {@code null}, but views should override it (and
+ * {@link #autoFill(AutoFillValue)} to support the AutoFill Framework.
+ */
+ @Nullable
+ public AutoFillType getAutoFillType() {
+ return null;
+ }
+
private void populateVirtualStructure(ViewStructure structure,
AccessibilityNodeProvider provider, AccessibilityNodeInfo info, int flags) {
+ // NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
+ // this method should take a boolean with the type of request.
+
+ final boolean sanitized = (flags & View.AUTO_FILL_FLAG_TYPE_FILL) != 0;
+
structure.setId(AccessibilityNodeInfo.getVirtualDescendantId(info.getSourceNodeId()),
null, null, null);
Rect rect = structure.getTempRect();
@@ -7054,7 +7126,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
CharSequence cname = info.getClassName();
structure.setClassName(cname != null ? cname.toString() : null);
structure.setContentDescription(info.getContentDescription());
- if (info.getText() != null || info.getError() != null) {
+ if (!sanitized && (info.getText() != null || info.getError() != null)) {
+ // TODO(b/33197203) (b/33269702): when sanitized, try to use the Accessibility API to
+ // just set sanitized values (like text coming from resource files), rather than not
+ // setting it at all.
structure.setText(info.getText(), info.getTextSelectionStart(),
info.getTextSelectionEnd());
}
@@ -7075,14 +7150,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* Dispatch creation of {@link ViewStructure} down the hierarchy. The default
* implementation calls {@link #onProvideStructure} and
* {@link #onProvideVirtualStructure}.
- *
- * @deprecated As of API O, sub-classes should override
- * {@link #dispatchProvideStructure(ViewStructure, int)} instead.
*/
- // TODO(b/33197203): set proper API above
- @Deprecated
public void dispatchProvideStructure(ViewStructure structure) {
- dispatchProvideStructure(structure, 0);
+ dispatchProvideStructureForAssistOrAutoFill(structure, 0);
}
/**
@@ -7091,22 +7161,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* <p>The structure must be filled according to the request type, which is set in the
* {@code flags} parameter - see the documentation on each flag for more details.
*
- * <p>The default implementation calls {@link #onProvideStructure(ViewStructure, int)} and
- * {@link #onProvideVirtualStructure(ViewStructure, int)}.
+ * <p>The default implementation calls {@link #onProvideAutoFillStructure(ViewStructure, int)}
+ * and {@link #onProvideAutoFillVirtualStructure(ViewStructure, int)}.
*
* @param structure Fill in with structured view data.
- * @param flags optional flags (see {@link #ASSIST_FLAG_SANITIZED_TEXT} and
- * {@link #ASSIST_FLAG_NON_SANITIZED_TEXT} for more info).
+ * @param flags optional flags (see {@link #AUTO_FILL_FLAG_TYPE_FILL} and
+ * {@link #AUTO_FILL_FLAG_TYPE_SAVE} for more info).
*/
- public void dispatchProvideStructure(ViewStructure structure, int flags) {
+ public void dispatchProvideAutoFillStructure(ViewStructure structure, int flags) {
+ dispatchProvideStructureForAssistOrAutoFill(structure, flags);
+ }
+
+ private void dispatchProvideStructureForAssistOrAutoFill(ViewStructure structure, int flags) {
+ // NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
+ // this method should take a boolean with the type of request.
boolean forAutoFill = (flags
- & (View.ASSIST_FLAG_SANITIZED_TEXT
- | View.ASSIST_FLAG_NON_SANITIZED_TEXT)) != 0;
+ & (View.AUTO_FILL_FLAG_TYPE_FILL
+ | View.AUTO_FILL_FLAG_TYPE_SAVE)) != 0;
boolean blocked = forAutoFill ? isAutoFillBlocked() : isAssistBlocked();
if (!blocked) {
- onProvideStructure(structure, flags);
- onProvideVirtualStructure(structure, flags);
+ if (forAutoFill) {
+ onProvideAutoFillStructure(structure, flags);
+ onProvideAutoFillVirtualStructure(structure, flags);
+ } else {
+ onProvideStructure(structure);
+ onProvideVirtualStructure(structure);
+ }
} else {
structure.setClassName(getAccessibilityClassName().toString());
structure.setAssistBlocked(true);
@@ -9117,45 +9198,48 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
}
- final boolean isFocusGroupOfType(@FocusGroupType int focusGroupType) {
- switch (focusGroupType) {
- case FOCUS_GROUP_CLUSTER:
+ final boolean isKeyboardNavigationGroupOfType(@KeyboardNavigationGroupType int groupType) {
+ switch (groupType) {
+ case KEYBOARD_NAVIGATION_GROUP_CLUSTER:
return isKeyboardNavigationCluster();
- case FOCUS_GROUP_SECTION:
+ case KEYBOARD_NAVIGATION_GROUP_SECTION:
return isKeyboardNavigationSection();
default:
- throw new IllegalArgumentException("Unknown focus group type: " + focusGroupType);
+ throw new IllegalArgumentException(
+ "Unknown keyboard navigation group type: " + groupType);
}
}
/**
- * Find the nearest keyboard navigation cluster in the specified direction.
- * This does not actually give focus to that cluster.
+ * Find the nearest keyboard navigation group in the specified direction. The group type can be
+ * either a cluster or a section.
+ * This does not actually give focus to that group.
*
- * @param focusGroupType Type of the focus group
- * @param currentCluster The starting point of the search. Null means the current cluster is not
- * found yet
+ * @param groupType Type of the keyboard navigation group
+ * @param currentGroup The starting point of the search. Null means the current group is not
+ * found yet
* @param direction Direction to look
*
- * @return The nearest keyboard navigation cluster in the specified direction, or null if none
+ * @return The nearest keyboard navigation group in the specified direction, or null if none
* can be found
*/
- public View keyboardNavigationClusterSearch(
- @FocusGroupType int focusGroupType, View currentCluster, int direction) {
- if (isFocusGroupOfType(focusGroupType)) {
- currentCluster = this;
+ public View keyboardNavigationGroupSearch(
+ @KeyboardNavigationGroupType int groupType, View currentGroup, int direction) {
+ if (isKeyboardNavigationGroupOfType(groupType)) {
+ currentGroup = this;
}
if (isRootNamespace()
- || focusGroupType == FOCUS_GROUP_SECTION && isKeyboardNavigationCluster()) {
+ || (groupType == KEYBOARD_NAVIGATION_GROUP_SECTION
+ && isKeyboardNavigationCluster())) {
// Root namespace means we should consider ourselves the top of the
- // tree for cluster searching; otherwise we could be focus searching
+ // tree for group searching; otherwise we could be group searching
// into other tabs. see LocalActivityManager and TabHost for more info.
// In addition, a cluster node works as a root for section searches.
- return FocusFinder.getInstance().findNextKeyboardNavigationCluster(
- focusGroupType, this, currentCluster, direction);
+ return FocusFinder.getInstance().findNextKeyboardNavigationGroup(
+ groupType, this, currentGroup, direction);
} else if (mParent != null) {
- return mParent.keyboardNavigationClusterSearch(
- focusGroupType, currentCluster, direction);
+ return mParent.keyboardNavigationGroupSearch(
+ groupType, currentGroup, direction);
}
return null;
}
@@ -9283,18 +9367,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * Adds any keyboard navigation cluster roots that are descendants of this view (possibly
- * including this view if it is a cluster root itself) to views.
+ * Adds any keyboard navigation group roots that are descendants of this view (possibly
+ * including this view if it is a group root itself) to views. The group type can be either a
+ * cluster or a section.
*
- * @param focusGroupType Type of the focus group
- * @param views Cluster roots found so far
+ * @param groupType Type of the keyboard navigation group
+ * @param views Keyboard navigation group roots found so far
* @param direction Direction to look
*/
- public void addKeyboardNavigationClusters(
- @FocusGroupType int focusGroupType,
+ public void addKeyboardNavigationGroups(
+ @KeyboardNavigationGroupType int groupType,
@NonNull Collection<View> views,
int direction) {
- if (!(isFocusGroupOfType(focusGroupType))) {
+ if (!(isKeyboardNavigationGroupOfType(groupType))) {
return;
}
views.add(this);
@@ -14106,8 +14191,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* invalidated as well. This is usually true for a full
* invalidate, but may be set to false if the View's contents or
* dimensions have not changed.
+ * @hide
*/
- void invalidate(boolean invalidateCache) {
+ public void invalidate(boolean invalidateCache) {
invalidateInternal(0, 0, mRight - mLeft, mBottom - mTop, invalidateCache, true);
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 7835899d1419..1f1af4bf0094 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -1147,14 +1147,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
@Override
- public void addKeyboardNavigationClusters(
- @FocusGroupType int focusGroupType, Collection<View> views, int direction) {
+ public void addKeyboardNavigationGroups(
+ @KeyboardNavigationGroupType int groupType, Collection<View> views, int direction) {
final int focusableCount = views.size();
- super.addKeyboardNavigationClusters(focusGroupType, views, direction);
+ super.addKeyboardNavigationGroups(groupType, views, direction);
if (focusableCount != views.size()) {
- // No need to look for clusters inside a cluster.
+ // No need to look for groups inside a group.
return;
}
@@ -1167,13 +1167,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
for (int i = 0; i < count; i++) {
final View child = children[i];
- if (focusGroupType == FOCUS_GROUP_SECTION && child.isKeyboardNavigationCluster()) {
+ if (groupType == KEYBOARD_NAVIGATION_GROUP_SECTION
+ && child.isKeyboardNavigationCluster()) {
// When the current cluster is the default cluster, and we are searching for
// sections, ignore sections inside non-default clusters.
continue;
}
if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {
- child.addKeyboardNavigationClusters(focusGroupType, views, direction);
+ child.addKeyboardNavigationGroups(groupType, views, direction);
}
}
}
@@ -3155,18 +3156,34 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
/**
+ * Dispatch creation of {@link ViewStructure} down the hierarchy. This implementation
+ * adds in all child views of the view group, in addition to calling the default View
+ * implementation.
+ */
+ @Override
+ public void dispatchProvideStructure(ViewStructure structure) {
+ super.dispatchProvideStructure(structure);
+ dispatchProvideStructureForAssistOrAutoFill(structure, 0);
+ }
+
+ /**
* {@inheritDoc}
*
* <p>This implementation adds in all child views of the view group, in addition to calling the
* default {@link View} implementation.
*/
@Override
- public void dispatchProvideStructure(ViewStructure structure, int flags) {
- super.dispatchProvideStructure(structure, flags);
+ public void dispatchProvideAutoFillStructure(ViewStructure structure, int flags) {
+ super.dispatchProvideAutoFillStructure(structure, flags);
+ dispatchProvideStructureForAssistOrAutoFill(structure, flags);
+ }
+ private void dispatchProvideStructureForAssistOrAutoFill(ViewStructure structure, int flags) {
+ // NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
+ // this method should take a boolean with the type of request.
boolean forAutoFill = (flags
- & (View.ASSIST_FLAG_SANITIZED_TEXT
- | View.ASSIST_FLAG_NON_SANITIZED_TEXT)) != 0;
+ & (View.AUTO_FILL_FLAG_TYPE_FILL
+ | View.AUTO_FILL_FLAG_TYPE_SAVE)) != 0;
boolean blocked = forAutoFill ? isAutoFillBlocked() : isAssistBlocked();
@@ -3232,12 +3249,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
preorderedList, children, childIndex);
final ViewStructure cstructure = structure.newChild(i);
- // Must explicitly check which recursive method to call because child might
- // not be overriding the new, flags-based version
- if (flags == 0) {
- child.dispatchProvideStructure(cstructure);
+ // Must explicitly check which recursive method to call.
+ if (forAutoFill) {
+ child.dispatchProvideAutoFillStructure(cstructure, flags);
} else {
- child.dispatchProvideStructure(cstructure, flags);
+ child.dispatchProvideStructure(cstructure);
}
}
if (preorderedList != null) preorderedList.clear();
@@ -5339,11 +5355,96 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
/**
+ * HW-only, Rect-ignoring invalidation path.
+ *
+ * Returns false if this path was unable to complete successfully. This means
+ * it hit a ViewParent it doesn't recognize and needs to fall back to calculating
+ * damage area.
+ *
+ * Hardware acceleration ignores damage rectangles, since native computes damage for everything
+ * drawn by HWUI (and SW layer / drawing cache doesn't keep track of damage area).
+ *
+ * Ignores opaque dirty optimizations, always using the full PFLAG_DIRTY flag.
+ *
+ * Ignores FLAG_OPTIMIZE_INVALIDATE, since we're not computing a rect,
+ * so no point in optimizing that.
+ * @hide
+ */
+ public boolean tryInvalidateChildHardware(View child) {
+ final AttachInfo attachInfo = mAttachInfo;
+ if (attachInfo == null || !attachInfo.mHardwareAccelerated) {
+ return false;
+ }
+
+ // verify it's ViewGroups up to a ViewRootImpl
+ ViewRootImpl viewRoot = null;
+ ViewParent parent = getParent();
+ while (parent != null) {
+ if (parent instanceof ViewGroup) {
+ parent = parent.getParent();
+ } else if (parent instanceof ViewRootImpl) {
+ viewRoot = (ViewRootImpl) parent;
+ break;
+ } else {
+ // unknown parent type, abort
+ return false;
+ }
+ }
+ if (viewRoot == null) {
+ // unable to find ViewRoot
+ return false;
+ }
+
+ final boolean drawAnimation = (child.mPrivateFlags & PFLAG_DRAW_ANIMATION) != 0;
+
+ if (child.mLayerType != LAYER_TYPE_NONE) {
+ mPrivateFlags |= PFLAG_INVALIDATED;
+ }
+
+ parent = this;
+ do {
+ if (parent != viewRoot) {
+ // Note: we cast here without checking isinstance, to avoid cost of isinstance again
+ ViewGroup viewGroup = (ViewGroup) parent;
+ if (drawAnimation) {
+ viewGroup.mPrivateFlags |= PFLAG_DRAW_ANIMATION;
+ }
+
+ // We lazily use PFLAG_DIRTY, since computing opaque isn't worth the potential
+ // optimization in provides in a DisplayList world.
+ viewGroup.mPrivateFlags =
+ (viewGroup.mPrivateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DIRTY;
+
+ // simplified invalidateChildInParent behavior: clear cache validity to be safe,
+ // and mark inval if in layer
+ viewGroup.mPrivateFlags &= ~PFLAG_DRAWING_CACHE_VALID;
+ if (viewGroup.mLayerType != LAYER_TYPE_NONE) {
+ viewGroup.mPrivateFlags |= PFLAG_INVALIDATED;
+ }
+ } else {
+ if (drawAnimation) {
+ viewRoot.mIsAnimating = true;
+ }
+ ((ViewRootImpl) parent).invalidate();
+ return true;
+ }
+
+ parent = parent.getParent();
+ } while (parent != null);
+ return true;
+ }
+
+
+ /**
* Don't call or override this method. It is used for the implementation of
* the view hierarchy.
*/
@Override
public final void invalidateChild(View child, final Rect dirty) {
+ if (tryInvalidateChildHardware(child)) {
+ return;
+ }
+
ViewParent parent = this;
final AttachInfo attachInfo = mAttachInfo;
@@ -5351,8 +5452,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
// If the child is drawing an animation, we want to copy this flag onto
// ourselves and the parent to make sure the invalidate request goes
// through
- final boolean drawAnimation = (child.mPrivateFlags & PFLAG_DRAW_ANIMATION)
- == PFLAG_DRAW_ANIMATION;
+ final boolean drawAnimation = (child.mPrivateFlags & PFLAG_DRAW_ANIMATION) != 0;
// Check whether the child that requests the invalidate is fully opaque
// Views being animated or transformed are not considered opaque because we may
@@ -5453,10 +5553,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
*/
@Override
public ViewParent invalidateChildInParent(final int[] location, final Rect dirty) {
- if ((mPrivateFlags & PFLAG_DRAWN) == PFLAG_DRAWN ||
- (mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == PFLAG_DRAWING_CACHE_VALID) {
- if ((mGroupFlags & (FLAG_OPTIMIZE_INVALIDATE | FLAG_ANIMATION_DONE)) !=
- FLAG_OPTIMIZE_INVALIDATE) {
+ if ((mPrivateFlags & (PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID)) != 0) {
+ // either DRAWN, or DRAWING_CACHE_VALID
+ if ((mGroupFlags & (FLAG_OPTIMIZE_INVALIDATE | FLAG_ANIMATION_DONE))
+ != FLAG_OPTIMIZE_INVALIDATE) {
dirty.offset(location[CHILD_LEFT_INDEX] - mScrollX,
location[CHILD_TOP_INDEX] - mScrollY);
if ((mGroupFlags & FLAG_CLIP_CHILDREN) == 0) {
@@ -5471,35 +5571,28 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
dirty.setEmpty();
}
}
- mPrivateFlags &= ~PFLAG_DRAWING_CACHE_VALID;
location[CHILD_LEFT_INDEX] = left;
location[CHILD_TOP_INDEX] = top;
-
- if (mLayerType != LAYER_TYPE_NONE) {
- mPrivateFlags |= PFLAG_INVALIDATED;
- }
-
- return mParent;
-
} else {
- mPrivateFlags &= ~PFLAG_DRAWN & ~PFLAG_DRAWING_CACHE_VALID;
- location[CHILD_LEFT_INDEX] = mLeft;
- location[CHILD_TOP_INDEX] = mTop;
if ((mGroupFlags & FLAG_CLIP_CHILDREN) == FLAG_CLIP_CHILDREN) {
dirty.set(0, 0, mRight - mLeft, mBottom - mTop);
} else {
// in case the dirty rect extends outside the bounds of this container
dirty.union(0, 0, mRight - mLeft, mBottom - mTop);
}
+ location[CHILD_LEFT_INDEX] = mLeft;
+ location[CHILD_TOP_INDEX] = mTop;
- if (mLayerType != LAYER_TYPE_NONE) {
- mPrivateFlags |= PFLAG_INVALIDATED;
- }
-
- return mParent;
+ mPrivateFlags &= ~PFLAG_DRAWN;
+ }
+ mPrivateFlags &= ~PFLAG_DRAWING_CACHE_VALID;
+ if (mLayerType != LAYER_TYPE_NONE) {
+ mPrivateFlags |= PFLAG_INVALIDATED;
}
+
+ return mParent;
}
return null;
@@ -5512,7 +5605,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
* damage area
* @hide
*/
- public boolean damageChildDeferred(View child) {
+ public boolean damageChildDeferred() {
ViewParent parent = getParent();
while (parent != null) {
if (parent instanceof ViewGroup) {
@@ -5535,7 +5628,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
* @hide
*/
public void damageChild(View child, final Rect dirty) {
- if (damageChildDeferred(child)) {
+ if (damageChildDeferred()) {
return;
}
diff --git a/core/java/android/view/ViewOverlay.java b/core/java/android/view/ViewOverlay.java
index b770bd50c277..61cf0c7555c2 100644
--- a/core/java/android/view/ViewOverlay.java
+++ b/core/java/android/view/ViewOverlay.java
@@ -283,8 +283,9 @@ public class ViewOverlay {
}
}
+ /** @hide */
@Override
- void invalidate(boolean invalidateCache) {
+ public void invalidate(boolean invalidateCache) {
super.invalidate(invalidateCache);
if (mHostView != null) {
mHostView.invalidate(invalidateCache);
diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java
index c5414e925e0e..c9277ca0bfa1 100644
--- a/core/java/android/view/ViewParent.java
+++ b/core/java/android/view/ViewParent.java
@@ -18,7 +18,7 @@ package android.view;
import android.graphics.Rect;
import android.os.Bundle;
-import android.view.View.FocusGroupType;
+import android.view.View.KeyboardNavigationGroupType;
import android.view.accessibility.AccessibilityEvent;
/**
@@ -148,19 +148,20 @@ public interface ViewParent {
public View focusSearch(View v, int direction);
/**
- * Find the nearest keyboard navigation cluster in the specified direction.
- * This does not actually give focus to that cluster.
+ * Find the nearest keyboard navigation group in the specified direction. The group type can be
+ * either a cluster or a section.
+ * This does not actually give focus to that group.
*
- * @param focusGroupType Type of the focus group
- * @param currentCluster The starting point of the search. Null means the current cluster is not
- * found yet
+ * @param groupType Type of the keyboard navigation group
+ * @param currentGroup The starting point of the search. Null means the current group is not
+ * found yet
* @param direction Direction to look
*
- * @return The nearest keyboard navigation cluster in the specified direction, or null if none
+ * @return The nearest keyboard navigation group in the specified direction, or null if none
* can be found
*/
- View keyboardNavigationClusterSearch(
- @FocusGroupType int focusGroupType, View currentCluster, int direction);
+ View keyboardNavigationGroupSearch(
+ @KeyboardNavigationGroupType int groupType, View currentGroup, int direction);
/**
* Change the z order of the child so it's on top of all other children.
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 75ebbb70dfd2..b42f7695c3de 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -16,8 +16,8 @@
package android.view;
-import static android.view.View.FOCUS_GROUP_CLUSTER;
-import static android.view.View.FOCUS_GROUP_SECTION;
+import static android.view.View.KEYBOARD_NAVIGATION_GROUP_CLUSTER;
+import static android.view.View.KEYBOARD_NAVIGATION_GROUP_SECTION;
import static android.view.WindowCallbacks.RESIZE_MODE_DOCKED_DIVIDER;
import static android.view.WindowCallbacks.RESIZE_MODE_FREEFORM;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY;
@@ -73,7 +73,7 @@ import android.util.TimeUtils;
import android.util.TypedValue;
import android.view.Surface.OutOfResourcesException;
import android.view.View.AttachInfo;
-import android.view.View.FocusGroupType;
+import android.view.View.KeyboardNavigationGroupType;
import android.view.View.MeasureSpec;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
@@ -96,6 +96,7 @@ import com.android.internal.os.SomeArgs;
import com.android.internal.policy.PhoneFallbackEventHandler;
import com.android.internal.view.BaseSurfaceHolder;
import com.android.internal.view.RootViewSurfaceTaker;
+import com.android.internal.view.SurfaceCallbackHelper;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -240,7 +241,7 @@ public final class ViewRootImpl implements ViewParent,
int mWidth;
int mHeight;
Rect mDirty;
- boolean mIsAnimating;
+ public boolean mIsAnimating;
private boolean mDragResizing;
private boolean mInvalidateRootRequested;
@@ -261,7 +262,7 @@ public final class ViewRootImpl implements ViewParent,
final Rect mTempRect; // used in the transaction to not thrash the heap.
final Rect mVisRect; // used to retrieve visible rect of focused view.
- boolean mTraversalScheduled;
+ public boolean mTraversalScheduled;
int mTraversalBarrier;
boolean mWillDrawSoon;
/** Set to true while in performTraversals for detecting when die(true) is called from internal
@@ -528,11 +529,17 @@ public final class ViewRootImpl implements ViewParent,
*/
public void notifyChildRebuilt() {
if (mView instanceof RootViewSurfaceTaker) {
+ if (mSurfaceHolderCallback != null) {
+ mSurfaceHolder.removeCallback(mSurfaceHolderCallback);
+ }
+
mSurfaceHolderCallback =
((RootViewSurfaceTaker)mView).willYouTakeTheSurface();
+
if (mSurfaceHolderCallback != null) {
mSurfaceHolder = new TakenSurfaceHolder();
mSurfaceHolder.setFormat(PixelFormat.UNKNOWN);
+ mSurfaceHolder.addCallback(mSurfaceHolderCallback);
} else {
mSurfaceHolder = null;
}
@@ -581,6 +588,7 @@ public final class ViewRootImpl implements ViewParent,
if (mSurfaceHolderCallback != null) {
mSurfaceHolder = new TakenSurfaceHolder();
mSurfaceHolder.setFormat(PixelFormat.UNKNOWN);
+ mSurfaceHolder.addCallback(mSurfaceHolderCallback);
}
}
@@ -1957,7 +1965,6 @@ public final class ViewRootImpl implements ViewParent,
mSurfaceHolder.ungetCallbacks();
mIsCreating = true;
- mSurfaceHolderCallback.surfaceCreated(mSurfaceHolder);
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
if (callbacks != null) {
for (SurfaceHolder.Callback c : callbacks) {
@@ -1967,8 +1974,6 @@ public final class ViewRootImpl implements ViewParent,
surfaceChanged = true;
}
if (surfaceChanged || surfaceGenerationId != mSurface.getGenerationId()) {
- mSurfaceHolderCallback.surfaceChanged(mSurfaceHolder,
- lp.format, mWidth, mHeight);
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
if (callbacks != null) {
for (SurfaceHolder.Callback c : callbacks) {
@@ -1981,7 +1986,6 @@ public final class ViewRootImpl implements ViewParent,
} else if (hadSurface) {
mSurfaceHolder.ungetCallbacks();
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
- mSurfaceHolderCallback.surfaceDestroyed(mSurfaceHolder);
if (callbacks != null) {
for (SurfaceHolder.Callback c : callbacks) {
c.surfaceDestroyed(mSurfaceHolder);
@@ -2646,21 +2650,18 @@ public final class ViewRootImpl implements ViewParent,
if (LOCAL_LOGV) {
Log.v(mTag, "FINISHED DRAWING: " + mWindowAttributes.getTitle());
}
+
if (mSurfaceHolder != null && mSurface.isValid()) {
- mSurfaceHolderCallback.surfaceRedrawNeeded(mSurfaceHolder);
+ SurfaceCallbackHelper sch = new SurfaceCallbackHelper(mWindowSession, mWindow);
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
- if (callbacks != null) {
- for (SurfaceHolder.Callback c : callbacks) {
- if (c instanceof SurfaceHolder.Callback2) {
- ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(mSurfaceHolder);
- }
- }
+
+ sch.dispatchSurfaceRedrawNeededAsync(mSurfaceHolder, callbacks);
+ } else {
+ try {
+ mWindowSession.finishDrawing(mWindow);
+ } catch (RemoteException e) {
}
}
- try {
- mWindowSession.finishDrawing(mWindow);
- } catch (RemoteException e) {
- }
}
}
@@ -4395,14 +4396,14 @@ public final class ViewRootImpl implements ViewParent,
return false;
}
- private boolean performClusterNavigation(
- @FocusGroupType int focusGroupType, int direction) {
+ private boolean performKeyboardGroupNavigation(
+ @KeyboardNavigationGroupType int groupType, int direction) {
final View focused = mView.findFocus();
- final View cluster = focused != null
- ? focused.keyboardNavigationClusterSearch(focusGroupType, null, direction)
- : keyboardNavigationClusterSearch(focusGroupType, null, direction);
+ final View group = focused != null
+ ? focused.keyboardNavigationGroupSearch(groupType, null, direction)
+ : keyboardNavigationGroupSearch(groupType, null, direction);
- if (cluster != null && cluster.restoreLastFocus()) {
+ if (group != null && group.restoreLastFocus()) {
return true;
}
@@ -4421,20 +4422,20 @@ public final class ViewRootImpl implements ViewParent,
return FINISH_NOT_HANDLED;
}
- int clusterNavigationDirection = 0;
- @FocusGroupType int focusGroupType = 0;
+ int groupNavigationDirection = 0;
+ @KeyboardNavigationGroupType int groupType = 0;
if (event.getAction() == KeyEvent.ACTION_DOWN && event.isCtrlPressed()) {
final int character =
event.getUnicodeChar(event.getMetaState() & ~KeyEvent.META_CTRL_MASK);
if (character == '+') {
- focusGroupType = FOCUS_GROUP_CLUSTER;
- clusterNavigationDirection = View.FOCUS_FORWARD;
+ groupType = KEYBOARD_NAVIGATION_GROUP_CLUSTER;
+ groupNavigationDirection = View.FOCUS_FORWARD;
}
if (character == '_') {
- focusGroupType = FOCUS_GROUP_CLUSTER;
- clusterNavigationDirection = View.FOCUS_BACKWARD;
+ groupType = KEYBOARD_NAVIGATION_GROUP_CLUSTER;
+ groupNavigationDirection = View.FOCUS_BACKWARD;
}
}
@@ -4442,13 +4443,13 @@ public final class ViewRootImpl implements ViewParent,
final int character =
event.getUnicodeChar(event.getMetaState() & ~KeyEvent.META_ALT_MASK);
if (character == '+') {
- focusGroupType = FOCUS_GROUP_SECTION;
- clusterNavigationDirection = View.FOCUS_FORWARD;
+ groupType = KEYBOARD_NAVIGATION_GROUP_SECTION;
+ groupNavigationDirection = View.FOCUS_FORWARD;
}
if (character == '_') {
- focusGroupType = FOCUS_GROUP_SECTION;
- clusterNavigationDirection = View.FOCUS_BACKWARD;
+ groupType = KEYBOARD_NAVIGATION_GROUP_SECTION;
+ groupNavigationDirection = View.FOCUS_BACKWARD;
}
}
@@ -4457,7 +4458,7 @@ public final class ViewRootImpl implements ViewParent,
&& event.isCtrlPressed()
&& event.getRepeatCount() == 0
&& !KeyEvent.isModifierKey(event.getKeyCode())
- && clusterNavigationDirection == 0) {
+ && groupNavigationDirection == 0) {
if (mView.dispatchKeyShortcutEvent(event)) {
return FINISH_HANDLED;
}
@@ -4476,8 +4477,8 @@ public final class ViewRootImpl implements ViewParent,
// Handle automatic focus changes.
if (event.getAction() == KeyEvent.ACTION_DOWN) {
- if (clusterNavigationDirection != 0) {
- if (performClusterNavigation(focusGroupType, clusterNavigationDirection)) {
+ if (groupNavigationDirection != 0) {
+ if (performKeyboardGroupNavigation(groupType, groupNavigationDirection)) {
return FINISH_HANDLED;
}
} else {
@@ -5908,11 +5909,11 @@ public final class ViewRootImpl implements ViewParent,
* {@inheritDoc}
*/
@Override
- public View keyboardNavigationClusterSearch(
- @FocusGroupType int focusGroupType, View currentCluster, int direction) {
+ public View keyboardNavigationGroupSearch(
+ @KeyboardNavigationGroupType int groupType, View currentGroup, int direction) {
checkThread();
- return FocusFinder.getInstance().findNextKeyboardNavigationCluster(focusGroupType,
- mView, currentCluster, direction);
+ return FocusFinder.getInstance().findNextKeyboardNavigationGroup(groupType,
+ mView, currentGroup, direction);
}
public void debug() {
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index e9ff9d0edba6..839e11c01303 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -19,6 +19,10 @@ package android.view;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.os.Bundle;
+import android.view.autofill.AutoFillId;
+import android.view.autofill.AutoFillType;
+import android.view.autofill.AutoFillValue;
+import android.view.autofill.VirtualViewDelegate;
/**
* Container for storing additional per-view data generated by {@link View#onProvideStructure
@@ -258,6 +262,12 @@ public abstract class ViewStructure {
public abstract ViewStructure newChild(int index);
/**
+ * Like {@link #newChild(int)}, but providing a {@code virtualId} to the child so it can be
+ * auto-filled by {@link VirtualViewDelegate#autoFill(int, AutoFillValue)}.
+ */
+ public abstract ViewStructure newChild(int index, int virtualId);
+
+ /**
* Like {@link #newChild}, but allows the caller to asynchronously populate the returned
* child. It can transfer the returned {@link ViewStructure} to another thread for it
* to build its content (and children etc). Once done, some thread must call
@@ -268,6 +278,17 @@ public abstract class ViewStructure {
public abstract ViewStructure asyncNewChild(int index);
/**
+ * Like {@link #asyncNewChild(int)}, but providing a {@code virtualId} to the child so it can be
+ * auto-filled by {@link VirtualViewDelegate#autoFill(int, AutoFillValue)}.
+ */
+ public abstract ViewStructure asyncNewChild(int index, int virtualId);
+
+ /**
+ * Sets the {@link AutoFillType} that can be used to auto-fill this node.
+ */
+ public abstract void setAutoFillType(AutoFillType info);
+
+ /**
* Call when done populating a {@link ViewStructure} returned by
* {@link #asyncNewChild}.
*/
@@ -277,5 +298,8 @@ public abstract class ViewStructure {
public abstract Rect getTempRect();
/** @hide */
- public abstract void setAutoFillId(int autoFillId);
+ public abstract void setAutoFillId(int viewId);
+
+ /** @hide */
+ public abstract AutoFillId getAutoFillId();
}
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index caa09cccbab1..dd852567360f 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -437,6 +437,15 @@ public interface WindowManagerPolicy {
}
/**
+ * Holds the contents of a starting window. {@link #addSplashScreen} needs to wrap the
+ * contents of the starting window into an class implementing this interface, which then will be
+ * held by WM and passed into {@link #removeSplashScreen} when the starting window is no
+ * longer needed.
+ */
+ interface StartingSurface {
+ }
+
+ /**
* Interface for calling back in to the window manager that is private
* between it and the policy.
*/
@@ -738,17 +747,17 @@ public interface WindowManagerPolicy {
* context to for resources.
*
* @return Optionally you can return the View that was used to create the
- * window, for easy removal in removeStartingWindow.
+ * window, for easy removal in removeSplashScreen.
*
- * @see #removeStartingWindow
+ * @see #removeSplashScreen
*/
- public View addStartingWindow(IBinder appToken, String packageName,
- int theme, CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel,
- int labelRes, int icon, int logo, int windowFlags, Configuration overrideConfig);
+ public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme,
+ CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
+ int logo, int windowFlags, Configuration overrideConfig);
/**
* Called when the first window of an application has been displayed, while
- * {@link #addStartingWindow} has created a temporary initial window for
+ * {@link #addSplashScreen} has created a temporary initial window for
* that application. You should at this point remove the window from the
* window manager. This is called without the window manager locked so
* that you can call back into it.
@@ -759,11 +768,11 @@ public interface WindowManagerPolicy {
* even if you previously returned one.
*
* @param appToken Token of the application that has started.
- * @param window Window View that was returned by createStartingWindow.
+ * @param surface Surface that was returned by {@link #addSplashScreen}.
*
- * @see #addStartingWindow
+ * @see #addSplashScreen
*/
- public void removeStartingWindow(IBinder appToken, View window);
+ public void removeSplashScreen(IBinder appToken, StartingSurface surface);
/**
* Prepare for a window being added to the window manager. You can throw an
diff --git a/core/java/android/view/accessibility/AccessibilityCache.java b/core/java/android/view/accessibility/AccessibilityCache.java
index 9bc4bc7725ff..db2ea483f3ab 100644
--- a/core/java/android/view/accessibility/AccessibilityCache.java
+++ b/core/java/android/view/accessibility/AccessibilityCache.java
@@ -370,6 +370,9 @@ public final class AccessibilityCache {
mIsAllWindowsCached = false;
}
+ /**
+ * Clears nodes for the window with the given id
+ */
private void clearNodesForWindowLocked(int windowId) {
if (DEBUG) {
Log.i(LOG_TAG, "clearNodesForWindowLocked(" + windowId + ")");
diff --git a/core/java/android/view/animation/AnimationSet.java b/core/java/android/view/animation/AnimationSet.java
index 09d4dfc93b19..767024ecfecf 100644
--- a/core/java/android/view/animation/AnimationSet.java
+++ b/core/java/android/view/animation/AnimationSet.java
@@ -237,7 +237,7 @@ public class AnimationSet extends Animation {
mDuration = a.getStartOffset() + a.getDuration();
mLastEnd = mStartOffset + mDuration;
} else {
- mLastEnd = Math.max(mLastEnd, a.getStartOffset() + a.getDuration());
+ mLastEnd = Math.max(mLastEnd, mStartOffset + a.getStartOffset() + a.getDuration());
mDuration = mLastEnd - mStartOffset;
}
}
diff --git a/core/java/android/view/autofill/AutoFillId.aidl b/core/java/android/view/autofill/AutoFillId.aidl
new file mode 100644
index 000000000000..56f0338ccafb
--- /dev/null
+++ b/core/java/android/view/autofill/AutoFillId.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+parcelable AutoFillId; \ No newline at end of file
diff --git a/core/java/android/view/autofill/AutoFillId.java b/core/java/android/view/autofill/AutoFillId.java
new file mode 100644
index 000000000000..b7b694d26030
--- /dev/null
+++ b/core/java/android/view/autofill/AutoFillId.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * A unique identifier for an auto-fill node inside an {@link android.app.Activity}.
+ */
+public final class AutoFillId implements Parcelable {
+
+ private int mViewId;
+ private boolean mVirtual;
+ private int mVirtualId;
+
+ /** @hide */
+ public AutoFillId(int id) {
+ mVirtual = false;
+ mViewId = id;
+ }
+
+ /** @hide */
+ public AutoFillId(AutoFillId parent, int virtualChildId) {
+ mVirtual = true;
+ mViewId = parent.mViewId;
+ mVirtualId = virtualChildId;
+ }
+
+ /** @hide */
+ public int getViewId() {
+ return mViewId;
+ }
+
+ /** @hide */
+ public int getVirtualChildId() {
+ return mVirtualId;
+ }
+
+ /** @hide */
+ public boolean isVirtual() {
+ return mVirtual;
+ }
+
+ /////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + mViewId;
+ result = prime * result + mVirtualId;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ final AutoFillId other = (AutoFillId) obj;
+ if (mViewId != other.mViewId) return false;
+ if (mVirtualId != other.mVirtualId) return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ final StringBuilder builder = new StringBuilder("FieldId [viewId=").append(mViewId);
+ if (mVirtual) {
+ builder.append(", virtualId=").append(mVirtualId);
+ }
+ return builder.append(']').toString();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeInt(mViewId);
+ parcel.writeInt(mVirtual ? 1 : 0);
+ parcel.writeInt(mVirtualId);
+ }
+
+ private AutoFillId(Parcel parcel) {
+ mViewId = parcel.readInt();
+ mVirtual = parcel.readInt() == 1;
+ mVirtualId = parcel.readInt();
+ }
+
+ public static final Parcelable.Creator<AutoFillId> CREATOR =
+ new Parcelable.Creator<AutoFillId>() {
+ @Override
+ public AutoFillId createFromParcel(Parcel source) {
+ return new AutoFillId(source);
+ }
+
+ @Override
+ public AutoFillId[] newArray(int size) {
+ return new AutoFillId[size];
+ }
+ };
+}
diff --git a/core/java/android/view/autofill/AutoFillType.aidl b/core/java/android/view/autofill/AutoFillType.aidl
new file mode 100644
index 000000000000..a63d7c50f38b
--- /dev/null
+++ b/core/java/android/view/autofill/AutoFillType.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+parcelable AutoFillType; \ No newline at end of file
diff --git a/core/java/android/view/autofill/AutoFillType.java b/core/java/android/view/autofill/AutoFillType.java
new file mode 100644
index 000000000000..017f7f8ca3e8
--- /dev/null
+++ b/core/java/android/view/autofill/AutoFillType.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Defines the type of a object that can be used to auto-fill a {@link View} so the
+ * {@link android.service.autofill.AutoFillService} can use the proper {@link AutoFillValue} to
+ * fill it.
+ *
+ * <p>Some {@link AutoFillType}s can have an optional {@code sub-type}: the
+ * main {@code type} defines the view's UI control category (like a text field), while the optional
+ * {@code sub-type} define its semantics (like a postal address).
+ */
+public final class AutoFillType implements Parcelable {
+
+ // Cached instance for types that don't have subtype; it uses the "lazy initialization holder
+ // class idiom" (Effective Java, Item 71) to avoid memory utilization when auto-fill is not
+ // enabled.
+ private static class DefaultTypesHolder {
+ static final AutoFillType TOGGLE = new AutoFillType(TYPE_TOGGLE, 0);
+ static final AutoFillType LIST = new AutoFillType(TYPE_LIST, 0);
+ }
+
+ private static final int TYPE_TEXT = 1;
+ private static final int TYPE_TOGGLE = 2;
+ // TODO(b/33197203): make sure it works with Spinners and/or add a new type for them
+ // (since they're often used for credit card selection)
+ private static final int TYPE_LIST = 3;
+
+ // TODO(b/33197203): add others, like date picker? That would be trick, because they're set as:
+ // updateDate(int year, int month, int dayOfMonth)
+ // So, we would have to either use a long representing the Date.time(), or a custom long
+ // representing:
+ // year * 10000 + month * 100 + day
+ // Then a custom getDatePickerValue(Bundle) that returns an immutable object with these 3 fields
+
+ private final int mType;
+ private final int mSubType;
+
+ private AutoFillType(int type, int subType) {
+ mType = type;
+ mSubType = subType;
+ }
+
+ /**
+ * Checks if this is a type for a text field, which is filled by a {@link CharSequence}.
+ *
+ * <p>{@link AutoFillValue} instances for auto-filling a {@link View} can be obtained through
+ * {@link AutoFillValue#forText(CharSequence)}, and the value of a bundle passed to auto-fill a
+ * {@link View} can be fetched through {@link AutoFillValue#getTextValue()}.
+ *
+ * <p>Sub-type for this type is the value defined by {@link TextView#getInputType()}.
+ */
+ public boolean isText() {
+ return mType == TYPE_TEXT;
+ }
+
+ /**
+ * Checks if this is a a type for a togglable field, which is filled by a {@code boolean}.
+ *
+ * <p>{@link AutoFillValue} instances for auto-filling a {@link View} can be obtained through
+ * {@link AutoFillValue#forToggle(boolean)}, and the value of a bundle passed to auto-fill a
+ * {@link View} can be fetched through {@link AutoFillValue#getToggleValue()}.
+ *
+ * <p>This type has no sub-types.
+ */
+ public boolean isToggle() {
+ return mType == TYPE_TOGGLE;
+ }
+
+ /**
+ * Checks if this is a type for a selection list field, which is filled by a {@code integer}
+ * representing the element index inside the list (starting at {@code 0}.
+ *
+ * <p>{@link AutoFillValue} instances for auto-filling a {@link View} can be obtained through
+ * {@link AutoFillValue#forList(int)}, and the value of a bundle passed to auto-fill a
+ * {@link View} can be fetched through {@link AutoFillValue#getListValue()}.
+ *
+ * <p>This type has no sub-types.
+ */
+ public boolean isList() {
+ return mType == TYPE_LIST;
+ }
+
+
+ /**
+ * Gets the optional sub-type, representing the {@link View}'s semantic.
+ *
+ * @return {@code 0} if type does not support sub-types.
+ */
+ public int getSubType() {
+ return mSubType;
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ return "AutoFillType [type=" + mType + ", subType=" + mSubType + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + mSubType;
+ result = prime * result + mType;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ final AutoFillType other = (AutoFillType) obj;
+ if (mSubType != other.mSubType) return false;
+ if (mType != other.mType) return false;
+ return true;
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeInt(mType);
+ parcel.writeInt(mSubType);
+ }
+
+ private AutoFillType(Parcel parcel) {
+ mType = parcel.readInt();
+ mSubType = parcel.readInt();
+ }
+
+ public static final Parcelable.Creator<AutoFillType> CREATOR =
+ new Parcelable.Creator<AutoFillType>() {
+ @Override
+ public AutoFillType createFromParcel(Parcel source) {
+ return new AutoFillType(source);
+ }
+
+ @Override
+ public AutoFillType[] newArray(int size) {
+ return new AutoFillType[size];
+ }
+ };
+
+ ////////////////////
+ // Factory methods //
+ ////////////////////
+
+ /**
+ * Creates a text field type, which is filled by a {@link CharSequence}.
+ *
+ * <p>See {@link #isText()} for more info.
+ */
+ public static AutoFillType forText(int inputType) {
+ return new AutoFillType(TYPE_TEXT, inputType);
+ }
+
+ /**
+ * Creates a type that can be toggled which is filled by a {@code boolean}.
+ *
+ * <p>See {@link #isToggle()} for more info.
+ */
+ public static AutoFillType forToggle() {
+ return DefaultTypesHolder.TOGGLE;
+ }
+
+ /**
+ * Creates a selection list, which is filled by a {@code integer} representing the element index
+ * inside the list (starting at {@code 0}.
+ *
+ * <p>See {@link #isList()} for more info.
+ */
+ public static AutoFillType forList() {
+ return DefaultTypesHolder.LIST;
+ }
+}
diff --git a/core/java/android/view/autofill/AutoFillValue.aidl b/core/java/android/view/autofill/AutoFillValue.aidl
new file mode 100644
index 000000000000..3b284b96dc7c
--- /dev/null
+++ b/core/java/android/view/autofill/AutoFillValue.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+parcelable AutoFillValue; \ No newline at end of file
diff --git a/core/java/android/view/autofill/AutoFillValue.java b/core/java/android/view/autofill/AutoFillValue.java
new file mode 100644
index 000000000000..c39f26b9b864
--- /dev/null
+++ b/core/java/android/view/autofill/AutoFillValue.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.View;
+
+/**
+ * Abstracts how a {@link View} can be auto-filled by an
+ * {@link android.service.autofill.AutoFillService}.
+ *
+ * <p>Each {@link AutoFillValue} has a {@code type} and optionally a {@code sub-type}: the
+ * {@code type} defines the view's UI control category (like a text field), while the optional
+ * {@code sub-type} define its semantics (like a postal address).
+ */
+public final class AutoFillValue implements Parcelable {
+
+ private final CharSequence mText;
+ private final int mListIndex;
+ private final boolean mToggle;
+
+ private AutoFillValue(CharSequence text, int listIndex, boolean toggle) {
+ mText = text;
+ mListIndex = listIndex;
+ mToggle = toggle;
+ }
+
+ /**
+ * Gets the value to auto-fill a text field.
+ *
+ * <p>See {@link AutoFillType#isText()} for more info.
+ */
+ public CharSequence getTextValue() {
+ return mText;
+ }
+
+ /**
+ * Gets the value to auto-fill a toggable field.
+ *
+ * <p>See {@link AutoFillType#isToggle()} for more info.
+ */
+ public boolean getToggleValue() {
+ return mToggle;
+ }
+
+ /**
+ * Gets the value to auto-fill a selection list field.
+ *
+ * <p>See {@link AutoFillType#isList()} for more info.
+ */
+ public int getListValue() {
+ return mListIndex;
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ return "AutoFillValue[text=" + mText + ", listIndex=" + mListIndex + ", toggle=" + mToggle
+ + "]";
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeCharSequence(mText);
+ parcel.writeInt(mListIndex);
+ parcel.writeInt(mToggle ? 1 : 0);
+ }
+
+ private AutoFillValue(Parcel parcel) {
+ mText = parcel.readCharSequence();
+ mListIndex = parcel.readInt();
+ mToggle = parcel.readInt() == 1;
+ }
+
+ public static final Parcelable.Creator<AutoFillValue> CREATOR =
+ new Parcelable.Creator<AutoFillValue>() {
+ @Override
+ public AutoFillValue createFromParcel(Parcel source) {
+ return new AutoFillValue(source);
+ }
+
+ @Override
+ public AutoFillValue[] newArray(int size) {
+ return new AutoFillValue[size];
+ }
+ };
+
+ ////////////////////
+ // Factory methods //
+ ////////////////////
+
+ // TODO(b/33197203): add unit tests for each supported type (new / get should return same value)
+ /**
+ * Creates a new {@link AutoFillValue} to auto-fill a text field.
+ *
+ * <p>See {@link AutoFillType#isText()} for more info.
+ */
+ public static AutoFillValue forText(CharSequence value) {
+ return new AutoFillValue(value, 0, false);
+ }
+
+ /**
+ * Creates a new {@link AutoFillValue} to auto-fill a toggable field.
+ *
+ * <p>See {@link AutoFillType#isToggle()} for more info.
+ */
+ public static AutoFillValue forToggle(boolean value) {
+ return new AutoFillValue(null, 0, value);
+ }
+
+ /**
+ * Creates a new {@link AutoFillValue} to auto-fill a selection list field.
+ *
+ * <p>See {@link AutoFillType#isList()} for more info.
+ */
+ public static AutoFillValue forList(int value) {
+ return new AutoFillValue(null, value, false);
+ }
+}
diff --git a/core/java/android/view/autofill/Dataset.aidl b/core/java/android/view/autofill/Dataset.aidl
new file mode 100644
index 000000000000..2a8e67caace1
--- /dev/null
+++ b/core/java/android/view/autofill/Dataset.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+parcelable Dataset; \ No newline at end of file
diff --git a/core/java/android/view/autofill/Dataset.java b/core/java/android/view/autofill/Dataset.java
new file mode 100644
index 000000000000..a73eb7740e80
--- /dev/null
+++ b/core/java/android/view/autofill/Dataset.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+import static android.view.autofill.Helper.append;
+
+import android.app.Activity;
+import android.app.assist.AssistStructure.ViewNode;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.service.autofill.AutoFillService;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A set of data that can be used to auto-fill an {@link Activity}.
+ *
+ * <p>It contains:
+ *
+ * <ol>
+ * <li>A name used to identify the dataset in the UI.
+ * <li>A list of id/value pairs for the fields that can be auto-filled.
+ * <li>An optional {@link Bundle} with extras (used only by the service creating it).
+ * </ol>
+ *
+ * See {@link FillResponse} for examples.
+ */
+public final class Dataset implements Parcelable {
+
+ private final CharSequence mName;
+ private final ArrayList<DatasetField> mFields;
+ private final Bundle mExtras;
+
+ private Dataset(Dataset.Builder builder) {
+ mName = builder.mName;
+ // TODO(b/33197203): make an immutable copy of mFields?
+ mFields = builder.mFields;
+ mExtras = builder.mExtras;
+ }
+
+ /** @hide */
+ public CharSequence getName() {
+ return mName;
+ }
+
+ /** @hide */
+ public List<DatasetField> getFields() {
+ return mFields;
+ }
+
+ /** @hide */
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ final StringBuilder builder = new StringBuilder("Dataset [name=").append(mName)
+ .append(", fields=").append(mFields).append(", extras=");
+ append(builder, mExtras);
+ return builder.append(']').toString();
+ }
+
+ /**
+ * A builder for {@link Dataset} objects.
+ */
+ public static final class Builder {
+ private CharSequence mName;
+ private final ArrayList<DatasetField> mFields = new ArrayList<>();
+ private Bundle mExtras;
+
+ /**
+ * Creates a new builder.
+ *
+ * @param name Name used to identify the dataset in the UI. Typically it's the same value as
+ * the first field in the dataset (like username or email address) or an user-provided name
+ * (like "My Work Address").
+ */
+ public Builder(CharSequence name) {
+ mName = Preconditions.checkStringNotEmpty(name, "name cannot be empty or null");
+ }
+
+ /**
+ * Sets the value of a field.
+ *
+ * @param id id returned by {@link ViewNode#getAutoFillId()}.
+ * @param value value to be auto filled.
+ */
+ public Dataset.Builder setValue(AutoFillId id, AutoFillValue value) {
+ putField(new DatasetField(id, value));
+ return this;
+ }
+
+ /**
+ * Creates a new {@link Dataset} instance.
+ */
+ public Dataset build() {
+ return new Dataset(this);
+ }
+
+ /**
+ * Sets a {@link Bundle} that will be passed to subsequent calls to {@link AutoFillService}
+ * methods such as
+ * {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
+ * android.os.CancellationSignal, android.service.autofill.SaveCallback)}, using
+ * {@link AutoFillService#EXTRA_DATASET_EXTRAS} as the key.
+ *
+ * <p>It can be used to keep service state in between calls.
+ */
+ public Builder setExtras(Bundle extras) {
+ mExtras = Objects.requireNonNull(extras, "extras cannot be null");
+ return this;
+ }
+
+ /**
+ * Emulates {@code Map.put()} by adding a new field to the list if its id is not the yet,
+ * or replacing the existing one.
+ */
+ private void putField(DatasetField field) {
+ // TODO(b/33197203): check if already exists and replaces it if so
+ mFields.add(field);
+ }
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeCharSequence(mName);
+ parcel.writeList(mFields);
+ parcel.writeBundle(mExtras);
+ }
+
+ @SuppressWarnings("unchecked")
+ private Dataset(Parcel parcel) {
+ mName = parcel.readCharSequence();
+ mFields = parcel.readArrayList(null);
+ mExtras = parcel.readBundle();
+ }
+
+ public static final Parcelable.Creator<Dataset> CREATOR = new Parcelable.Creator<Dataset>() {
+ @Override
+ public Dataset createFromParcel(Parcel source) {
+ return new Dataset(source);
+ }
+
+ @Override
+ public Dataset[] newArray(int size) {
+ return new Dataset[size];
+ }
+ };
+}
diff --git a/core/java/android/view/autofill/DatasetField.java b/core/java/android/view/autofill/DatasetField.java
new file mode 100644
index 000000000000..c6b92acd5759
--- /dev/null
+++ b/core/java/android/view/autofill/DatasetField.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/** @hide */
+public final class DatasetField implements Parcelable {
+
+ private final AutoFillId mId;
+ private final AutoFillValue mValue;
+
+ DatasetField(AutoFillId id, AutoFillValue value) {
+ mId = id;
+ mValue = value;
+ }
+
+ public AutoFillId getId() {
+ return mId;
+ }
+
+ public AutoFillValue getValue() {
+ return mValue;
+ }
+
+ /////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////
+
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ return "DatasetField [id=" + mId + ", value=" + mValue + "]";
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeParcelable(mId, 0);
+ parcel.writeParcelable(mValue, 0);
+ }
+
+ private DatasetField(Parcel parcel) {
+ mId = parcel.readParcelable(null);
+ mValue = parcel.readParcelable(null);
+ }
+
+ public static final Parcelable.Creator<DatasetField> CREATOR =
+ new Parcelable.Creator<DatasetField>() {
+ @Override
+ public DatasetField createFromParcel(Parcel source) {
+ return new DatasetField(source);
+ }
+
+ @Override
+ public DatasetField[] newArray(int size) {
+ return new DatasetField[size];
+ }
+ };
+}
diff --git a/core/java/android/view/autofill/FieldId.aidl b/core/java/android/view/autofill/FieldId.aidl
new file mode 100644
index 000000000000..35af6453dbd1
--- /dev/null
+++ b/core/java/android/view/autofill/FieldId.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+parcelable FieldId; \ No newline at end of file
diff --git a/core/java/android/view/autofill/FillResponse.aidl b/core/java/android/view/autofill/FillResponse.aidl
new file mode 100644
index 000000000000..b018f15923ec
--- /dev/null
+++ b/core/java/android/view/autofill/FillResponse.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+parcelable FillResponse; \ No newline at end of file
diff --git a/core/java/android/view/autofill/FillResponse.java b/core/java/android/view/autofill/FillResponse.java
new file mode 100644
index 000000000000..3a147674965e
--- /dev/null
+++ b/core/java/android/view/autofill/FillResponse.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+import static android.view.autofill.Helper.append;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.service.autofill.AutoFillService;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Response for a
+ * {@link AutoFillService#onFillRequest(android.app.assist.AssistStructure, Bundle,
+ * android.os.CancellationSignal, android.service.autofill.FillCallback)}
+ * request.
+ *
+ * <p>The response typically contains one or more {@link Dataset}s, each representing a set of
+ * fields that can be auto-filled together. For example, for a login page with username/password
+ * where the user only have one account in the service, the response could be:
+ *
+ * <pre class="prettyprint">
+ * new FillResponse.Builder()
+ * .add(new Dataset.Builder("homer")
+ * .setTextFieldValue(id1, "homer")
+ * .setTextFieldValue(id2, "D'OH!")
+ * .build())
+ * .build();
+ * </pre>
+ *
+ * <p>If the user had 2 accounts, each with its own user-provided names, the response could be:
+ *
+ * <pre class="prettyprint">
+ * new FillResponse.Builder()
+ * .add(new Dataset.Builder("Homer's Account")
+ * .setTextFieldValue(id1, "homer")
+ * .setTextFieldValue(id2, "D'OH!")
+ * .build())
+ * .add(new Dataset.Builder("Bart's Account")
+ * .setTextFieldValue(id1, "elbarto")
+ * .setTextFieldValue(id2, "cowabonga")
+ * .build())
+ * .build();
+ * </pre>
+ *
+ * <p>If the user does not have any data associated with this {@link Activity} but the service
+ * wants to offer the user the option to save the data that was entered, then the service could
+ * populate the response with {@code savableIds} instead of {@link Dataset}s:
+ *
+ * <pre class="prettyprint">
+ * new FillResponse.Builder()
+ * .addSavableFields(id1, id2)
+ * .build();
+ * </pre>
+ *
+ * <p>Similarly, there might be cases where the user data on the service is enough to populate some
+ * fields but not all, and the service would still be interested on saving the other fields. In this
+ * scenario, the service could populate the response with both {@link Dataset}s and
+ * {@code savableIds}:
+ *
+ * <pre class="prettyprint">
+ * new FillResponse.Builder()
+ * .add(new Dataset.Builder("Homer")
+ * .setTextFieldValue(id1, "Homer") // first name
+ * .setTextFieldValue(id2, "Simpson") // last name
+ * .setTextFieldValue(id3, "742 Evergreen Terrace") // street
+ * .setTextFieldValue(id4, "Springfield") // city
+ * .build())
+ * .addSavableFields(id5, id6) // state and zipcode
+ * .build();
+ *
+ * </pre>
+ *
+ * <p>Notice that the ids that are part of a dataset (ids 1 to 4, in this example) are automatically
+ * added to the {@code savableIds} list.
+ *
+ * <p>If the service has multiple {@link Dataset}s with multiple options for some fields on each
+ * dataset (for example, multiple accounts with both a home and work address), then it should
+ * "partition" the {@link Activity} in sections and populate the response with just a subset of the
+ * data that would fulfill the first section; then once the user fills the first section and taps
+ * a field from the next section, the Android system would issue another request for that section,
+ * and so on. For example, the first response could be:
+ *
+ * <pre class="prettyprint">
+ * new FillResponse.Builder()
+ * .add(new Dataset.Builder("Homer")
+ * .setTextFieldValue(id1, "Homer")
+ * .setTextFieldValue(id2, "Simpson")
+ * .build())
+ * .add(new Dataset.Builder("Bart")
+ * .setTextFieldValue(id1, "Bart")
+ * .setTextFieldValue(id2, "Simpson")
+ * .build())
+ * .build();
+ * </pre>
+ *
+ * <p>Then after the user picks the {@code Homer} dataset and taps the {@code Street} field to
+ * trigger another auto-fill request, the second response could be:
+ *
+ * <pre class="prettyprint">
+ * new FillResponse.Builder()
+ * .add(new Dataset.Builder("Home")
+ * .setTextFieldValue(id3, "742 Evergreen Terrace")
+ * .setTextFieldValue(id4, "Springfield")
+ * .build())
+ * .add(new Dataset.Builder("Work")
+ * .setTextFieldValue(id3, "Springfield Nuclear Power Plant")
+ * .setTextFieldValue(id4, "Springfield")
+ * .build())
+ * .build();
+ * </pre>
+ *
+ * <p>Finally, the service can use the {@link FillResponse.Builder#setExtras(Bundle)} and/or
+ * {@link Dataset.Builder#setExtras(Bundle)} methods to pass
+ * a {@link Bundle} with service-specific data use to identify this response on future calls (like
+ * {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
+ * android.os.CancellationSignal, android.service.autofill.SaveCallback)}) - such bundle will be
+ * available as the {@link AutoFillService#EXTRA_RESPONSE_EXTRAS} extra in
+ * that method's {@code extras} argument.
+ */
+public final class FillResponse implements Parcelable {
+
+ private final List<Dataset> mDatasets;
+ private final AutoFillId[] mSavableIds;
+ private final Bundle mExtras;
+
+ private FillResponse(Builder builder) {
+ // TODO(b/33197203): make it immutable?
+ mDatasets = builder.mDatasets;
+ final int size = builder.mSavableIds.size();
+ mSavableIds = new AutoFillId[size];
+ int i = 0;
+ for (AutoFillId id : builder.mSavableIds) {
+ mSavableIds[i++] = id;
+ }
+ mExtras = builder.mExtras;
+ }
+
+ /** @hide */
+ public List<Dataset> getDatasets() {
+ return mDatasets;
+ }
+
+ /** @hide */
+ public AutoFillId[] getSavableIds() {
+ return mSavableIds;
+ }
+
+ /** @hide */
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ /**
+ * Builder for {@link FillResponse} objects.
+ */
+ public static final class Builder {
+ private final List<Dataset> mDatasets = new ArrayList<>();
+ private final Set<AutoFillId> mSavableIds = new HashSet<>();
+ private Bundle mExtras;
+
+ /**
+ * Adds a new {@link Dataset} to this response.
+ *
+ * @throws IllegalArgumentException if a dataset with same {@code name} already exists.
+ */
+ public Builder addDataset(Dataset dataset) {
+ Preconditions.checkNotNull(dataset, "dataset cannot be null");
+ // TODO(b/33197203): check if name already exists
+ // TODO(b/33197203): check if authId already exists (and update javadoc)
+ mDatasets.add(dataset);
+ for (DatasetField field : dataset.getFields()) {
+ mSavableIds.add(field.getId());
+ }
+ return this;
+ }
+
+ /**
+ * Adds ids of additional fields that the service would be interested to save (through
+ * {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
+ * android.os.CancellationSignal, android.service.autofill.SaveCallback)}) but were not
+ * indirectly set through {@link #addDataset(Dataset)}.
+ *
+ * <p>See {@link FillResponse} for examples.
+ */
+ public Builder addSavableFields(AutoFillId...ids) {
+ for (AutoFillId id : ids) {
+ mSavableIds.add(id);
+ }
+ return this;
+ }
+
+ /**
+ * Sets a {@link Bundle} that will be passed to subsequent calls to {@link AutoFillService}
+ * methods such as
+ * {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
+ * android.os.CancellationSignal, android.service.autofill.SaveCallback)}, using
+ * {@link AutoFillService#EXTRA_RESPONSE_EXTRAS} as the key.
+ *
+ * <p>It can be used when to keep service state in between calls.
+ */
+ public Builder setExtras(Bundle extras) {
+ mExtras = Objects.requireNonNull(extras, "extras cannot be null");
+ return this;
+ }
+
+ /**
+ * Builds a new {@link FillResponse} instance.
+ */
+ public FillResponse build() {
+ return new FillResponse(this);
+ }
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ final StringBuilder builder = new StringBuilder("FillResponse: [datasets=")
+ .append(mDatasets).append(", savableIds=").append(Arrays.toString(mSavableIds))
+ .append(", extras=");
+ append(builder, mExtras);
+ return builder.append(']').toString();
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeList(mDatasets);
+ parcel.writeParcelableArray(mSavableIds, 0);
+ parcel.writeBundle(mExtras);
+ }
+
+ private FillResponse(Parcel parcel) {
+ mDatasets = new ArrayList<>();
+ parcel.readList(mDatasets, null);
+ mSavableIds = parcel.readParcelableArray(null, AutoFillId.class);
+ mExtras = parcel.readBundle();
+ }
+
+ public static final Parcelable.Creator<FillResponse> CREATOR =
+ new Parcelable.Creator<FillResponse>() {
+ @Override
+ public FillResponse createFromParcel(Parcel source) {
+ return new FillResponse(source);
+ }
+
+ @Override
+ public FillResponse[] newArray(int size) {
+ return new FillResponse[size];
+ }
+ };
+}
diff --git a/core/java/android/view/autofill/Helper.java b/core/java/android/view/autofill/Helper.java
new file mode 100644
index 000000000000..772710e31b88
--- /dev/null
+++ b/core/java/android/view/autofill/Helper.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+import android.os.Bundle;
+
+import java.util.Set;
+
+/** @hide */
+public final class Helper {
+
+ // TODO(b/33197203): set to false when stable
+ static final boolean DEBUG = true;
+ static final String REDACTED = "[REDACTED]";
+
+ static void append(StringBuilder builder, Bundle bundle) {
+ if (bundle == null) {
+ builder.append("N/A");
+ } else if (!DEBUG) {
+ builder.append(REDACTED);
+ } else {
+ final Set<String> keySet = bundle.keySet();
+ builder.append("[bundle with ").append(keySet.size()).append(" extras:");
+ for (String key : keySet) {
+ builder.append(' ').append(key).append('=').append(bundle.get(key)).append(',');
+ }
+ builder.append(']');
+ }
+ }
+
+ private Helper() {
+ throw new UnsupportedOperationException("contains static members only");
+ }
+}
diff --git a/core/java/android/view/autofill/VirtualViewDelegate.java b/core/java/android/view/autofill/VirtualViewDelegate.java
new file mode 100644
index 000000000000..a19b4e53ba52
--- /dev/null
+++ b/core/java/android/view/autofill/VirtualViewDelegate.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.autofill;
+
+import android.util.Log;
+import android.view.View;
+import android.view.ViewStructure;
+
+/**
+ * This class is the contract a client should implement to enable support of a
+ * virtual view hierarchy rooted at a given view for auto-fill purposes.
+ *
+ * <p>The view hierarchy is typically created through the
+ * {@link View#onProvideAutoFillVirtualStructure(android.view.ViewStructure, int)} call and client
+ * add virtual children by calling {@link ViewStructure#newChild(int, int)} or
+ * {@link ViewStructure#asyncNewChild(int, int)}, where the client provides the {@code virtualId}
+ * of the children - the same {@code virtualId} is used in the methods of this class.
+ *
+ * <p>Objects of this class are typically created by overriding
+ * {@link View#getAutoFillVirtualViewDelegate(Callback)} and saving the passed callback, which must
+ * be notified upon changes on the hierarchy.
+ *
+ * <p>The main use case of these API is to enable custom views that draws its content - such as
+ * {@link android.webkit.WebView} providers - to support the AutoFill Framework:
+ *
+ * <ol>
+ * <li>Client populates the virtual hierarchy on
+ * {@link View#onProvideAutoFillVirtualStructure(android.view.ViewStructure, int)}
+ * <li>Android System generates the proper {@link AutoFillId} - encapsulating the view and the
+ * virtual node ids - and pass it to the {@link android.service.autofill.AutoFillService}.
+ * <li>The service uses the {@link AutoFillId} to populate the auto-fill {@link Dataset}s and pass
+ * it back to the Android System.
+ * <li>Android System uses the {@link AutoFillId} to find the proper custom view and calls
+ * {@link #autoFill(int, AutoFillValue)} on that view passing the virtual id.
+ * <li>This provider than finds the node in the hierarchy and auto-fills it.
+ * </ol>
+ *
+ */
+public abstract class VirtualViewDelegate {
+
+ // TODO(b/33197203): set to false once stable
+ private static final boolean DEBUG = true;
+
+ private static final String TAG = "VirtualViewDelegate";
+
+ /**
+ * Auto-fills a virtual view with the {@code value}.
+ *
+ * @param virtualId id identifying the virtual node inside the custom view.
+ * @param value value to be auto-filled.
+ */
+ public abstract void autoFill(int virtualId, AutoFillValue value);
+
+ /**
+ * Callback used to notify the AutoFill Framework of changes made on the view hierarchy while
+ * an {@link android.app.Activity} is being auto filled.
+ */
+ public abstract static class Callback {
+
+ /**
+ * Sent when the focus inside the hierarchy changed.
+ *
+ * <p>Typically callled twice - for the nodes that lost and gained focus.
+ *
+ * <p>This method should only be called when the change was not caused by the AutoFill
+ * Framework itselft (i.e, through {@link VirtualViewDelegate#autoFill(int, AutoFillValue)},
+ * but by external causes (for example, when the user changed the value through the view's
+ * UI).
+ *
+ * @param virtualId id of the node whose focus changed.
+ * @param hasFocus {@code true} when focus was gained, {@code false} when it was lost.
+ */
+ public void onFocusChanged(int virtualId, boolean hasFocus) {
+ if (DEBUG) Log.d(TAG, "onFocusChanged() for " + virtualId + ": " + hasFocus);
+ }
+
+ /**
+ * Sent when the value of a node was changed.
+ *
+ * <p>This method should only be called when the change was not caused by the AutoFill
+ * Framework itselft (i.e, through {@link VirtualViewDelegate#autoFill(int, AutoFillValue)},
+ * but by external causes (for example, when the user changed the value through the view's
+ * UI).
+ *
+ * @param virtualId id of the node whose value changed.
+ */
+ public void onValueChanged(int virtualId) {
+ if (DEBUG) Log.d(TAG, "onValueChanged() for" + virtualId);
+ }
+
+ /**
+ * Sent when nodes were removed (or had their ids changed) after the hierarchy has been
+ * committed to
+ * {@link View#onProvideAutoFillVirtualStructure(android.view.ViewStructure, int)}.
+ *
+ * <p>For example, when the view is rendering an {@code HTML} page, it should call this
+ * method when:
+ * <ul>
+ * <li>User navigated to another page and some (or all) nodes are gone.
+ * <li>The page's {@code DOM} was changed by {@code JavaScript} and some nodes moved (and
+ * are now identified by different ids).
+ * </ul>
+ *
+ * @param virtualIds id of the nodes that were removed.
+ */
+ public void onNodeRemoved(int... virtualIds) {
+ if (DEBUG) Log.d(TAG, "onNodeRemoved(): " + virtualIds);
+ }
+ }
+}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 8ecc42de12df..f98c099f053f 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2515,8 +2515,8 @@ public class WebView extends AbsoluteLayout
}
@Override
- public void onProvideVirtualStructure(ViewStructure structure, int flags) {
- mProvider.getViewDelegate().onProvideVirtualStructure(structure, flags);
+ public void onProvideAutoFillVirtualStructure(ViewStructure structure, int flags) {
+ mProvider.getViewDelegate().onProvideAutoFillVirtualStructure(structure, flags);
}
/** @hide */
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index 7b951806f097..dd1b0d2d17a4 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -312,7 +312,7 @@ public interface WebViewProvider {
public void onProvideVirtualStructure(android.view.ViewStructure structure);
@SuppressWarnings("unused")
- public default void onProvideVirtualStructure(android.view.ViewStructure structure,
+ public default void onProvideAutoFillVirtualStructure(android.view.ViewStructure structure,
int flags) {
}
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index 3213a34e28f1..718070d0d49a 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -34,6 +34,8 @@ import android.view.ViewDebug;
import android.view.ViewHierarchyEncoder;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.autofill.AutoFillType;
+import android.view.autofill.AutoFillValue;
import com.android.internal.R;
@@ -52,6 +54,7 @@ import com.android.internal.R;
* </p>
*/
public abstract class CompoundButton extends Button implements Checkable {
+
private boolean mChecked;
private boolean mBroadcasting;
@@ -111,6 +114,7 @@ public abstract class CompoundButton extends Button implements Checkable {
applyButtonTint();
}
+ @Override
public void toggle() {
setChecked(!mChecked);
}
@@ -130,6 +134,7 @@ public abstract class CompoundButton extends Button implements Checkable {
}
@ViewDebug.ExportedProperty
+ @Override
public boolean isChecked() {
return mChecked;
}
@@ -139,6 +144,7 @@ public abstract class CompoundButton extends Button implements Checkable {
*
* @param checked true to check the button, false to uncheck it
*/
+ @Override
public void setChecked(boolean checked) {
if (mChecked != checked) {
mChecked = checked;
@@ -514,12 +520,15 @@ public abstract class CompoundButton extends Button implements Checkable {
+ " checked=" + checked + "}";
}
- public static final Parcelable.Creator<SavedState> CREATOR
- = new Parcelable.Creator<SavedState>() {
+ @SuppressWarnings("hiding")
+ public static final Parcelable.Creator<SavedState> CREATOR =
+ new Parcelable.Creator<SavedState>() {
+ @Override
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
+ @Override
public SavedState[] newArray(int size) {
return new SavedState[size];
}
@@ -551,4 +560,16 @@ public abstract class CompoundButton extends Button implements Checkable {
super.encodeProperties(stream);
stream.addProperty("checked", isChecked());
}
+
+ // TODO(b/33197203): add unit/CTS tests for auto-fill methods
+
+ @Override
+ public void autoFill(AutoFillValue value) {
+ setChecked(value.getToggleValue());
+ }
+
+ @Override
+ public AutoFillType getAutoFillType() {
+ return AutoFillType.forToggle();
+ }
}
diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java
index 043eb348a706..af5c8426a44a 100644
--- a/core/java/android/widget/EditText.java
+++ b/core/java/android/widget/EditText.java
@@ -24,8 +24,10 @@ import android.text.TextUtils;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.MovementMethod;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;
-
+import android.view.autofill.AutoFillType;
+import android.view.autofill.AutoFillValue;
/*
* This is supposed to be a *very* thin veneer over TextView.
@@ -154,4 +156,26 @@ public class EditText extends TextView {
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SET_TEXT);
}
}
+
+ // TODO(b/33197203): add unit/CTS tests for auto-fill methods
+
+ @Override
+ public void autoFill(AutoFillValue value) {
+ final CharSequence text = value.getTextValue();
+
+ if (text == null) {
+ Log.w(VIEW_LOG_TAG, "EditText.autoFill(): no text on AutoFillValue");
+ return;
+ }
+ // TODO(b/33197203): once auto-fill is triggered by the IME, we'll need a new setText()
+ // or setAutoFillText() method on TextView to avoid re-triggering it.
+ setText(text);
+ }
+
+ @Override
+ public AutoFillType getAutoFillType() {
+ // TODO(b/33197203): ideally it should return a constant, but value returned by
+ // getInputType() can change.
+ return AutoFillType.forText(getInputType());
+ }
}
diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java
index 54b57631366f..45fd9e6ef5a7 100644
--- a/core/java/android/widget/RadioGroup.java
+++ b/core/java/android/widget/RadioGroup.java
@@ -16,12 +16,16 @@
package android.widget;
+
import android.annotation.IdRes;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
+import android.view.autofill.AutoFillType;
+import android.view.autofill.AutoFillValue;
import com.android.internal.R;
@@ -51,6 +55,7 @@ import com.android.internal.R;
*
*/
public class RadioGroup extends LinearLayout {
+
// holds the checked id; the selection is empty by default
private int mCheckedId = -1;
// tracks children radio buttons checked state
@@ -335,6 +340,7 @@ public class RadioGroup extends LinearLayout {
}
private class CheckedStateTracker implements CompoundButton.OnCheckedChangeListener {
+ @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// prevents from infinite recursion
if (mProtectFromCheckedChange) {
@@ -364,6 +370,7 @@ public class RadioGroup extends LinearLayout {
/**
* {@inheritDoc}
*/
+ @Override
public void onChildViewAdded(View parent, View child) {
if (parent == RadioGroup.this && child instanceof RadioButton) {
int id = child.getId();
@@ -384,6 +391,7 @@ public class RadioGroup extends LinearLayout {
/**
* {@inheritDoc}
*/
+ @Override
public void onChildViewRemoved(View parent, View child) {
if (parent == RadioGroup.this && child instanceof RadioButton) {
((RadioButton) child).setOnCheckedChangeWidgetListener(null);
@@ -394,4 +402,22 @@ public class RadioGroup extends LinearLayout {
}
}
}
+
+ // TODO(b/33197203): add unit/CTS tests for auto-fill methods
+
+ @Override
+ public void autoFill(AutoFillValue value) {
+ final int index = value.getListValue();
+ final View child = getChildAt(index);
+ if (child == null) {
+ Log.w(VIEW_LOG_TAG, "RadioGroup.autoFill(): no child with index " + index);
+ return;
+ }
+ check(child.getId());
+ }
+
+ @Override
+ public AutoFillType getAutoFillType() {
+ return AutoFillType.forList();
+ }
}
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index e629df9bd3df..a9257e6014cf 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -1404,10 +1404,19 @@ public class Switch extends CompoundButton {
}
@Override
- public void onProvideStructure(ViewStructure structure, int flags) {
- super.onProvideStructure(structure, flags);
+ public void onProvideStructure(ViewStructure structure) {
+ super.onProvideStructure(structure);
+ onProvideAutoFillStructureForAssistOrAutoFill(structure);
+ }
+
+ @Override
+ public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutoFillStructure(structure, flags);
+ onProvideAutoFillStructureForAssistOrAutoFill(structure);
+ }
- // NOTE: current there is no difference for Assist (flags=0) or AutoFill (flags>0);
+ // NOTE: currently there is no difference for Assist or AutoFill, so it doesn't take flags
+ private void onProvideAutoFillStructureForAssistOrAutoFill(ViewStructure structure) {
CharSequence switchText = isChecked() ? mTextOn : mTextOff;
if (!TextUtils.isEmpty(switchText)) {
CharSequence oldText = structure.getText();
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 1961bf6b7e15..1ddf53d8b19a 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -596,6 +596,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private int mBreakStrategy;
private int mHyphenationFrequency;
+ private boolean mJustify;
private int mMaximum = Integer.MAX_VALUE;
private int mMaxMode = LINES;
@@ -769,6 +770,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
String fontFeatureSettings = null;
mBreakStrategy = Layout.BREAK_STRATEGY_SIMPLE;
mHyphenationFrequency = Layout.HYPHENATION_FREQUENCY_NONE;
+ mJustify = false;
final Resources.Theme theme = context.getTheme();
@@ -3298,6 +3300,29 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
+ * Enables or disables full justification. The default value is false.
+ *
+ * @see #getJustify()
+ */
+ public void setJustify(boolean justify) {
+ mJustify = justify;
+ if (mLayout != null) {
+ nullLayouts();
+ requestLayout();
+ invalidate();
+ }
+ }
+
+ /**
+ * @return true if currently paragraph justification is enabled.
+ *
+ * @see #setJustify(boolean)
+ */
+ public boolean getJustify() {
+ return mJustify;
+ }
+
+ /**
* Sets font feature settings. The format is the same as the CSS
* font-feature-settings attribute:
* <a href="https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop">
@@ -7170,6 +7195,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
.setIncludePad(mIncludePad)
.setBreakStrategy(mBreakStrategy)
.setHyphenationFrequency(mHyphenationFrequency)
+ .setJustify(mJustify)
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE);
if (shouldEllipsize) {
builder.setEllipsize(mEllipsize)
@@ -7211,7 +7237,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (mText instanceof Spannable) {
result = new DynamicLayout(mText, mTransformed, mTextPaint, wantWidth,
alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad,
- mBreakStrategy, mHyphenationFrequency,
+ mBreakStrategy, mHyphenationFrequency, mJustify,
getKeyListener() == null ? effectiveEllipsize : null, ellipsisWidth);
} else {
if (boring == UNKNOWN_BORING) {
@@ -7261,6 +7287,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
.setIncludePad(mIncludePad)
.setBreakStrategy(mBreakStrategy)
.setHyphenationFrequency(mHyphenationFrequency)
+ .setJustify(mJustify)
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE);
if (shouldEllipsize) {
builder.setEllipsize(effectiveEllipsize)
@@ -9391,11 +9418,23 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
@Override
- public void onProvideStructure(ViewStructure structure, int flags) {
- super.onProvideStructure(structure, flags);
+ public void onProvideStructure(ViewStructure structure) {
+ super.onProvideStructure(structure);
+ onProvideAutoStructureForAssistOrAutoFill(structure, 0);
+ }
+ @Override
+ public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutoFillStructure(structure, flags);
+ onProvideAutoStructureForAssistOrAutoFill(structure, flags);
+ }
+
+ private void onProvideAutoStructureForAssistOrAutoFill(ViewStructure structure, int flags) {
+ // NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
+ // this method should take a boolean with the type of request.
final boolean forAutoFillSave =
- (flags & ASSIST_FLAG_NON_SANITIZED_TEXT) != 0;
+ (flags & AUTO_FILL_FLAG_TYPE_SAVE) != 0;
+
final boolean isPassword = hasPasswordTransformationMethod()
|| isPasswordInputType(getInputType());
if (!isPassword || forAutoFillSave) {
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 293de3d71332..e1e0a21eb7f5 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -85,6 +85,9 @@ public final class Zygote {
* file descriptor numbers that are to be closed by the child
* (and replaced by /dev/null) after forking. An integer value
* of -1 in any entry in the array means "ignore this one".
+ * @param fdsToIgnore null-ok an array of ints, either null or holding
+ * one or more POSIX file descriptor numbers that are to be ignored
+ * in the file descriptor table check.
* @param instructionSet null-ok the instruction set to use.
* @param appDataDir null-ok the data directory of the app.
*
@@ -93,11 +96,11 @@ public final class Zygote {
*/
public static int forkAndSpecialize(int uid, int gid, int[] gids, int debugFlags,
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
- String instructionSet, String appDataDir) {
+ int[] fdsToIgnore, String instructionSet, String appDataDir) {
VM_HOOKS.preFork();
int pid = nativeForkAndSpecialize(
uid, gid, gids, debugFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose,
- instructionSet, appDataDir);
+ fdsToIgnore, instructionSet, appDataDir);
// Enable tracing as soon as possible for the child process.
if (pid == 0) {
Trace.setTracingEnabled(true);
@@ -111,7 +114,7 @@ public final class Zygote {
native private static int nativeForkAndSpecialize(int uid, int gid, int[] gids,int debugFlags,
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
- String instructionSet, String appDataDir);
+ int[] fdsToIgnore, String instructionSet, String appDataDir);
/**
* Special method to start the system server process. In addition to the
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 345350cc45fb..83e3cff360f4 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -196,11 +196,14 @@ class ZygoteConnection {
rlimits = parsedArgs.rlimits.toArray(intArray2d);
}
+ int[] fdsToIgnore = null;
+
if (parsedArgs.invokeWith != null) {
FileDescriptor[] pipeFds = Os.pipe2(O_CLOEXEC);
childPipeFd = pipeFds[1];
serverPipeFd = pipeFds[0];
Os.fcntlInt(childPipeFd, F_SETFD, 0);
+ fdsToIgnore = new int[] { childPipeFd.getInt$(), serverPipeFd.getInt$() };
}
/**
@@ -233,7 +236,7 @@ class ZygoteConnection {
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
- parsedArgs.niceName, fdsToClose, parsedArgs.instructionSet,
+ parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.instructionSet,
parsedArgs.appDataDir);
} catch (ErrnoException ex) {
logAndPrintError(newStderr, "Exception creating pipe", ex);
diff --git a/core/java/com/android/internal/view/BaseSurfaceHolder.java b/core/java/com/android/internal/view/BaseSurfaceHolder.java
index b41ef297a5be..32ce0fe1282b 100644
--- a/core/java/com/android/internal/view/BaseSurfaceHolder.java
+++ b/core/java/com/android/internal/view/BaseSurfaceHolder.java
@@ -86,7 +86,7 @@ public abstract class BaseSurfaceHolder implements SurfaceHolder {
mCallbacks.remove(callback);
}
}
-
+
public SurfaceHolder.Callback[] getCallbacks() {
if (mHaveGottenCallbacks) {
return mGottenCallbacks;
diff --git a/core/java/com/android/internal/view/IInputConnectionWrapper.java b/core/java/com/android/internal/view/IInputConnectionWrapper.java
index 4f7b106a83fe..0185e306118f 100644
--- a/core/java/com/android/internal/view/IInputConnectionWrapper.java
+++ b/core/java/com/android/internal/view/IInputConnectionWrapper.java
@@ -562,8 +562,6 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
}
case DO_COMMIT_CONTENT: {
final int flags = msg.arg1;
- final boolean grantUriPermission =
- (flags & InputConnection.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0;
SomeArgs args = (SomeArgs) msg.obj;
try {
InputConnection ic = getInputConnection();
@@ -579,22 +577,8 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
args.callback.setCommitContentResult(false, args.seq);
return;
}
- if (grantUriPermission) {
- try {
- inputContentInfo.requestPermission();
- } catch (Exception e) {
- Log.e(TAG, "InputConnectionInfo.requestPermission() failed", e);
- args.callback.setCommitContentResult(false, args.seq);
- return;
- }
- }
final boolean result =
ic.commitContent(inputContentInfo, flags, (Bundle) args.arg2);
- // If this request is not handled, then there is no reason to keep the URI
- // permission.
- if (grantUriPermission && !result) {
- inputContentInfo.releasePermission();
- }
args.callback.setCommitContentResult(result, args.seq);
} catch (RemoteException e) {
Log.w(TAG, "Got RemoteException calling commitContent", e);
diff --git a/core/java/com/android/internal/view/SurfaceCallbackHelper.java b/core/java/com/android/internal/view/SurfaceCallbackHelper.java
new file mode 100644
index 000000000000..5b6a82cf1c43
--- /dev/null
+++ b/core/java/com/android/internal/view/SurfaceCallbackHelper.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.view;
+
+import android.os.RemoteException;
+import android.view.IWindow;
+import android.view.IWindowSession;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+
+public class SurfaceCallbackHelper {
+ IWindowSession mSession;
+ IWindow.Stub mWindow;
+
+ int mFinishDrawingCollected = 0;
+ int mFinishDrawingExpected = 0;
+
+ private Runnable mFinishDrawingRunnable = new Runnable() {
+ @Override
+ public void run() {
+ synchronized (SurfaceCallbackHelper.this) {
+ mFinishDrawingCollected++;
+ if (mFinishDrawingCollected < mFinishDrawingExpected) {
+ return;
+ }
+ try {
+ mSession.finishDrawing(mWindow);
+ } catch (RemoteException e) {
+ }
+ }
+ }
+ };
+
+ public SurfaceCallbackHelper(IWindowSession session,
+ IWindow.Stub window) {
+ mSession = session;
+ mWindow = window;
+ }
+
+ public void dispatchSurfaceRedrawNeededAsync(SurfaceHolder holder, SurfaceHolder.Callback callbacks[]) {
+ if (callbacks == null || callbacks.length == 0) {
+ try {
+ mSession.finishDrawing(mWindow);
+ } catch (RemoteException e) {
+ }
+ return;
+ }
+
+ synchronized (this) {
+ mFinishDrawingExpected = callbacks.length;
+ mFinishDrawingCollected = 0;
+ }
+
+ for (SurfaceHolder.Callback c : callbacks) {
+ if (c instanceof SurfaceHolder.Callback2) {
+ ((SurfaceHolder.Callback2) c).surfaceRedrawNeededAsync(
+ holder, mFinishDrawingRunnable);
+ } else {
+ mFinishDrawingRunnable.run();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/core/java/com/android/internal/widget/SwipeDismissLayout.java b/core/java/com/android/internal/widget/SwipeDismissLayout.java
index b5d62689d34e..2a5957ce0ca2 100644
--- a/core/java/com/android/internal/widget/SwipeDismissLayout.java
+++ b/core/java/com/android/internal/widget/SwipeDismissLayout.java
@@ -23,6 +23,7 @@ import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.TypedArray;
@@ -33,7 +34,6 @@ import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
@@ -44,7 +44,6 @@ public class SwipeDismissLayout extends FrameLayout {
private static final String TAG = "SwipeDismissLayout";
private static final float DISMISS_MIN_DRAG_WIDTH_RATIO = .33f;
- private boolean mUseDynamicTranslucency = true;
public interface OnDismissedListener {
void onDismissed(SwipeDismissLayout layout);
@@ -64,6 +63,8 @@ public class SwipeDismissLayout extends FrameLayout {
void onSwipeCancelled(SwipeDismissLayout layout);
}
+ private boolean mIsWindowNativelyTranslucent;
+
// Cached ViewConfiguration and system-wide constant values
private int mSlop;
private int mMinFlingVelocity;
@@ -78,24 +79,12 @@ public class SwipeDismissLayout extends FrameLayout {
private VelocityTracker mVelocityTracker;
private float mTranslationX;
private boolean mBlockGesture = false;
+ private boolean mActivityTranslucencyConverted = false;
private final DismissAnimator mDismissAnimator = new DismissAnimator();
private OnDismissedListener mDismissedListener;
private OnSwipeProgressChangedListener mProgressListener;
- private ViewTreeObserver.OnEnterAnimationCompleteListener mOnEnterAnimationCompleteListener =
- new ViewTreeObserver.OnEnterAnimationCompleteListener() {
- @Override
- public void onEnterAnimationComplete() {
- // SwipeDismissLayout assumes that the host Activity is translucent
- // and temporarily disables translucency when it is fully visible.
- // As soon as the user starts swiping, we will re-enable
- // translucency.
- if (mUseDynamicTranslucency && getContext() instanceof Activity) {
- ((Activity) getContext()).convertFromTranslucent();
- }
- }
- };
private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
private Runnable mRunnable = new Runnable() {
@Override
@@ -141,8 +130,8 @@ public class SwipeDismissLayout extends FrameLayout {
mMinFlingVelocity = vc.getScaledMinimumFlingVelocity();
TypedArray a = context.getTheme().obtainStyledAttributes(
com.android.internal.R.styleable.Theme);
- mUseDynamicTranslucency = !a.hasValue(
- com.android.internal.R.styleable.Window_windowIsTranslucent);
+ mIsWindowNativelyTranslucent = a.getBoolean(
+ com.android.internal.R.styleable.Window_windowIsTranslucent, false);
a.recycle();
}
@@ -157,20 +146,12 @@ public class SwipeDismissLayout extends FrameLayout {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- if (getContext() instanceof Activity) {
- getViewTreeObserver().addOnEnterAnimationCompleteListener(
- mOnEnterAnimationCompleteListener);
- }
getContext().registerReceiver(mScreenOffReceiver, mScreenOffFilter);
}
@Override
protected void onDetachedFromWindow() {
getContext().unregisterReceiver(mScreenOffReceiver);
- if (getContext() instanceof Activity) {
- getViewTreeObserver().removeOnEnterAnimationCompleteListener(
- mOnEnterAnimationCompleteListener);
- }
super.onDetachedFromWindow();
}
@@ -273,9 +254,6 @@ public class SwipeDismissLayout extends FrameLayout {
mLastX = ev.getRawX();
updateSwiping(ev);
if (mSwiping) {
- if (mUseDynamicTranslucency && getContext() instanceof Activity) {
- ((Activity) getContext()).convertToTranslucent(null, null);
- }
setProgress(ev.getRawX() - mDownX);
break;
}
@@ -298,8 +276,12 @@ public class SwipeDismissLayout extends FrameLayout {
}
protected void cancel() {
- if (mUseDynamicTranslucency && getContext() instanceof Activity) {
- ((Activity) getContext()).convertFromTranslucent();
+ if (!mIsWindowNativelyTranslucent) {
+ Activity activity = findActivity();
+ if (activity != null && mActivityTranslucencyConverted) {
+ activity.convertFromTranslucent();
+ mActivityTranslucencyConverted = false;
+ }
}
if (mProgressListener != null) {
mProgressListener.onSwipeCancelled(this);
@@ -323,6 +305,7 @@ public class SwipeDismissLayout extends FrameLayout {
}
private void updateSwiping(MotionEvent ev) {
+ boolean oldSwiping = mSwiping;
if (!mSwiping) {
float deltaX = ev.getRawX() - mDownX;
float deltaY = ev.getRawY() - mDownY;
@@ -332,6 +315,16 @@ public class SwipeDismissLayout extends FrameLayout {
mSwiping = false;
}
}
+
+ if (mSwiping && !oldSwiping) {
+ // Swiping has started
+ if (!mIsWindowNativelyTranslucent) {
+ Activity activity = findActivity();
+ if (activity != null) {
+ mActivityTranslucencyConverted = activity.convertToTranslucent(null, null);
+ }
+ }
+ }
}
private void updateDismiss(MotionEvent ev) {
@@ -404,6 +397,17 @@ public class SwipeDismissLayout extends FrameLayout {
return 1 - progress * progress * progress;
}
+ private Activity findActivity() {
+ Context context = getContext();
+ while (context instanceof ContextWrapper) {
+ if (context instanceof Activity) {
+ return (Activity) context;
+ }
+ context = ((ContextWrapper) context).getBaseContext();
+ }
+ return null;
+ }
+
private class DismissAnimator implements AnimatorUpdateListener, Animator.AnimatorListener {
private final TimeInterpolator DISMISS_INTERPOLATOR = new DecelerateInterpolator(1.5f);
private final long DISMISS_DURATION = 250;
diff --git a/core/jni/android_text_StaticLayout.cpp b/core/jni/android_text_StaticLayout.cpp
index 02fa8720d5d2..c05ef26fd5ac 100644
--- a/core/jni/android_text_StaticLayout.cpp
+++ b/core/jni/android_text_StaticLayout.cpp
@@ -54,7 +54,8 @@ static JLineBreaksID gLineBreaks_fieldID;
// hyphenFrequency)
static void nSetupParagraph(JNIEnv* env, jclass, jlong nativePtr, jcharArray text, jint length,
jfloat firstWidth, jint firstWidthLineLimit, jfloat restWidth,
- jintArray variableTabStops, jint defaultTabStop, jint strategy, jint hyphenFrequency) {
+ jintArray variableTabStops, jint defaultTabStop, jint strategy, jint hyphenFrequency,
+ jboolean isJustified) {
minikin::LineBreaker* b = reinterpret_cast<minikin::LineBreaker*>(nativePtr);
b->resize(length);
env->GetCharArrayRegion(text, 0, length, b->buffer());
@@ -68,6 +69,7 @@ static void nSetupParagraph(JNIEnv* env, jclass, jlong nativePtr, jcharArray tex
}
b->setStrategy(static_cast<minikin::BreakStrategy>(strategy));
b->setHyphenationFrequency(static_cast<minikin::HyphenationFrequency>(hyphenFrequency));
+ b->setJustified(isJustified);
}
static void recycleCopy(JNIEnv* env, jobject recycle, jintArray recycleBreaks,
@@ -190,7 +192,7 @@ static const JNINativeMethod gMethods[] = {
{"nFinishBuilder", "(J)V", (void*) nFinishBuilder},
{"nLoadHyphenator", "(Ljava/nio/ByteBuffer;I)J", (void*) nLoadHyphenator},
{"nSetLocale", "(JLjava/lang/String;J)V", (void*) nSetLocale},
- {"nSetupParagraph", "(J[CIFIF[IIII)V", (void*) nSetupParagraph},
+ {"nSetupParagraph", "(J[CIFIF[IIIIZ)V", (void*) nSetupParagraph},
{"nSetIndents", "(J[I)V", (void*) nSetIndents},
{"nAddStyleRun", "(JJJIIZ)F", (void*) nAddStyleRun},
{"nAddMeasuredRun", "(JII[F)V", (void*) nAddMeasuredRun},
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index cc7b95894a1f..070a2d96cd40 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -43,6 +43,7 @@
#include <sys/wait.h>
#include <unistd.h>
+#include "android-base/logging.h"
#include <cutils/fs.h>
#include <cutils/multiuser.h>
#include <cutils/sched_policy.h>
@@ -440,6 +441,22 @@ void SetThreadName(const char* thread_name) {
// The list of open zygote file descriptors.
static FileDescriptorTable* gOpenFdTable = NULL;
+static void FillFileDescriptorVector(JNIEnv* env,
+ jintArray java_fds,
+ std::vector<int>* fds) {
+ CHECK(fds != nullptr);
+ if (java_fds != nullptr) {
+ ScopedIntArrayRO ar(env, java_fds);
+ if (ar.get() == nullptr) {
+ RuntimeAbort(env, __LINE__, "Bad fd array");
+ }
+ fds->reserve(ar.size());
+ for (size_t i = 0; i < ar.size(); ++i) {
+ fds->push_back(ar[i]);
+ }
+ }
+}
+
// Utility routine to fork zygote and specialize the child process.
static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
jint debug_flags, jobjectArray javaRlimits,
@@ -447,6 +464,7 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra
jint mount_external,
jstring java_se_info, jstring java_se_name,
bool is_system_server, jintArray fdsToClose,
+ jintArray fdsToIgnore,
jstring instructionSet, jstring dataDir) {
SetSigChldHandler();
@@ -471,12 +489,14 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra
// If this is the first fork for this zygote, create the open FD table.
// If it isn't, we just need to check whether the list of open files has
// changed (and it shouldn't in the normal case).
+ std::vector<int> fds_to_ignore;
+ FillFileDescriptorVector(env, fdsToIgnore, &fds_to_ignore);
if (gOpenFdTable == NULL) {
- gOpenFdTable = FileDescriptorTable::Create();
+ gOpenFdTable = FileDescriptorTable::Create(fds_to_ignore);
if (gOpenFdTable == NULL) {
RuntimeAbort(env, __LINE__, "Unable to construct file descriptor table.");
}
- } else if (!gOpenFdTable->Restat()) {
+ } else if (!gOpenFdTable->Restat(fds_to_ignore)) {
RuntimeAbort(env, __LINE__, "Unable to restat file descriptor table.");
}
@@ -646,7 +666,9 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
jint debug_flags, jobjectArray rlimits,
jint mount_external, jstring se_info, jstring se_name,
- jintArray fdsToClose, jstring instructionSet, jstring appDataDir) {
+ jintArray fdsToClose,
+ jintArray fdsToIgnore,
+ jstring instructionSet, jstring appDataDir) {
jlong capabilities = 0;
// Grant CAP_WAKE_ALARM to the Bluetooth process.
@@ -681,7 +703,7 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
return ForkAndSpecializeCommon(env, uid, gid, gids, debug_flags,
rlimits, capabilities, capabilities, mount_external, se_info,
- se_name, false, fdsToClose, instructionSet, appDataDir);
+ se_name, false, fdsToClose, fdsToIgnore, instructionSet, appDataDir);
}
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
@@ -692,7 +714,7 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer(
debug_flags, rlimits,
permittedCapabilities, effectiveCapabilities,
MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
- NULL, NULL);
+ NULL, NULL, NULL);
if (pid > 0) {
// The zygote process checks whether the child process has died or not.
ALOGI("System server process %d has been created", pid);
@@ -759,7 +781,7 @@ static void com_android_internal_os_Zygote_nativeUnmountStorageOnInit(JNIEnv* en
static const JNINativeMethod gMethods[] = {
{ "nativeForkAndSpecialize",
- "(II[II[[IILjava/lang/String;Ljava/lang/String;[ILjava/lang/String;Ljava/lang/String;)I",
+ "(II[II[[IILjava/lang/String;Ljava/lang/String;[I[ILjava/lang/String;Ljava/lang/String;)I",
(void *) com_android_internal_os_Zygote_nativeForkAndSpecialize },
{ "nativeForkSystemServer", "(II[II[[IJJ)I",
(void *) com_android_internal_os_Zygote_nativeForkSystemServer },
diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
index 969d336f3cad..59a536b1b001 100644
--- a/core/jni/fd_utils.cpp
+++ b/core/jni/fd_utils.cpp
@@ -381,7 +381,7 @@ bool FileDescriptorInfo::DetachSocket() const {
}
// static
-FileDescriptorTable* FileDescriptorTable::Create() {
+FileDescriptorTable* FileDescriptorTable::Create(const std::vector<int>& fds_to_ignore) {
DIR* d = opendir(kFdPath);
if (d == NULL) {
ALOGE("Unable to open directory %s: %s", kFdPath, strerror(errno));
@@ -396,6 +396,10 @@ FileDescriptorTable* FileDescriptorTable::Create() {
if (fd == -1) {
continue;
}
+ if (std::find(fds_to_ignore.begin(), fds_to_ignore.end(), fd) != fds_to_ignore.end()) {
+ ALOGI("Ignoring open file descriptor %d", fd);
+ continue;
+ }
FileDescriptorInfo* info = FileDescriptorInfo::CreateFromFd(fd);
if (info == NULL) {
@@ -414,7 +418,7 @@ FileDescriptorTable* FileDescriptorTable::Create() {
return new FileDescriptorTable(open_fd_map);
}
-bool FileDescriptorTable::Restat() {
+bool FileDescriptorTable::Restat(const std::vector<int>& fds_to_ignore) {
std::set<int> open_fds;
// First get the list of open descriptors.
@@ -431,6 +435,10 @@ bool FileDescriptorTable::Restat() {
if (fd == -1) {
continue;
}
+ if (std::find(fds_to_ignore.begin(), fds_to_ignore.end(), fd) != fds_to_ignore.end()) {
+ ALOGI("Ignoring open file descriptor %d", fd);
+ continue;
+ }
open_fds.insert(fd);
}
diff --git a/core/jni/fd_utils.h b/core/jni/fd_utils.h
index 9e3afd910914..03298c38dca9 100644
--- a/core/jni/fd_utils.h
+++ b/core/jni/fd_utils.h
@@ -122,9 +122,9 @@ class FileDescriptorTable {
// Creates a new FileDescriptorTable. This function scans
// /proc/self/fd for the list of open file descriptors and collects
// information about them. Returns NULL if an error occurs.
- static FileDescriptorTable* Create();
+ static FileDescriptorTable* Create(const std::vector<int>& fds_to_ignore);
- bool Restat();
+ bool Restat(const std::vector<int>& fds_to_ignore);
// Reopens all file descriptors that are contained in the table. Returns true
// if all descriptors were successfully re-opened or detached, and false if an
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 5393d1aaa161..8baf25237bb8 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Werk-<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2e werk-<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3e werk-<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Raak en hou Terug om hierdie skerm te ontspeld."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Program is vasgespeld: Dit mag nie op hierdie toestel ontspeld word nie."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skerm vasgespeld"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skerm ontspeld"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index feac09c5b5a1..3ef6831e2b47 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2ኛ ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3ኛ ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ይህን ማያ ገጽ ለመንቀል ተመለስን ይንኩትና ያዙት።"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"መተግበሪያ ተሰክቷል፦ በዚህ መሣሪያ ላይ ማላቀቅ አይፈቀድም።"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ማያ ገጽ ተሰክቷል"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"ማያ ገጽ ተነቅሏል"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 6f58ee432ca4..8d9d5042989c 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1655,7 +1655,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> المخصص للعمل"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"العمل الثاني <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"العمل الثالث <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"لإزالة تثبيت هذه الشاشة، يمكنك لمس زر الرجوع مع الاستمرار."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"التطبيق مقيد: ولا يسمح بإلغاء التقييد على هذا الجهاز."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"تم تثبيت الشاشة"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"تم إلغاء تثبيت الشاشة"</string>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
index 7c71be259583..dd62c7047e48 100644
--- a/core/res/res/values-az-rAZ/strings.xml
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"İş <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-ci İş <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-cü İş <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Sancağı götürmək üçün Geri düyməsinə toxunun və saxlayın."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Tətbiq sancılıb: Açmağa bu cihazda icazə verilmir."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 6d31e32b0ee8..d25cb674e82a 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1583,7 +1583,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> na poslu"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. poslovni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. poslovni imejl <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Da biste otkačili ovaj ekran, dodirnite i zadržite Nazad."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplikacija je zakačena: otkačinjanje nije dozvoljeno na ovom uređaju."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran je zakačen"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran je otkačen"</string>
diff --git a/core/res/res/values-be-rBY/strings.xml b/core/res/res/values-be-rBY/strings.xml
index a5ad1e5811b7..4c9227add7c1 100644
--- a/core/res/res/values-be-rBY/strings.xml
+++ b/core/res/res/values-be-rBY/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (праца)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Другая праца <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Трэцяя праца <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Каб адмацаваць гэты экран, дакраніцеся і ўтрымлівайце кнопку \"Назад\"."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Праграма замацавана: адмацаванне на гэтай прыладзе не дапускаецца."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Экран замацаваны"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Экран адмацаваны"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 5770142ca136..e50d1785a644 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> за работа"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Втори служебен профил (<xliff:g id="LABEL">%1$s</xliff:g>)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Трети служебен профил (<xliff:g id="LABEL">%1$s</xliff:g>)"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"За да освободите този екран, докоснете и задръжте бутона за връщане назад."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Приложението е фиксирано. Освобождаването му не е разрешено на това устройство."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Екранът е фиксиран"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Екранът е освободен"</string>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 83552090876c..ccb39b46643b 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"কর্মক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"দ্বিতীয় কার্যক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"তৃতীয় কার্যক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"এই স্ক্রীনটিকে আনপিন করতে, \'ফিরুন\' স্পর্শ করুন এবং ধরে রাখুন৷"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"অ্যাপ্লিকেশান পিন করা আছে: এই ডিভাইস এটিকে পিনমুক্ত করা মঞ্জুরিপ্রাপ্ত নয়৷"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"স্ক্রীন পিন করা হয়েছে"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"পিন না করা স্ক্রীন"</string>
diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml
index 5936d3af4c77..4cf2bb0ac183 100644
--- a/core/res/res/values-bs-rBA/strings.xml
+++ b/core/res/res/values-bs-rBA/strings.xml
@@ -1585,7 +1585,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Poslovni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. poslovni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. poslovni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Da biste otkačili ovaj ekran, dodirnite i držite dugme Nazad."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplikacija je prikačena. Na ovom uređaju nije dozvoljeno otkačivanje."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran je zakačen"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran je otkačen"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 4a61fc13fdb8..db400152b015 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de la feina"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2n <xliff:g id="LABEL">%1$s</xliff:g> de la feina"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3r <xliff:g id="LABEL">%1$s</xliff:g> de la feina"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Toca i mantén premuda l\'opció Enrere per deixar de fixar aquesta pantalla."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"S\'ha fixat l\'aplicació. En aquest dispositiu no es permet anul·lar-ne la fixació."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Fixació de la pantalla anul·lada"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index d5619f9853b6..05b091431048 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Pracovní <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> do práce"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> do práce"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Chcete-li tuto obrazovku uvolnit, klepněte na tlačítko Zpět a podržte jej."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplikace je připnutá: Odepnutí v tomto zařízení není povoleno."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Obrazovka připnuta"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Obrazovka uvolněna"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 89b546f57974..498ba463f5d2 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -228,8 +228,8 @@
<string name="bugreport_option_full_title" msgid="6354382025840076439">"Fuld rapport"</string>
<string name="bugreport_option_full_summary" msgid="7210859858969115745">"Brug denne mulighed for at gribe mindst muligt ind, når enheden ikke reagerer eller er for langsom, eller når du har brug for alle rapportsektioner. Du har ikke mulighed for at angive flere oplysninger eller tage yderligere skærmbilleder."</string>
<plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
- <item quantity="one">Der tages et skærmbillede til fejlrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekund.</item>
- <item quantity="other">Der tages et skærmbillede til fejlrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder.</item>
+ <item quantity="one">Der tages et screenshot til fejlrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekund.</item>
+ <item quantity="other">Der tages et screenshot til fejlrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder.</item>
</plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Lydløs"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Lyden er slået FRA"</string>
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> – arbejde"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> til arbejde"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> til arbejde"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Hvis du vil frigøre dette skærmbillede, skal du trykke på Tilbage og holde fingeren nede."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Appen er fastgjort: Det er ikke tilladt at frigøre den på denne enhed."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skærmen blev fastgjort"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skærmen blev frigjort"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 79152fa5c440..fda4c1bc527e 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (geschäftlich)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> (geschäftlich)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> (geschäftlich)"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Um die Fixierung dieses Bildschirms aufzuheben, \"Zurück\" berühren und halten."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Die App ist fixiert. Das Aufheben der Fixierung ist auf diesem Gerät nicht zulässig."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Bildschirm fixiert"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Bildschirm gelöst"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index d89932d330c9..6e0147812b69 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Εργασία <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> εργασίας 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> εργασίας 3"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα \"Επιστροφή\"."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Η εφαρμογή καρφιτσώθηκε: Το ξεκαρφίτσωμα δεν επιτρέπεται σε αυτήν τη συσκευή."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Η οθόνη καρφιτσώθηκε"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Η οθόνη ξεκαρφιτσώθηκε"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 071a302aff7e..b5d2d504fb49 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2nd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3rd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"To unpin this screen, touch &amp; hold Back."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"App is pinned: unpinning isn\'t allowed on this device."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 071a302aff7e..b5d2d504fb49 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2nd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3rd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"To unpin this screen, touch &amp; hold Back."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"App is pinned: unpinning isn\'t allowed on this device."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 071a302aff7e..b5d2d504fb49 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2nd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3rd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"To unpin this screen, touch &amp; hold Back."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"App is pinned: unpinning isn\'t allowed on this device."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index cbff5bb88c64..14c2850e0746 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo 3"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Para dejar de fijar esta pantalla, mantén presionado Atrás."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"La aplicación está fijada, no se puede anular la fijación en este dispositivo."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fija"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Pantalla no fija"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 93c30796f765..26b8bb4d0d96 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo 3"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Mantén pulsado el botón Atrás para dejar de fijar esta pantalla."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"La aplicación está fijada: no se puede deshacer la fijación en este dispositivo."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fijada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"La pantalla ya no está fija"</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 7c6c5626d7d9..4b06f58311f1 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Töö <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. töö <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. töö <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Ekraani vabastamiseks puudutage pikalt nuppu Tagasi."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Rakendus on kinnitatud: vabastamine pole selles seadmes lubatud."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekraan on kinnitatud"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekraan on vabastatud"</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 98f007291861..89d65499e151 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Laneko <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Laneko 2. <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Laneko 3. <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Pantailari aingura kentzeko, eduki sakatuta Atzera botoia."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplikazioa ainguratuta dago. Gailu honetan ezin da aingura kendu."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantaila ainguratu da"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Aingura kendu zaio pantailari"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 0e6a9828214f..ef9ef0725aae 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> محل کار"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"کار دوم <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"کار سوم <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"برای برداشتن پین این صفحه، «برگشت» را لمس کنید و نگه‌ دارید."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"برنامه پین شده است: برداشتن پین در این دستگاه مجاز نیست."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"صفحه پین شد"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"پین صفحه برداشته شد"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 74b4c8b1cfff..0cddf146849c 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (työ)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Toinen <xliff:g id="LABEL">%1$s</xliff:g>, työ"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Kolmas <xliff:g id="LABEL">%1$s</xliff:g>, työ"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Irrota näyttö koskettamalla Takaisin-painiketta pitkään."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Sovellus on kiinnitetty. Irrottaminen ei ole sallittua tällä laitteella."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Näyttö kiinnitetty"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Näyttö irrotettu"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index cd2376249f88..3957343688ab 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (travail)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2e <xliff:g id="LABEL">%1$s</xliff:g> professionnel(le)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3e <xliff:g id="LABEL">%1$s</xliff:g> professionnel(le)"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Pour annuler l\'épinglage de cet écran, maintenez enfoncée la touche Retour."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"L\'application est épinglée : l\'annulation de l\'épinglage n\'est pas autorisée sur cet appareil."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Écran épinglé"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Épinglage d\'écran annulé"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 1e9613709756..71eb8c211a3b 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (travail)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2e <xliff:g id="LABEL">%1$s</xliff:g> professionnelle"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3e <xliff:g id="LABEL">%1$s</xliff:g> professionnelle"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Pour annuler l\'épinglage, appuyez de manière prolongée sur \"Retour\"."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"L\'application est épinglée. L\'annulation de l\'épinglage n\'est pas autorisée sur cet appareil."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Écran épinglé."</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Épinglage d\'écran annulé."</string>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index b59057f3a338..65e90e4ca89e 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2.º <xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3.º <xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Para soltar a pantalla, mantén premido Volver."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"A aplicación está fixada: non se permite soltala neste dispositivo."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Pantalla desactivada"</string>
diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml
index f1140289e41a..bfb84b375808 100644
--- a/core/res/res/values-gu-rIN/strings.xml
+++ b/core/res/res/values-gu-rIN/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"કાર્યાલય <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2જું કાર્ય <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3જું કાર્ય <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"આ સ્ક્રીનને અનપિન કરવા માટે, પાછળને ટચ કરીને પકડી રાખો."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"ઍપ્લિકેશન પિન કરેલ છે. આ ઉપકરણ પર અનપિન કરવાની મંજૂરી નથી."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"સ્ક્રીન પિન કરી"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"સ્ક્રીન અનપિન કરી"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index e291552b8653..05f8bd2b5041 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -417,7 +417,7 @@
<string name="permlab_accessWifiState" msgid="5202012949247040011">"वाई-फ़ाई कनेक्‍शन देखें"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"ऐप्स को वाई-फ़ाई नेटवर्क के बारे में जानकारी, जैसे WI-Fi सक्षम है या नहीं और कनेक्‍ट किए गए वाई-फ़ाई डिवाइस के नाम, देखने देता है."</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"वाई-फ़ाई से कनेक्‍ट और डिस्‍कनेक्‍ट करें"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"ऐप्स को वाई-फ़ाई पहुंच बिंदुओं से कनेक्ट और डिस्कनेक्ट करने और वाई-फ़ाई नेटवर्क के लिए डिवाइस कॉन्फ़िगरेशन में परिवर्तन करने देता है."</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"ऐप्स को वाई-फ़ाई पहुंच बिंदुओं से कनेक्ट और डिसकनेक्ट करने और वाई-फ़ाई नेटवर्क के लिए डिवाइस कॉन्फ़िगरेशन में परिवर्तन करने देता है."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"वाई-फ़ाई मल्‍टीकास्‍ट प्राप्ति को अनुमति दें"</string>
<string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"ऐप्स को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के उपयोग से केवल आपके टेबलेट पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट प्राप्‍त करने देता है. यह गैर-मल्टीकास्ट मोड से अधिक पावर का उपयोग करता है."</string>
<string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"ऐप को मल्‍टीकास्‍ट पतों का उपयोग करके ना केवल आपके टीवी को, बल्‍कि वाई-फ़ाई पर मौजूद सभी डिवाइसों को पैकेट भेजने और प्राप्‍त करने देती है. इसमें गैर-मल्‍टीकास्‍ट मोड की अपेक्षा अधिक पावर का उपयोग होता है."</string>
@@ -426,7 +426,7 @@
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"किसी ऐप्स को स्‍थानीय ब्लूटूथ टेबलेट कॉन्‍फ़िगर करने की और रिमोट डिवाइस के साथ खोजने और युग्‍मित करने देता है."</string>
<string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"ऐप को स्‍थानीय ब्‍लूटूथ टीवी कॉन्‍फ़िगर करने देती है और दूरस्‍थ डिवाइसों को खोजने और उनसे युग्‍मित करने देती है."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ऐप्स को स्‍थानीय ब्लूटूथ फ़ोन कॉन्‍फ़िगर करने देता है, और रिमोट डिवाइस के साथ खोजने और युग्‍मित करने देता है."</string>
- <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX से कनेक्ट और डिस्कनेक्ट करें"</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX से कनेक्ट और डिसकनेक्ट करें"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"ऐप्स को WiMAX सक्षम है या नहीं और कनेक्‍ट किए गए किसी WiMAX नेटवर्क के बारे में जानकारी निर्धारित करने देता है."</string>
<string name="permlab_changeWimaxState" msgid="340465839241528618">"WiMAX स्‍थिति बदलें"</string>
<string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"ऐप्स को WiMAX नेटवर्क से टेबलेट को कनेक्‍ट और डिस्‍कनेक्‍ट करने देता है."</string>
@@ -1103,9 +1103,9 @@
<string name="wifi_p2p_to_message" msgid="248968974522044099">"प्रति:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"आवश्‍यक पिन लिखें:"</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"पिन:"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> से कनेक्ट रहने पर टेबलेट वाई-फ़ाई से अस्थायी रूप से डिस्कनेक्ट हो जाएगा"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> से कनेक्ट रहने पर टेबलेट वाई-फ़ाई से अस्थायी रूप से डिसकनेक्ट हो जाएगा"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"जब टीवी <xliff:g id="DEVICE_NAME">%1$s</xliff:g> से कनेक्‍ट होगा तब वह वाई-फ़ाई से अस्‍थायी रूप से डिस्‍कनेक्‍ट हो जाएगा"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"फ़ोन <xliff:g id="DEVICE_NAME">%1$s</xliff:g> से कनेक्ट रहते समय वाई-फ़ाई से अस्थायी रूप से डिस्कनेक्ट हो जाएगा"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"फ़ोन <xliff:g id="DEVICE_NAME">%1$s</xliff:g> से कनेक्ट रहते समय वाई-फ़ाई से अस्थायी रूप से डिसकनेक्ट हो जाएगा"</string>
<string name="select_character" msgid="3365550120617701745">"वर्ण सम्‍मिलित करें"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS संदेश भेज रहा है"</string>
<string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; बड़ी संख्या में SMS संदेश भेज रहा है. क्या आप इस ऐप्स को संदेश भेजना जारी रखने देना चाहते हैं?"</string>
@@ -1379,7 +1379,7 @@
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"स्क्रीन को डिवाइस में कास्ट करें"</string>
<string name="media_route_chooser_searching" msgid="4776236202610828706">"डिवाइस खोजे जा रहे हैं…"</string>
<string name="media_route_chooser_extended_settings" msgid="87015534236701604">"सेटिंग"</string>
- <string name="media_route_controller_disconnect" msgid="8966120286374158649">"डिस्कनेक्ट करें"</string>
+ <string name="media_route_controller_disconnect" msgid="8966120286374158649">"डिसकनेक्ट करें"</string>
<string name="media_route_status_scanning" msgid="7279908761758293783">"स्‍कैन कर रहा है..."</string>
<string name="media_route_status_connecting" msgid="6422571716007825440">"कनेक्ट हो रहा है..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"उपलब्ध"</string>
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"कार्यस्थल का <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"दूसरा कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"तीसरा कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"इस स्क्रीन को अनपिन करने के लिए, वापस जाएं को स्पर्श करके रखें."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"ऐप पिन किया गया है: इस डिवाइस पर अनपिन करने की अनुमति नहीं है."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"स्‍क्रीन पिन की गई"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"स्‍क्रीन अनपिन की गई"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index a403769158de..9bd61c0b68de 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1583,7 +1583,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> za posao"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> za posao"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> za posao"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Da biste otkvačili ovaj zaslon, dodirnite i zadržite Natrag."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplikacija je prikvačena: otkvačivanje nije dopušteno na tom uređaju."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Zaslon je pričvršćen"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Zaslon je otkvačen"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index f29cced1e95e..814e4e275e88 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Munkahelyi <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. munkahelyi <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. munkahelyi <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza lehetőséget."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Az alkalmazás rögzítve van: a rögzítés feloldása nem engedélyezett ezen az eszközön."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Képernyő rögzítve"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Képernyő rögzítése feloldva"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 87b8d04e0c07..f803fd277a2c 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -1272,7 +1272,7 @@
<string name="find_previous" msgid="2196723669388360506">"Գտնել նախորդը"</string>
<string name="gpsNotifTicker" msgid="5622683912616496172">"Տեղադրության հարցում <xliff:g id="NAME">%s</xliff:g>-ից"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Տեղադրության հարցում"</string>
- <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)-ի հարցմամբ"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)-ի հարցումով"</string>
<string name="gpsVerifYes" msgid="2346566072867213563">"Այո"</string>
<string name="gpsVerifNo" msgid="1146564937346454865">"Ոչ"</string>
<string name="sync_too_many_deletes" msgid="5296321850662746890">"Ջնջելու սահմանը գերազանցվել է"</string>
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Աշխատանքային <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-րդ աշխատանք <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-րդ աշխատանք <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Այս էկրանն ապամրացնելու համար հպեք և պահեք Հետ կոճակը:"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Հավելվածն ամրացված է: Ապամրացումն այս սարքում չի թույլատրվում:"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Էկրանն ամրացված է"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Էկրանն ապամրացված է"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 1f6f1305a87a..67f11c7c1e05 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Kantor <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Upaya ke-2 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Upaya ke-3 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Untuk melepas pin layar ini, sentuh &amp; tahan tombol Kembali."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Pin dipasang ke aplikasi. Melepas pin tidak diizinkan di perangkat ini."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Layar disematkan"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Layar dicopot sematannya"</string>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 4222c22c83ce..8beada0ba0ba 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> í vinnu"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> í vinnu (2)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> í vinnu (3)"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Til að taka lásinn af þessari skjámynd skaltu halda inni bakkhnappinum."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Forritið er fest: Ekki er hægt að losa forrit í þessu tæki."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skjár festur"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skjár opnaður"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 472178fa45fa..fa67e12932d0 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> lavoro"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> di lavoro (2°)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> di lavoro (3°)"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Per sbloccare questa schermata tieni premuta l\'opzione Indietro."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"L\'app è bloccata. Su questo dispositivo non è consentito lo sblocco."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Schermata bloccata"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Schermata sbloccata"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 7c908d9f439b..9a04898f1925 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"עבודה <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> שני בעבודה"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> שלישי בעבודה"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"כדי לבטל את הצמדת המסך הזה, לחץ לחיצה ממושכת על הלחצן \'הקודם\'."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"האפליקציה מוצמדת: ביטול ההצמדה אסור במכשיר הזה."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"המסך מוצמד"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"הצמדת המסך בוטלה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 764e9cfa66ac..d203449f67e1 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"仕事の<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2 番目の仕事用<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3 番目の仕事用<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"この画面の固定を解除するには [戻る] を押し続けます。"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"アプリは固定されています。この端末では固定を解除できません。"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"画面を固定しました"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"画面固定を解除しました"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index f0486fa79850..e657d9f83593 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"სამსახური <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"მე-2 სამსახური <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"მე-3 სამსახური <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკს „უკან“."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"აპი მიმაგრებულია: მიმაგრების მოხსნა არ არის ნებადართული ამ მოწყობილობაზე."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ეკრანი დაფიქსირდა"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"ეკრანს ფიქსაცია მოეხსნა"</string>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 1e45115e81fa..d9c6d8c84c57 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Жұмыс <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-ші жұмыс профилі (<xliff:g id="LABEL">%1$s</xliff:g>)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-ші жұмыс профилі (<xliff:g id="LABEL">%1$s</xliff:g>)"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Осы экранды босату үшін \"Артқа\" түймесін басып тұрыңыз."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Бағдарлама белгіленді: Бұл құрылғыда белгіні алуға рұқсат берілмейді."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Экран түйрелді"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Экран босатылды"</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 1c9ec816acc2..7c29a58133d6 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -1561,7 +1561,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"កន្លែង​ធ្វើការ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> ការងារទី 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> ការងារទី 3"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ដើម្បីផ្តាច់អេក្រង់នេះ សូមប៉ះ និងសង្កត់ប៊ូតុងថយក្រោយឲ្យជាប់។"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"កម្មវិធីនេះត្រូវបានខ្ទាស់។ មិនអនុញ្ញាតឲ្យដោះការខ្ទាស់នៅលើឧបករណ៍នេះទេ។"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"បាន​ភ្ជាប់​អេក្រង់"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"មិន​បាន​ភ្ជាប់​អេក្រង់"</string>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index e79fd6f5b40e..e86c2753bc34 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -992,7 +992,7 @@
<string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> ನಿಲ್ಲುತ್ತಲೇ ಇರುತ್ತದೆ"</string>
<string name="aerr_process_repeated" msgid="6235302956890402259">"<xliff:g id="PROCESS">%1$s</xliff:g> ನಿಲ್ಲುತ್ತಲೇ ಇರುತ್ತದೆ"</string>
<string name="aerr_restart" msgid="7581308074153624475">"ಅಪ್ಲಿಕೇಶನ್ ಮತ್ತೆ ತೆರೆಯಿರಿ"</string>
- <string name="aerr_report" msgid="5371800241488400617">"ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸು"</string>
+ <string name="aerr_report" msgid="5371800241488400617">"ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ"</string>
<string name="aerr_close" msgid="2991640326563991340">"ಮುಚ್ಚು"</string>
<string name="aerr_mute" msgid="1974781923723235953">"ಸಾಧನವು ಮರುಪ್ರಾರಂಭವಾಗುವವರೆಗೂ ಮ್ಯೂಟ್ ಮಾಡಿ"</string>
<string name="aerr_wait" msgid="3199956902437040261">"ನಿರೀಕ್ಷಿಸು"</string>
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"ಕೆಲಸ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2 ನೇ ಕೆಲಸದ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3 ನೇ ಕೆಲಸದ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ಈ ಪರದೆಯನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಲು, ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಂಂದೆ ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"ಅಪ್ಲಿಕೇಶನ್ ಪಿನ್‌ ಮಾಡಲಾಗಿದೆ: ಈ ಸಾಧನದಲ್ಲಿ ಅನ್‌ಪಿನ್‌ ಮಾಡುವುದನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ಸ್ಕ್ರೀನ್‌ ಪಿನ್‌ ಮಾಡಲಾಗಿದೆ"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"ಸ್ಕ್ರೀನ್‌ ಅನ್‌ಪಿನ್‌ ಮಾಡಲಾಗಿದೆ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index b931bbb0eec8..f3badd1f312a 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"업무용 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"두 번째 업무용 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"세 번째 업무용<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"이 화면을 고정 해제하려면 \'뒤로\'를 길게 터치합니다."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"앱이 고정되었습니다. 이 기기에서는 고정 해제를 허용하지 않습니다."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"화면 고정됨"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"화면 고정 해제됨"</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index c89618047c4e..9aaa1477ba6c 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Жумуш <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-жумуш <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-жумуш <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Бул экранды бошотуу үчүн \"Артка\" баскычын басып, кармап туруңуз."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Колдонмо кадалган: Бул түзмөктө бошотууга уруксат жок."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Экран кадалды"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Экран бошотулду"</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 534ffe2a13f1..f6b5c96b26da 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"​ບ່ອນ​ເຮັດ​ວຽກ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"ບ່ອນເຮັດວຽກທີ 2 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"ບ່ອນເຮັດວຽກທີ 3 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ກົດປຸ່ມກັບຄືນຄ້າງໄວ້ເພື່ອເຊົາປັກໝຸດໜ້າຈໍນີ້."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"ແອັບ​ຖືກ​ປັກ​ໝຸດ​ແລ້ວ: ບໍ່​ອະ​ນຸ​ຍາດ​ໃຫ້​ຖອນ​ປັກ​ໝຸດ​ຢູ່​ເທິງ​ອຸ​ປະ​ກອນ​ນີ້."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"​ປັກ​ໝຸດ​ໜ້າ​ຈໍ​ແລ້ວ"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"ຍົກ​ເລີກ​ການ​ປັກ​ໝຸນ​​ຫນ້າ​ຈໍ​ແລ້ວ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index c9f781f9d2e9..e2c4c2f38f25 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Darbo <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-asis darbo <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-iasis darbo <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Kad atsegtumėte šį ekraną, palieskite ir palaikykite „Atgal“."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Programa prisegta: šiame įrenginyje negalima atsegti."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekrano prisegtas"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekranas atsegtas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index df2c194d0b38..d3da07d545b8 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1583,7 +1583,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Darbā: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. darba profils: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. darba profils: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Lai atspraustu šo ekrānu, pieskarieties pogai “Atpakaļ” un turiet to."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Lietotne ir piesprausta. Atspraušana šajā ierīcē nav atļauta."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekrāns ir piesprausts"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekrāns ir atsprausts"</string>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index abd1bfdb5944..ac5732d76f0f 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -1561,7 +1561,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Работа <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Втора деловна <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Трета деловна <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"За откачување на екранов, допрете и задржете Назад."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Апликацијата е закачена: откачување не е дозволено на уредов."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Екранот е закачен"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Екранот е откачен"</string>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index e29c01bae360..399d90a91192 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"ഔദ്യോഗികം <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"രണ്ടാമത്തെ ഔദ്യോഗിക <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"മൂന്നാമത്തെ ഔദ്യോഗിക <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ഈ സ്‌ക്രീൻ അൺപിൻ ചെയ്യാൻ, ബാക്ക് ബട്ടൺ സ്‌പർശിച്ച് പിടിക്കുക"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"അപ്ലിക്കേഷൻ പിൻ ചെയ്‌തു: ഈ ഉപകരണത്തിൽ അൺപിൻ ചെയ്യാനാവില്ല."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"സ്ക്രീൻ പിൻ ചെയ്തു"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"സ്ക്രീൻ അൺപിൻ ചെയ്തു"</string>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 2f1cc6978f8c..3e5e5904a3e8 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Ажлын <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2 дахь ажил <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3 дахь ажил <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Энэ дэлгэцийг эхэнд нээхийг болиулахын тулд Буцах товчлуурыг дараад, хүлээнэ үү."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"App-ыг тусгайлан тэмдэглэсэн байна: Энэ төхөөрөмж дээр тусгайлан тэмдэглэсэн сонголтыг устгах боломжгүй."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Дэлгэцийг тогтоосон"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Дэлгэцийг сулласан"</string>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 50b41c0f9c55..c093c2db92de 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2 रे कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3 रे कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ही स्क्रीन अनपिन करण्यासाठी, परत ला स्पर्श करा आणि धरून ठेवा."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"अॅप पिन केलेला आहे: या डिव्हाइसवर अनपिन करण्यास अनुमती नाही."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रीन पिन केली"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"स्क्रीन अनपिन केली"</string>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index 72daecb73a91..ab59e3804013 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Kerja <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> kerja ke-2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> kerja ke-3"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Untuk menyahsematkan skrin ni, ketik &amp; tahan Kembali."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Apl disemat: Nyahsemat tidak dibenarkan pada peranti ini."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skrin disemat"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skrin dinyahsemat"</string>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index c3ebf7473ab8..921b95d76bf3 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"အလုပ် <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"ဒုတိယအလုပ် <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"တတိယအလုပ် <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ဤမျက်နှာပြင်ကို ပင်ဖြုတ်ရန် \"နောက်သို့\" ကိုထိပြီးဖိထားပါ။"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"အက်ပ်ကို ပင်ထိုးထားသည်။ ပင်ဖျက်ခြင်းကို ဒီစက်မှာ မရနိုင်ပါ။"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"မျက်နှာပြင်ကို ပင်ထိုးထား"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"မျက်နှာပြင် ပင်ထိုးမှု ဖြတ်လိုက်ပြီ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 4e7c4ce936b3..07aecebfa498 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Jobb-<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Andre <xliff:g id="LABEL">%1$s</xliff:g> for jobben"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Tredje <xliff:g id="LABEL">%1$s</xliff:g> for jobben"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"For å løsne denne skjermen, trykk og hold inne Tilbake."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Appen er festet – du kan ikke løsne apper på denne enheten."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skjermen er festet"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skjermen er løsnet"</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index 3af81303dd2b..0e95ca6b2c1f 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -1565,7 +1565,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"कार्यालयको दोस्रो <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"कार्यालयको तेस्रो <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"यस स्क्रिनलाई अनपिन गर्न पछाडि बटनलाई छोइराख्नुहोस्।"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"अनुप्रयोग पिन गरियो: यस यन्त्रमा अनपिन गर्ने अनुमति छैन।"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रिन पिन गरियो"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"स्क्रिन अनपिन गरियो"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 39a5a02b3c18..bc734ae5a61b 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Werk <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2e <xliff:g id="LABEL">%1$s</xliff:g>, werk"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3e <xliff:g id="LABEL">%1$s</xliff:g>, werk"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Tik op Terug en houd vast om dit scherm los te maken."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"App is vastgezet: losmaken is niet toegestaan op dit apparaat."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Scherm vastgezet"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Scherm losgemaakt"</string>
diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml
index 315e7d513d6c..4c9bc44180b0 100644
--- a/core/res/res/values-pa-rIN/strings.xml
+++ b/core/res/res/values-pa-rIN/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"ਕੰਮ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"ਦੂਸਰੀ ਕਾਰਜ-ਸਥਾਨ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"ਤੀਸਰੀ ਕਾਰਜ-ਸਥਾਨ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ਇਸ ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰਨ ਲਈ, ਸਪਰਸ਼ ਕਰੋ &amp; ਦਬਾਈ ਰੱਖੋ।"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"ਐਪ ਪਿੰਨਡ ਹੈ: ਇਸ ਡੀਵਾਈਸ ਤੇ ਅਨਪਿਨ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ।"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"ਸਕ੍ਰੀਨ ਅਨਪਿਨ ਕੀਤੀ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 77b2bf3dc84a..4bf9f894b14c 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (praca)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> – praca 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> – praca 3"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Aby odpiąć ten ekran, naciśnij i przytrzymaj Wstecz."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplikacja jest przypięta. Nie możesz jej odpiąć na tym urządzeniu."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran przypięty"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran odpięty"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 51519a71bab8..ccd1d8bebd5e 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Trabalho: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Segundo <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Terceiro <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Para liberar esta tela, toque no botão \"Voltar\" e mantenha-o pressionado."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"O app está fixado. A liberação não é permitida neste dispositivo."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Tela fixada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Tela liberada"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 5ae5c40b7dd8..16aead76c6f9 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2.º <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3.º <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Para soltar este ecrã, toque sem soltar em Anterior."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"A aplicação está fixa: não é permitido soltá-la neste dispositivo."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ecrã fixo"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ecrã solto"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 51519a71bab8..ccd1d8bebd5e 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Trabalho: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Segundo <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Terceiro <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Para liberar esta tela, toque no botão \"Voltar\" e mantenha-o pressionado."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"O app está fixado. A liberação não é permitida neste dispositivo."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Tela fixada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Tela liberada"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 7af49e8b0c03..378ea61a363f 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1583,7 +1583,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de serviciu"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> pentru serviciu (2)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> pentru serviciu (3)"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Pentru a anula fixarea acestui ecran, atingeți lung opțiunea Înapoi."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplicația este fixată: Anularea fixării nu este permisă pe acest dispozitiv."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ecran fixat"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Fixarea ecranului anulată"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 073033eb541a..4887de9a9cfb 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Рабочий <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Задача 2: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Задача 3: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Чтобы открепить экран, нажмите и удерживайте кнопку \"Назад\"."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Включена блокировка в приложении. Ее отключение запрещено правилами организации."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Блокировка включена"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Блокировка выключена"</string>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index c9b231a6bbbe..88d8de7d9434 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -1561,7 +1561,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"වැඩ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2වන වැඩ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3වන වැඩ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"මෙම තිරය ඇමුණුම් ඉවත් කිරීමට, ස්පර්ශ කර අල්ලා ගෙන සිටින්න."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"යෙදුම අමුණා ඇත: ගැලවීමට මෙම උපාංගය මත ඉඩ දිය නොහැකිය.‍"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"තිරය අගුළු දමා ඇත"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"තිරයේ අගුළු ඇර ඇත"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 298b70f00774..d731263cf70e 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Práca – <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> do práce"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> do práce"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Ak chcete uvoľniť túto obrazovku, klepnite na tlačidlo Späť a podržte ho."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplikácia je pripnutá. Uvoľnenie nie je na tomto zariadení povolené."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Obrazovka bola pripnutá"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Obrazovka bola uvoľnená"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index c972bc0d6c2e..717048d15cec 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> za delo"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. službeni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. službeni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Če želite odpeti ta zaslon, se dotaknite tipke za nazaj in jo pridržite."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Aplikacija je pripeta: v tej napravi odpenjanje ni dovoljeno."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Zaslon je pripet"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Zaslon je odpet"</string>
diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml
index bf5110bfacc8..25786840bb0c 100644
--- a/core/res/res/values-sq-rAL/strings.xml
+++ b/core/res/res/values-sq-rAL/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Puna <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> i dytë i punës"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> i tretë i punës"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Për të hequr gozhdimin e ekranit, prek dhe mbaj të shtypur \"Prapa\"."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Ekrani është i gozhduar. Anulimi i mbërthimit nuk lejohet nga organizata jote."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekrani u gozhdua"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekrani u hoq nga gozhdimi"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index b5adb2ce284f..70f93bffb424 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1583,7 +1583,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> на послу"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. пословни <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. пословни имејл <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Да бисте откачили овај екран, додирните и задржите Назад."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Апликација је закачена: откачињање није дозвољено на овом уређају."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Екран је закачен"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Екран је откачен"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index dfedf4c7c9bc..3071cb1b897e 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> för arbetet"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Andra <xliff:g id="LABEL">%1$s</xliff:g> för jobbet"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Tredje <xliff:g id="LABEL">%1$s</xliff:g> för jobbet"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Om du vill lossa skärmen trycker du länge på Tillbaka."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Appen är fäst. Att lossa den är inte tillåtet på den här enheten."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skärmen är fäst"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skärmen är inte längre fäst"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 6cd3b8974abd..8d9f85b25d6a 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1557,7 +1557,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Ya kazini <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> ya 2 ya Kazini"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> ya 3 ya Kazini"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Ili kubandua skrini hii, gusa na ushikilie Nyuma."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Programu imebanwa: Kubanuliwa hakuruhusiwi kwenye kifaa hiki."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skrini imebandikwa"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skrini imebanduliwa"</string>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index abc9f6e27455..08b6802ece6a 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"பணியிடம் <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2வது பணி <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3வது பணி <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"இந்தத் திரையை விலக்க, \"முந்தையது\" பொத்தானைத் தொட்டுப் பிடிக்கவும்."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"பயன்பாடு பொருத்தப்பட்டது: பொருத்தியதை நீக்குவதற்கு இந்தச் சாதனத்தில் அனுமதியில்லை."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"திரை பின் செய்யப்பட்டது"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"திரையின் பின் அகற்றப்பட்டது"</string>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index 90db0497cc1f..29a43deeaef0 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"కార్యాలయం <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2వ కార్యాలయం <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3వ కార్యాలయం <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"ఈ స్క్రీన్‌ని అన్‌పిన్ చేయడానికి, వెనుకకు తాకి &amp; అలాగే పట్టుకోండి."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"అనువర్తనం పిన్ చేయబడింది: ఈ పరికరంలో అన్‌పిన్ చేయడానికి అనుమతి లేదు."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"స్క్రీన్ పిన్ చేయబడింది"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"స్క్రీన్ అన్‌పిన్ చేయబడింది"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 5395fbabbeca..453e0ae7bf44 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g>ที่ทำงาน"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> งานที่ 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> งานที่ 3"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"หากต้องการเลิกตรึงหน้าจอนี้ แตะ \"กลับ\" ค้างไว้"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"มีการตรึงแอป: ไม่อนุญาตให้เลิกตรึงบนอุปกรณ์นี้"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ตรึงหน้าจอแล้ว"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"เลิกตรึงหน้าจอแล้ว"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index bbe45f579cf4..d9be9d9a3209 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> sa Trabaho"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Pangalawang <xliff:g id="LABEL">%1$s</xliff:g> sa Trabaho"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Pangatlong <xliff:g id="LABEL">%1$s</xliff:g> sa Trabaho"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Upang i-unpin ang screen na ito, pindutin nang matagal ang Bumalik."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Naka-pin ang app: Hindi pinapayagan ang pag-a-unpin sa device na ito."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Naka-pin ang screen"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Naka-unpin ang screen"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index ac184a464230..067e4c863f70 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (İş)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"İş için 2. <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"İş için 3. <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Bu ekranın sabitlemesini kaldırmak için Geri\'ye dokunup basılı tutun."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Uygulama sabitlendi. Bu cihazda sabitlemenin kaldırılmasına izin verilmiyor."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran sabitlendi"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran sabitlemesi kaldırıldı"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index def0cbf51689..2af72cd51be0 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1607,7 +1607,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Робоча <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-а робота: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-я робота: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Щоб відкріпити цей екран, натисніть і утримуйте кнопку \"Назад\"."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Додаток закріплено. Його не можна відкріпити на цьому пристрої."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Екран закріплено"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Екран відкріплено"</string>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 17b657dc34e1..5f09905ae406 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"دفتر <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"دوسرا کام <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"تیسرا کام <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"اس اسکرین سے پن ہٹانے کیلئے، پیچھے کو تھپتھپائیں اور دبا کر رکھیں۔"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"ایپ کو پن کر دیا گیا ہے: اس آلہ پر پن ہٹانے کی اجازت نہیں ہے۔"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"اسکرین کو پن کر دیا گیا"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"اسکرین کا پن ہٹا دیا گیا"</string>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index bc17d6ed899a..489aeb749c38 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -703,7 +703,7 @@
<string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"To‘xtatish"</string>
<string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"Orqaga o‘tkazish"</string>
<string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"Oldinga o‘tkazish"</string>
- <string name="emergency_calls_only" msgid="6733978304386365407">"Faqat favqulodda qo‘ng‘iroqlar"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"Faqat favqulodda chaqiruvlar"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Tarmoq qulflangan"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM karta PUK kod bilan qulflangan."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Foydalanuvchi qo‘llanmasiga qarang yoki Abonentlarni qo‘llab-quvvatlash markaziga murojaat qiling."</string>
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Ish <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-ishxona <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-ishxona <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Bu ekrandan chiqish uchun “Orqaga” tugmasini bosib turing."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Ilova qadab qo‘yilgan. Uni ekrandan yechish ushbu qurilmada ta’qiqlangan."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran qadab qo‘yildi"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran bo‘shatildi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 8448f38032bc..68bd5786d4e5 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> làm việc"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Công việc thứ 2 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Công việc thứ 2 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Để bỏ ghim màn hình này, nhấn và giữ Quay lại."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Ứng dụng được ghim: Không được phép bỏ ghim trên thiết bị này."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Đã ghim màn hình"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Đã bỏ ghim màn hình"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 4d80c82cc39c..aa12714433d1 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -298,9 +298,9 @@
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"允许应用读取您的设备收到的小区广播消息。小区广播消息是在某些地区发送的、用于发布紧急情况警告的提醒信息。恶意应用可能会在您收到小区紧急广播时干扰您设备的性能或操作。"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"读取订阅的供稿"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"允许应用获取有关当前同步的 Feed 的详情。"</string>
- <string name="permlab_sendSms" msgid="7544599214260982981">"发送和查看短信"</string>
+ <string name="permlab_sendSms" msgid="7544599214260982981">"发送短信"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"允许该应用发送短信。此权限可能会导致意外收费。恶意应用可能会未经您的确认而发送短信,由此产生相关费用。"</string>
- <string name="permlab_readSms" msgid="8745086572213270480">"读取您的讯息(短信或彩信)"</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"读取短信"</string>
<string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"此应用可读取您平板电脑上存储的所有短信。"</string>
<string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"此应用可读取您电视上存储的所有短信。"</string>
<string name="permdesc_readSms" product="default" msgid="6826832415656437652">"此应用可读取您手机上存储的所有短信。"</string>
@@ -334,7 +334,7 @@
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"允许该应用发送持久广播消息,此类消息在广播结束后仍会保留。过度使用可能会导致平板电脑使用过多内存,从而降低其速度或稳定性。"</string>
<string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"允许应用发送持久广播消息,此类消息在广播结束后仍会保留。过度使用可能会导致电视使用过多内存,从而降低其速度或稳定性。"</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"允许该应用发送持久广播消息,此类消息在广播结束后仍会保留。过度使用可能会导致手机使用过多内存,从而降低其速度或稳定性。"</string>
- <string name="permlab_readContacts" msgid="8348481131899886131">"读取您的通讯录"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"读取联系人"</string>
<string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"允许该应用读取您平板电脑上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定个人通信的频率。此权限可让应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。"</string>
<string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"允许应用读取您的电视上存储的联系人相关数据,包括您与特定联系人通话、发送电子邮件或通过其他方式进行通信的频率。此权限可让应用保存您的联系人数据,而且恶意应用可能会在您不知情的情况下分享联系人数据。"</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"允许该应用读取您手机上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定个人通信的频率。此权限可让应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。"</string>
@@ -344,7 +344,7 @@
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"允许该应用修改您手机上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定联系人通信的频率。此权限可让应用删除联系人数据。"</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"读取通话记录"</string>
<string name="permdesc_readCallLog" msgid="3204122446463552146">"此应用可读取您的通话记录。"</string>
- <string name="permlab_writeCallLog" msgid="8552045664743499354">"写入通话记录"</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"新建/修改/删除通话记录"</string>
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"允许该应用修改平板电脑的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。"</string>
<string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"允许应用修改电视的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。"</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"允许该应用修改手机的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。"</string>
@@ -376,7 +376,7 @@
<string name="permdesc_camera" msgid="5392231870049240670">"此应用可随时使用相机拍摄照片和录制视频。"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"控制振动"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"允许应用控制振动器。"</string>
- <string name="permlab_callPhone" msgid="3925836347681847954">"直接拨打电话号码"</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"拨打电话"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"允许该应用在您未执行操作的情况下拨打电话号码。此权限可能会导致意外收费或呼叫。请注意,此权限不允许该应用拨打紧急电话号码。恶意应用可通过拨打电话产生相关费用,而无需您的确认。"</string>
<string name="permlab_accessImsCallService" msgid="3574943847181793918">"使用即时通讯通话服务"</string>
<string name="permdesc_accessImsCallService" msgid="8992884015198298775">"允许应用自行使用即时通讯服务拨打电话。"</string>
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"第二个工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"第三个工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"要取消固定此屏幕,请触摸并按住“返回”按钮。"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"应用处于固定状态:在此设备上不允许退出该模式。"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"已固定屏幕"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"已取消固定屏幕"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 410548e11e0e..09141a10a925 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"公司<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"第二個工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"第三個工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"如要取消固定這個畫面,請按住 [返回]。"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"應用程式已固定:不允許在此裝置上取消固定。"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"螢幕已固定"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"已取消固定螢幕"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 51f6d7d04bd3..bc575950f6da 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"公司<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"第 2 項工作:<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"第 3 項工作:<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"如要取消固定這個畫面,請按住「返回」按鈕。"</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"應用程式已固定:無法在這部裝置取消固定。"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"已固定螢幕"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"已取消固定螢幕"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index a26c7651dd6f..e5ad8d7289e5 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1559,7 +1559,8 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Umsebenzi <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Umsebenzi wesibili <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Umsebenzi wesithathu <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="1420543809500606964">"Ukuze ususe ukuphina lesi sikrini, thinta futhi ubambe okuthi Emuva."</string>
+ <!-- no translation found for lock_to_app_toast (7693684144593484) -->
+ <skip />
<string name="lock_to_app_toast_locked" msgid="9125176335701699164">"Uhlelo lokusebenza luphiniwe: Ukususa ukuphina akuvunyelwe kule divayisi."</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Isikrini siphiniwe"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Isikrini sisuswe ukuphina"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 9cbb8c3b0167..89581bbb3ac4 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1049,6 +1049,16 @@
Must be in the range specified by minimum and maximum. -->
<integer name="config_screenBrightnessSettingDefault">102</integer>
+ <!-- Default screen brightness for VR setting. -->
+ <integer name="config_screenBrightnessForVrSettingDefault">86</integer>
+
+ <!-- Minimum screen brightness setting allowed for VR. Device panels start increasing pulse
+ width as brightness decreases below this theshold. -->
+ <integer name="config_screenBrightnessForVrSettingMinimum">79</integer>
+
+ <!-- Maximum screen brightness setting allowed for VR. -->
+ <integer name="config_screenBrightnessForVrSettingMaximum">255</integer>
+
<!-- Screen brightness used to dim the screen while dozing in a very low power state.
May be less than the minimum allowed brightness setting
that can be set by the user. -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index b7f5a9bb3a13..b0d6457720f4 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2868,17 +2868,6 @@
<!-- If there is ever a ringtone set for some setting, but that ringtone can no longer be resolved, t his is shown instead. For example, if the ringtone was on a SD card and it had been removed, this woudl be shown for ringtones on that SD card. -->
<string name="ringtone_unknown">Unknown</string>
- <!-- A notification is shown when there are open wireless networks nearby. This is the notification's title. -->
- <plurals name="wifi_available">
- <item quantity="one">Wi-Fi network available</item>
- <item quantity="other">Wi-Fi networks available</item>
- </plurals>
- <!-- A notification is shown when there are open wireless networks nearby. This is the notification's message. -->
- <plurals name="wifi_available_detailed">
- <item quantity="one">Open Wi-Fi network available</item>
- <item quantity="other">Open Wi-Fi networks available</item>
- </plurals>
-
<!-- A notification is shown when a wifi captive portal network is detected. This is the notification's title. -->
<string name="wifi_available_sign_in">Sign in to Wi-Fi network</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index cd3c0e358cb5..8639004a1fd0 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1803,6 +1803,9 @@
<java-symbol type="integer" name="config_screenBrightnessSettingMinimum" />
<java-symbol type="integer" name="config_screenBrightnessSettingMaximum" />
<java-symbol type="integer" name="config_screenBrightnessSettingDefault" />
+ <java-symbol type="integer" name="config_screenBrightnessForVrSettingDefault" />
+ <java-symbol type="integer" name="config_screenBrightnessForVrSettingMaximum" />
+ <java-symbol type="integer" name="config_screenBrightnessForVrSettingMinimum" />
<java-symbol type="integer" name="config_screenBrightnessDark" />
<java-symbol type="integer" name="config_screenBrightnessDim" />
<java-symbol type="integer" name="config_screenBrightnessDoze" />
@@ -1816,8 +1819,6 @@
<java-symbol type="layout" name="safe_mode" />
<java-symbol type="layout" name="simple_list_item_2_single_choice" />
<java-symbol type="layout" name="app_error_dialog" />
- <java-symbol type="plurals" name="wifi_available" />
- <java-symbol type="plurals" name="wifi_available_detailed" />
<java-symbol type="string" name="accessibility_binding_label" />
<java-symbol type="string" name="adb_active_notification_message" />
<java-symbol type="string" name="adb_active_notification_title" />
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 4699fd5f16e0..a0a9e0129152 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -33,7 +33,9 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
mockito-target-minus-junit4 \
espresso-core \
ub-uiautomator \
- platform-test-annotations
+ platform-test-annotations \
+ compatibility-device-util
+
LOCAL_JAVA_LIBRARIES := android.test.runner conscrypt telephony-common org.apache.http.legacy
LOCAL_PACKAGE_NAME := FrameworksCoreTests
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index e3a85b562068..504541d9522b 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -55,6 +55,8 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INJECT_EVENTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.READ_DREAM_STATE" />
+ <uses-permission android:name="android.permission.WRITE_DREAM_STATE" />
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS"/>
@@ -831,14 +833,14 @@
</intent-filter>
</activity>
- <activity android:name="android.widget.listview.ListManagedCursor" android:label="ListManagedCursor">
+ <activity android:name="android.widget.listview.ListManagedCursor" android:label="ListManagedCursor">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
</intent-filter>
</activity>
- <activity android:name="android.widget.listview.ListWithEmptyView" android:label="ListWithEmptyView">
+ <activity android:name="android.widget.listview.ListWithEmptyView" android:label="ListWithEmptyView">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
@@ -1331,6 +1333,27 @@
</meta-data>
</service>
+ <activity
+ android:name="android.print.mockservice.SettingsActivity"
+ android:permission="android.permission.START_PRINT_SERVICE_CONFIG_ACTIVITY"
+ android:exported="true">
+ </activity>
+
+ <activity
+ android:name="android.os.TestVrActivity"
+ android:enableVrMode="com.android.frameworks.coretests/android.os.TestVrActivity$TestVrListenerService">
+ </activity>
+
+ <service android:name="android.os.TestVrActivity$TestVrListenerService"
+ android:exported="true"
+ android:enabled="true"
+ android:label="Test Vr Listener Service"
+ android:permission="android.permission.BIND_VR_LISTENER_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.vr.VrListenerService" />
+ </intent-filter>
+ </service>
+
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/core/tests/coretests/src/android/os/PowerManagerVrTest.java b/core/tests/coretests/src/android/os/PowerManagerVrTest.java
new file mode 100644
index 000000000000..e01e5fa4faee
--- /dev/null
+++ b/core/tests/coretests/src/android/os/PowerManagerVrTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.service.dreams.IDreamManager;
+import android.service.dreams.DreamService;
+import android.support.test.filters.MediumTest;
+import android.support.test.filters.SmallTest;
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+ * Tests dream aspects of PowerManager.
+ */
+@MediumTest
+public class PowerManagerVrTest extends ActivityInstrumentationTestCase2<TestVrActivity> {
+ private PowerManager mPm;
+ private IDreamManager mDm;
+ private String mOldVrListener;
+
+ public PowerManagerVrTest() {
+ super(TestVrActivity.class);
+ }
+
+ /**
+ * Setup any common data for the upcoming tests.
+ */
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ Context context = getInstrumentation().getTargetContext();
+ mPm = (PowerManager) getInstrumentation().getTargetContext().getSystemService(
+ Context.POWER_SERVICE);
+ mDm = IDreamManager.Stub.asInterface(
+ ServiceManager.getService(DreamService.DREAM_SERVICE));
+
+ mOldVrListener = setTestVrListener(new ComponentName(
+ context, TestVrActivity.TestVrListenerService.class).flattenToString());
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ if (mDm != null) {
+ mDm.awaken(); // Don't leave the device in the dream state.
+ }
+
+ setTestVrListener(mOldVrListener);
+ }
+
+ /**
+ * Confirm that the setup is good.
+ *
+ * @throws Exception
+ */
+ @SmallTest
+ public void testPreconditions() throws Exception {
+ assertNotNull(mPm);
+ assertNotNull(mDm);
+ }
+
+ /**
+ * Confirm that the system prevents napping while in VR.
+ * Dreaming is controlled by PowerManager, but we use dreamManager to access those features
+ * in order to not require DEVICE_POWER permissions which other tests expect not to have.
+ *
+ * @throws Exception
+ */
+ @SmallTest
+ public void testNap() throws Exception {
+ // For dream to work, we need to wake up the system
+ wakeUpDevice();
+
+ mDm.dream();
+ waitForDreamState(true);
+ assertTrue(mDm.isDreaming());
+ mDm.awaken();
+
+ // awaken() is not immediate so we have to wait for dreaming to stop
+ // before continuing with the test.
+ waitForDreamState(false);
+
+ // set VR Mode to true by starting our VR Activity, then retest the dream.
+ TestVrActivity activity = getActivity();
+ assertTrue(activity.waitForActivityStart());
+
+ try {
+ mDm.dream();
+ waitForDreamState(true); // wait for dream to turn true with a timeout
+ assertFalse(mDm.isDreaming()); // ensure dream is still false after waiting.
+ mDm.awaken();
+ } finally {
+ activity.finish();
+ }
+ }
+
+ /**
+ * Waits synchronously for the system to be set to the specified dream state.
+ */
+ private void waitForDreamState(boolean isDreaming) throws Exception {
+ final int MAX_ATTEMPTS = 10;
+ final int WAIT_TIME_PER_ATTEMPT_MILLIS = 100;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ if (mDm.isDreaming() == isDreaming) {
+ break;
+ }
+ Thread.sleep(WAIT_TIME_PER_ATTEMPT_MILLIS);
+ }
+ }
+
+ private void wakeUpDevice() {
+ PowerManager.WakeLock wl = mPm.newWakeLock(
+ PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP
+ | PowerManager.ON_AFTER_RELEASE, "FULL_WAKE_LOCK");
+ wl.acquire();
+ wl.release();
+ }
+
+ /**
+ * Sets a new value for the enabled VrListenerService and returns the previous value.
+ */
+ private String setTestVrListener(String newValue) {
+ final String ENABLED_VR_LISTENERS = "enabled_vr_listeners";
+ Context context = getInstrumentation().getTargetContext();
+ ContentResolver cr = context.getContentResolver();
+ String oldVrListeners = Settings.Secure.getString(cr, ENABLED_VR_LISTENERS);
+ Settings.Secure.putString(cr, ENABLED_VR_LISTENERS, newValue);
+ return oldVrListeners;
+ }
+}
diff --git a/core/tests/coretests/src/android/os/TestVrActivity.java b/core/tests/coretests/src/android/os/TestVrActivity.java
new file mode 100644
index 000000000000..33ff1645b37b
--- /dev/null
+++ b/core/tests/coretests/src/android/os/TestVrActivity.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.os;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.service.vr.VrListenerService;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * An activity for enabling/disabling VrMode.
+ */
+public class TestVrActivity extends Activity {
+ private CountDownLatch mLatch;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mLatch = new CountDownLatch(1);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mLatch.countDown();
+ }
+
+ public static class TestVrListenerService extends VrListenerService {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ }
+ }
+
+ public boolean waitForActivityStart() {
+ boolean result = false;
+ try {
+ result = mLatch.await(2L, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ }
+ return result;
+ }
+}
diff --git a/core/tests/coretests/src/android/view/ViewInvalidateTest.java b/core/tests/coretests/src/android/view/ViewInvalidateTest.java
new file mode 100644
index 000000000000..4db70ec4a1c4
--- /dev/null
+++ b/core/tests/coretests/src/android/view/ViewInvalidateTest.java
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static junit.framework.Assert.assertFalse;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Rect;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.LargeTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.widget.FrameLayout;
+
+import com.android.compatibility.common.util.WidgetTestUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Test of invalidates, drawing, and the flags that support them
+ */
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class ViewInvalidateTest {
+ @Rule
+ public ActivityTestRule<Activity> mActivityRule = new ActivityTestRule<>(Activity.class);
+
+ private static final int INVAL_TEST_FLAG_MASK = View.PFLAG_DIRTY
+ | View.PFLAG_DIRTY_OPAQUE
+ | View.PFLAG_DRAWN
+ | View.PFLAG_DRAWING_CACHE_VALID
+ | View.PFLAG_INVALIDATED
+ | View.PFLAG_DRAW_ANIMATION;
+
+ @Before
+ public void setup() throws Throwable {
+ // separate runnable to initialize, so ref is safe to pass to runOnMainAndDrawSync
+ mActivityRule.runOnUiThread(() -> {
+ mParent = new FrameLayout(getContext());
+ mChild = new View(getContext());
+ });
+
+ // attached view is drawn once
+ WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mParent, () -> {
+ mParent.addView(mChild);
+ getActivity().setContentView(mParent);
+
+ // 'invalidated', but not yet drawn
+ validateInvalFlags(mChild, View.PFLAG_INVALIDATED);
+ });
+ }
+
+ @After
+ public void teardown() {
+ // ensure we don't share views between tests
+ mParent = null;
+ mChild = null;
+ }
+
+ Context getContext() {
+ return InstrumentationRegistry.getTargetContext();
+ }
+
+ Activity getActivity() {
+ return mActivityRule.getActivity();
+ }
+
+ private ViewGroup mParent;
+ private View mChild;
+
+ private static void validateInvalFlags(View view, int... expectedFlagArray) {
+ int expectedFlags = 0;
+ for (int expectedFlag : expectedFlagArray) {
+ expectedFlags |= expectedFlag;
+ }
+
+ final int observedFlags = view.mPrivateFlags & INVAL_TEST_FLAG_MASK;
+ assertEquals(String.format("expect %x, observed %x", expectedFlags, observedFlags),
+ expectedFlags, observedFlags);
+ }
+
+ private static ViewRootImpl getViewRoot(View view) {
+ ViewParent parent = view.getParent();
+ while (parent != null) {
+ if (parent instanceof ViewRootImpl) {
+ return (ViewRootImpl) parent;
+ }
+ parent = parent.getParent();
+ }
+ return null;
+ }
+
+ @UiThreadTest
+ @Test
+ public void testInvalidate_behavior() throws Throwable {
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+ validateInvalFlags(mParent,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+ assertFalse(getViewRoot(mParent).mTraversalScheduled);
+
+ mChild.invalidate();
+
+ // no longer drawn, is now invalidated
+ validateInvalFlags(mChild,
+ View.PFLAG_DIRTY,
+ View.PFLAG_INVALIDATED);
+
+ // parent drawing cache no longer valid, marked dirty
+ validateInvalFlags(mParent,
+ View.PFLAG_DRAWN,
+ View.PFLAG_DIRTY);
+ assertTrue(getViewRoot(mParent).mTraversalScheduled);
+ }
+
+ @UiThreadTest
+ @Test
+ public void testInvalidate_false() {
+ // Invalidate makes it invalid
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+
+ mChild.invalidate(/*don't invalidate cache*/ false);
+
+ // drawn is cleared, dirty set, nothing else changed
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DIRTY);
+ }
+
+ @Test
+ public void testInvalidate_simple() throws Throwable {
+ // simple invalidate, which marks the view invalid
+ WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mParent, () -> {
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+
+ mChild.invalidate();
+
+ validateInvalFlags(mChild,
+ View.PFLAG_DIRTY,
+ View.PFLAG_INVALIDATED);
+ });
+
+ // after draw pass, view has drawn, no longer invalid
+ mActivityRule.runOnUiThread(() -> {
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+ });
+ }
+
+ @UiThreadTest
+ @Test
+ public void testInvalidate_manualUpdateDisplayList() {
+ // Invalidate makes it invalid
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+
+ mChild.invalidate();
+ validateInvalFlags(mChild,
+ View.PFLAG_DIRTY,
+ View.PFLAG_INVALIDATED);
+
+ // updateDisplayListIfDirty makes it valid again, but invalidate still set,
+ // since it's cleared by View#draw(canvas, parent, drawtime)
+ mChild.updateDisplayListIfDirty();
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN,
+ View.PFLAG_INVALIDATED);
+ }
+
+ @UiThreadTest
+ @Test
+ public void testInvalidateChild_simple() {
+ validateInvalFlags(mParent,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+ assertFalse(getViewRoot(mParent).mTraversalScheduled);
+
+ mParent.invalidateChild(mChild, new Rect(0, 0, 1, 1));
+
+ validateInvalFlags(mParent,
+ View.PFLAG_DIRTY,
+ View.PFLAG_DRAWN);
+ assertTrue(getViewRoot(mParent).mTraversalScheduled);
+ }
+
+ @Test
+ public void testInvalidateChild_childHardwareLayer() throws Throwable {
+ WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mParent, () -> {
+ // do in runnable, so tree won't be dirty
+ mChild.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ });
+
+ mActivityRule.runOnUiThread(() -> {
+ validateInvalFlags(mParent,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+
+ mParent.invalidateChild(mChild, new Rect(0, 0, 1, 1));
+
+ validateInvalFlags(mParent,
+ View.PFLAG_DIRTY,
+ View.PFLAG_DRAWN,
+ View.PFLAG_INVALIDATED);
+ });
+ }
+
+ @UiThreadTest
+ @Test
+ public void testInvalidateChild_legacyAnimation() throws Throwable {
+ mChild.mPrivateFlags |= View.PFLAG_DRAW_ANIMATION;
+
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAW_ANIMATION,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+ validateInvalFlags(mParent,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+ assertFalse(getViewRoot(mParent).mIsAnimating);
+
+ mParent.invalidateChild(mChild, new Rect(0, 0, 1, 1));
+
+ validateInvalFlags(mChild,
+ View.PFLAG_DRAW_ANIMATION,
+ View.PFLAG_DRAWING_CACHE_VALID,
+ View.PFLAG_DRAWN);
+ validateInvalFlags(mParent,
+ View.PFLAG_DIRTY,
+ View.PFLAG_DRAW_ANIMATION, // carried up to parent
+ View.PFLAG_DRAWN);
+ assertTrue(getViewRoot(mParent).mIsAnimating);
+ }
+}
diff --git a/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java b/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java
new file mode 100644
index 000000000000..1e55fb182b4a
--- /dev/null
+++ b/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.widget;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.appwidget.AppWidgetHostView;
+import android.appwidget.AppWidgetManager;
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.View;
+import android.view.ViewGroup.OnHierarchyChangeListener;
+
+import com.android.frameworks.coretests.R;
+
+import java.util.ArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for AppWidgetHostView
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class AppWidgetHostViewTest {
+
+ @Rule
+ public final ExpectedException exception = ExpectedException.none();
+
+ private Context mContext;
+ private String mPackage;
+ private AppWidgetHostView mHostView;
+
+ private ViewAddListener mViewAddListener;
+ private RemoteViews mViews;
+
+ @Before
+ public void setup() {
+ mContext = InstrumentationRegistry.getContext();
+ mPackage = mContext.getPackageName();
+ mHostView = new AppWidgetHostView(mContext);
+ mHostView.setAppWidget(0, AppWidgetManager.getInstance(
+ mContext).getInstalledProviders().get(0));
+
+ mViewAddListener = new ViewAddListener();
+ mHostView.setOnHierarchyChangeListener(mViewAddListener);
+
+ mViews = new RemoteViews(mPackage, R.layout.remote_views_test);
+ }
+
+ @Test
+ public void syncInflation() {
+ mHostView.updateAppWidget(mViews);
+ assertNotNull(mHostView.findViewById(R.id.image));
+ }
+
+ @Test
+ public void asyncInflation() throws Exception {
+ RunnableList executor = new RunnableList();
+ mHostView.setAsyncExecutor(executor);
+
+ mHostView.updateAppWidget(mViews);
+ assertNull(mHostView.findViewById(R.id.image));
+
+ // Task queued.
+ assertEquals(1, executor.size());
+
+ // Execute the pending task
+ executor.get(0).run();
+ mViewAddListener.addLatch.await();
+ assertNotNull(mHostView.findViewById(R.id.image));
+ }
+
+ @Test
+ public void asyncInflation_cancelled() throws Exception {
+ RunnableList executor = new RunnableList();
+ mHostView.setAsyncExecutor(executor);
+
+ mHostView.updateAppWidget(mViews.clone());
+ mHostView.updateAppWidget(mViews.clone());
+ assertNull(mHostView.findViewById(R.id.image));
+
+ // Tasks queued.
+ assertEquals(2, executor.size());
+ // First task cancelled
+ assertTrue(((Future) executor.get(0)).isCancelled());
+
+ // Execute the pending task
+ executor.get(0).run();
+ executor.get(1).run();
+ mViewAddListener.addLatch.await();
+ assertNotNull(mHostView.findViewById(R.id.image));
+ }
+
+ private static class RunnableList extends ArrayList<Runnable> implements Executor {
+
+ @Override
+ public void execute(Runnable runnable) {
+ add(runnable);
+ }
+ }
+
+ private class ViewAddListener implements OnHierarchyChangeListener {
+
+ public final CountDownLatch addLatch = new CountDownLatch(1);
+
+
+ @Override
+ public void onChildViewAdded(View parent, View child) {
+ addLatch.countDown();
+ }
+
+ @Override
+ public void onChildViewRemoved(View parent, View child) {
+ }
+ }
+}
diff --git a/libs/hwui/AnimatorManager.cpp b/libs/hwui/AnimatorManager.cpp
index 9d5860ca0d1a..f5bb821f4e23 100644
--- a/libs/hwui/AnimatorManager.cpp
+++ b/libs/hwui/AnimatorManager.cpp
@@ -142,7 +142,7 @@ void AnimatorManager::animateNoDamage(TreeInfo& info) {
}
uint32_t AnimatorManager::animateCommon(TreeInfo& info) {
- uint32_t dirtyMask;
+ uint32_t dirtyMask = 0;
AnimateFunctor functor(info, mAnimationHandle->context(), &dirtyMask);
auto newEnd = std::remove_if(mAnimators.begin(), mAnimators.end(), functor);
mAnimators.erase(newEnd, mAnimators.end());
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 4154ef02772b..329514c0b7fc 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -542,16 +542,27 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
/**
- * This method is part of the SurfaceHolder.Callback interface, and is
+ * This method is part of the SurfaceHolder.Callback2 interface, and is
* not normally called or subclassed by clients of GLSurfaceView.
*/
@Override
- public void surfaceRedrawNeeded(SurfaceHolder holder) {
+ public void surfaceRedrawNeededAsync(SurfaceHolder holder, Runnable finishDrawing) {
if (mGLThread != null) {
- mGLThread.requestRenderAndWait();
+ mGLThread.requestRenderAndNotify(finishDrawing);
}
}
+ /**
+ * This method is part of the SurfaceHolder.Callback2 interface, and is
+ * not normally called or subclassed by clients of GLSurfaceView.
+ */
+ @Deprecated
+ @Override
+ public void surfaceRedrawNeeded(SurfaceHolder holder) {
+ // Since we are part of the framework we know only surfaceRedrawNeededAsync
+ // will be called.
+ }
+
/**
* Pause the rendering thread, optionally tearing down the EGL context
@@ -1305,6 +1316,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
int w = 0;
int h = 0;
Runnable event = null;
+ Runnable finishDrawingRunnable = null;
while (true) {
synchronized (sGLThreadManager) {
@@ -1400,6 +1412,11 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
sGLThreadManager.notifyAll();
}
+ if (mFinishDrawingRunnable != null) {
+ finishDrawingRunnable = mFinishDrawingRunnable;
+ mFinishDrawingRunnable = null;
+ }
+
// Ready to draw?
if (readyToDraw()) {
@@ -1453,7 +1470,6 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
break;
}
}
-
// By design, this is the only place in a GLThread thread where we wait().
if (LOG_THREADS) {
Log.i("GLThread", "waiting tid=" + getId()
@@ -1546,6 +1562,10 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
try {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "onDrawFrame");
view.mRenderer.onDrawFrame(gl);
+ if (finishDrawingRunnable != null) {
+ finishDrawingRunnable.run();
+ finishDrawingRunnable = null;
+ }
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
@@ -1625,7 +1645,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
}
- public void requestRenderAndWait() {
+ public void requestRenderAndNotify(Runnable finishDrawing) {
synchronized(sGLThreadManager) {
// If we are already on the GL thread, this means a client callback
// has caused reentrancy, for example via updating the SurfaceView parameters.
@@ -1638,17 +1658,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
mWantRenderNotification = true;
mRequestRender = true;
mRenderComplete = false;
+ mFinishDrawingRunnable = finishDrawing;
sGLThreadManager.notifyAll();
-
- while (!mExited && !mPaused && !mRenderComplete && ableToDraw()) {
- try {
- sGLThreadManager.wait();
- } catch (InterruptedException ex) {
- Thread.currentThread().interrupt();
- }
- }
-
}
}
@@ -1821,6 +1833,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private boolean mRenderComplete;
private ArrayList<Runnable> mEventQueue = new ArrayList<Runnable>();
private boolean mSizeChanged = true;
+ private Runnable mFinishDrawingRunnable = null;
// End of member variables protected by the sGLThreadManager monitor.
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 8cf375a47ae6..cbd295e1f85e 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -287,26 +287,23 @@ public class ExternalStorageProvider extends DocumentsProvider {
String path = file.getAbsolutePath();
// Find the most-specific root path
- String mostSpecificId = null;
- String mostSpecificPath = null;
- synchronized (mRootsLock) {
- for (int i = 0; i < mRoots.size(); i++) {
- final String rootId = mRoots.keyAt(i);
- final String rootPath = mRoots.valueAt(i).path.getAbsolutePath();
- if (path.startsWith(rootPath) && (mostSpecificPath == null
- || rootPath.length() > mostSpecificPath.length())) {
- mostSpecificId = rootId;
- mostSpecificPath = rootPath;
- }
- }
+ boolean visiblePath = false;
+ RootInfo mostSpecificRoot = getMostSpecificRootForPath(path, false);
+
+ if (mostSpecificRoot == null) {
+ // Try visible path if no internal path matches. MediaStore uses visible paths.
+ visiblePath = true;
+ mostSpecificRoot = getMostSpecificRootForPath(path, true);
}
- if (mostSpecificPath == null) {
+ if (mostSpecificRoot == null) {
throw new FileNotFoundException("Failed to find root that contains " + path);
}
// Start at first char of path under root
- final String rootPath = mostSpecificPath;
+ final String rootPath = visiblePath
+ ? mostSpecificRoot.visiblePath.getAbsolutePath()
+ : mostSpecificRoot.path.getAbsolutePath();
if (rootPath.equals(path)) {
path = "";
} else if (rootPath.endsWith("/")) {
@@ -322,7 +319,29 @@ public class ExternalStorageProvider extends DocumentsProvider {
}
}
- return mostSpecificId + ':' + path;
+ return mostSpecificRoot.rootId + ':' + path;
+ }
+
+ private RootInfo getMostSpecificRootForPath(String path, boolean visible) {
+ // Find the most-specific root path
+ RootInfo mostSpecificRoot = null;
+ String mostSpecificPath = null;
+ synchronized (mRootsLock) {
+ for (int i = 0; i < mRoots.size(); i++) {
+ final RootInfo root = mRoots.valueAt(i);
+ final File rootFile = visible ? root.visiblePath : root.path;
+ if (rootFile != null) {
+ final String rootPath = rootFile.getAbsolutePath();
+ if (path.startsWith(rootPath) && (mostSpecificPath == null
+ || rootPath.length() > mostSpecificPath.length())) {
+ mostSpecificRoot = root;
+ mostSpecificPath = rootPath;
+ }
+ }
+ }
+ }
+
+ return mostSpecificRoot;
}
private File getFileForDocId(String docId) throws FileNotFoundException {
@@ -519,15 +538,13 @@ public class ExternalStorageProvider extends DocumentsProvider {
boolean matchesRequestedDoc = false;
if (DocumentsContract.isTreeUri(uri)) {
final String parentDocId = DocumentsContract.getTreeDocumentId(uri);
- File parentFile = getFileForDocId(parentDocId);
- if (FileUtils.contains(parentFile, doc)) {
+ if (isChildDocument(parentDocId, docId)) {
treeUriPermission = uriPermission;
matchesRequestedDoc = true;
}
} else {
final String candidateDocId = DocumentsContract.getDocumentId(uri);
- final File candidateDoc = getFileForDocId(candidateDocId);
- if (Objects.equals(doc.getAbsolutePath(), candidateDoc.getAbsolutePath())) {
+ if (Objects.equals(docId, candidateDocId)) {
docUriPermission = uriPermission;
matchesRequestedDoc = true;
}
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index c86eb179bd7a..4d10f4979380 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Gebruik HDCP-kontrolering net vir DRM-inhoud"</item>
<item msgid="45075631231212732">"Gebruik altyd HDCP-kontrolering"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Af"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index fcda1d1eb4a8..2e2aee5c75df 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Laat altyd Wi-Fi-swerfskanderings toe"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Sellulêre data altyd aktief"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Deaktiveer absolute volume"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Wys opsies vir draadlose skermsertifisering"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Verhoog Wi-Fi-aantekeningvlak, wys per SSID RSSI in Wi‑Fi-kieser"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Wanneer dit geaktiveer is, sal Wi-Fi meer aggressief wees om die dataverbinding na selfoon oor te dra wanneer die Wi-Fi-sein swak is"</string>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index 0b68d40a9b5c..1f5c391b35f8 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"ለDRM ይዘት ብቻ HDCP ምልከታን ተጠቀም"</item>
<item msgid="45075631231212732">"ሁልጊዜ የHDCP ምልከታ ተጠቀም"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ጠፍቷል"</item>
<item msgid="1593289376502312923">"64 ኪባ"</item>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index a281bba741e8..b4ada539f965 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ሁልጊዜ የWi‑Fi ማንቀሳቀስ ቅኝቶችን ይፍቀዱ"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"የተንቀስቃሽ ስልክ ውሂብ ሁልጊዜ ንቁ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ፍጹማዊ ድምፅን አሰናክል"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"የገመድ አልባ ማሳያ እውቅና ማረጋገጫ አማራጮችን አሳይ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"የWi‑Fi ምዝግብ ማስታወሻ አያያዝ ደረጃ ጨምር፣ በWi‑Fi መምረጫ ውስጥ በአንድ SSID RSSI አሳይ"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ሲነቃ የWi‑Fi ምልክት ዝቅተኛ ሲሆን Wi‑Fi የውሂብ ግንኙነት ለተንቀሳቃሽ ማስረከብ ላይ ይበልጥ አስገዳጅ ይሆናል"</string>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index 3ae8072ba9c0..ef8eadd365c4 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"‏استخدام التحقق من HDCP لمحتوى DRM فقط"</item>
<item msgid="45075631231212732">"‏استخدام التحقق من HDCP دومًا"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"إيقاف"</item>
<item msgid="1593289376502312923">"٦٤ كيلوبايت"</item>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 9f6c440216ed..20f55e16d383 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"‏السماح دائمًا بعمليات فحص Wi-Fi للتجوال"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"بيانات الجوّال نشطة دائمًا"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"تعطيل مستوى الصوت المطلق"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"عرض خيارات شهادة عرض شاشة لاسلكي"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"‏زيادة مستوى تسجيل Wi-Fi، وعرض لكل SSID RSSI في منتقي Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"‏عند تمكينه، سيكون Wi-Fi أكثر حدة في تسليم اتصال البيانات إلى الشبكة الخلوية، وذلك عندما تكون إشارة WiFi منخفضة"</string>
diff --git a/packages/SettingsLib/res/values-az-rAZ/arrays.xml b/packages/SettingsLib/res/values-az-rAZ/arrays.xml
index cd8b1e0520ec..09f0beec1042 100644
--- a/packages/SettingsLib/res/values-az-rAZ/arrays.xml
+++ b/packages/SettingsLib/res/values-az-rAZ/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Yalnız DRM məzmun oxumaq üçün HDCP istifadə edin"</item>
<item msgid="45075631231212732">"Həmişə HDCP yoxlama istifadə edin"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Deaktiv"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-az-rAZ/strings.xml b/packages/SettingsLib/res/values-az-rAZ/strings.xml
index a53e97a60f2b..4a302de6af7d 100644
--- a/packages/SettingsLib/res/values-az-rAZ/strings.xml
+++ b/packages/SettingsLib/res/values-az-rAZ/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi axtarışlarına həmişə icazə verin"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobil data həmişə aktivdir"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Mütləq səs həcmi deaktiv edin"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Simsiz displey sertifikatlaşması üçün seçimləri göstərir"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi giriş səviyyəsini qaldırın, Wi‑Fi seçəndə hər SSID RSSI üzrə göstərin"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Aktiv olanda, Wi‑Fi sianqlı zəif olan zaman, Mobil şəbəkə data bağlantısına nisbətən, Wi‑Fi daha aqressiv olacaq"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index dbee985e55af..b40f2ebe2318 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Koristi HDCP proveru samo za DRM sadržaj"</item>
<item msgid="45075631231212732">"Uvek koristi HDCP proveru"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Isključeno"</item>
<item msgid="1593289376502312923">"64 kB"</item>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index cad5980fa336..fc436e937ab7 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvek dozvoli skeniranje Wi‑Fi-ja u romingu"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Podaci za mobilne uređaje su uvek aktivni"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogući glavno podešavanje jačine zvuka"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Prikaz opcija za sertifikaciju bežičnog ekrana"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećava nivo evidentiranja za Wi‑Fi. Prikaz po SSID RSSI-u u biraču Wi‑Fi mreže"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kada se omogući, Wi‑Fi će biti agresivniji pri prebacivanju mreže za prenos podataka na Mobilnu, kada je Wi‑Fi signal slab"</string>
diff --git a/packages/SettingsLib/res/values-be-rBY/arrays.xml b/packages/SettingsLib/res/values-be-rBY/arrays.xml
index 44d3bf2e788c..2e2bb1a72adf 100644
--- a/packages/SettingsLib/res/values-be-rBY/arrays.xml
+++ b/packages/SettingsLib/res/values-be-rBY/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Выкарыстанне праверкі HDCP только для змесціва, абароненага DRM"</item>
<item msgid="45075631231212732">"Заўсёды выкарыстоўваць праверку HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Выкл."</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-be-rBY/strings.xml b/packages/SettingsLib/res/values-be-rBY/strings.xml
index ba5b100c1641..0a4d8c3f9b1b 100644
--- a/packages/SettingsLib/res/values-be-rBY/strings.xml
+++ b/packages/SettingsLib/res/values-be-rBY/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Заўсёды дазваляць роўмінгавае сканіраванне Wi‑Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Перадача даных мабільнай сувязі заўсёды актыўна"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Адключыць абсалютны гук"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Паказаць опцыі сертыфікацыі бесправаднога дысплея"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Падвыс. узровень дэтал-цыі журнала Wi‑Fi у залежн. ад SSID RSSI у Wi‑Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Калі ўкл., прылада будзе больш інтэнсіўна імкнуцца перайсці з падлуч. да Wi-Fi на падлуч. да маб. сеткі, калі сігнал Wi‑Fi слабы"</string>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index b9e3352bebd9..248aee18b715 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Да се използва проверка с HDCP само за DRM съдържание"</item>
<item msgid="45075631231212732">"Винаги да се използва проверка с HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Изключено"</item>
<item msgid="1593289376502312923">"64 КБ"</item>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index b32388e034eb..592fde74e38d 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Сканирането за роуминг на Wi-Fi да е разрешено винаги"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Винаги активни клетъчни данни"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Деактивиране на пълната сила на звука"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показване на опциите за сертифициране на безжичния дисплей"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"По-подробно регистр. на Wi‑Fi – данни за RSSI на SSID в инстр. за избор на Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"При активиране предаването на връзката за данни от Wi-Fi към мобилната мрежа ще е по-агресивно, когато Wi-Fi сигналът е слаб"</string>
diff --git a/packages/SettingsLib/res/values-bn-rBD/arrays.xml b/packages/SettingsLib/res/values-bn-rBD/arrays.xml
index d9a3b04f93a4..73272eb9e2e2 100644
--- a/packages/SettingsLib/res/values-bn-rBD/arrays.xml
+++ b/packages/SettingsLib/res/values-bn-rBD/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"শুধুমাত্র DRM সামগ্রীর জন্য HDCP চেক করা ব্যবহার করুন"</item>
<item msgid="45075631231212732">"সর্বদা HDCP পরীক্ষণ ব্যবহার করুন"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"বন্ধ আছে"</item>
<item msgid="1593289376502312923">"৬৪K"</item>
diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml
index 3ee2642edd74..75177f3596df 100644
--- a/packages/SettingsLib/res/values-bn-rBD/strings.xml
+++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"সর্বদা Wifi রোম স্ক্যানকে অনুমতি দিন"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"সেলুলার ডেটা সর্বদাই সক্রিয় থাকে"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"চূড়ান্ত ভলিউম অক্ষম করুন"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ওয়্যারলেস প্রদর্শন সার্টিফিকেশন জন্য বিকল্পগুলি দেখান"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ওয়াই-ফাই লগিং স্তর বাড়ান, ওয়াই-ফাই চয়নকারীতে SSID RSSI অনুযায়ী দেখান"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"সক্ষম করা থাকলে, নিম্নমানের ওয়াই-ফাই সিগন্যালের ক্ষেত্রে, সেলুলার-এ ডেটা সংযোগ প্রদান করতে ওয়াই-ফাই আরো বেশি শক্তিশালীভাবে কাজ করবে"</string>
diff --git a/packages/SettingsLib/res/values-bs-rBA/arrays.xml b/packages/SettingsLib/res/values-bs-rBA/arrays.xml
index 3d99eadfd7c9..c8f59cf41905 100644
--- a/packages/SettingsLib/res/values-bs-rBA/arrays.xml
+++ b/packages/SettingsLib/res/values-bs-rBA/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Koristi HDCP provjeru samo za DRM sadržaj"</item>
<item msgid="45075631231212732">"Uvijek koristi HDCP provjeru"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Isključeno"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml
index b20712936594..a2401701a9bc 100644
--- a/packages/SettingsLib/res/values-bs-rBA/strings.xml
+++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvijek dopustiti Wi-Fi lutajuće skeniranje"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobilni podaci uvijek aktivni"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogućite apsolutnu jačinu zvuka"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaži opcije za certifikaciju Bežičnog prikaza"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećajte nivo Wi-Fi zapisivanja, pokazati po SSID RSSI Wi-Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kada je omogućeno, Wi-Fi će biti agresivniji u predavanju podatkovne veze mobilnoj, kada je Wi-Fi signal slab"</string>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index 4c9ad465edfc..909dfa356305 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Utilitza la comprovació HDCP només per a contingut DRM"</item>
<item msgid="45075631231212732">"Utilitza sempre la comprovació HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"No"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index c360f87b798f..d141f98b4efa 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permet sempre cerca de Wi-Fi en ininerància"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Dades mòbils sempre actives"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desactiva el volum absolut"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra les opcions de certificació de pantalla sense fil"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Augmenta nivell de registre Wi‑Fi i mostra\'l per SSID RSSI al Selector de Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si s\'activa, la Wi-Fi serà més agressiva en transferir la connexió de dades al mòbil, si el senyal de la Wi-Fi no és estable"</string>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index cf738c85d21e..5c1b027ceed7 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Použít kontrolu HDCP pouze pro obsah DRM"</item>
<item msgid="45075631231212732">"Vždy používat kontrolu HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Vypnuto"</item>
<item msgid="1593289376502312923">"64 kB"</item>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 159a9395040a..19c71a861bfb 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vždy povolit Wi-Fi roaming"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobilní data jsou vždy aktivní"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Zakázat absolutní hlasitost"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Zobrazit možnosti certifikace bezdrátového displeje"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zvýšit úroveň protokolování Wi‑Fi zobrazenou v SSID a RSSI při výběru sítě Wi‑Fi."</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Pokud je tato možnost zapnuta, bude síť Wi-Fi agresivnější při předávání datového připojení mobilní síti při slabém signálu Wi-Fi."</string>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index 2f82cf1aa042..a6b1388339b2 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Brug kun HDCP-kontrol ved DRM-indhold"</item>
<item msgid="45075631231212732">"Brug altid HDCP-kontrol"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Fra"</item>
<item msgid="1593289376502312923">"64 kB"</item>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 49f18995aac7..31e747a79a60 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillad altid scanning af Wi-Fi-roaming"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobildata altid aktiveret"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Deaktiver absolut lydstyrke"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vis valgmuligheder for certificering af trådløs skærm"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Øg mængden af Wi‑Fi-logføring. Vis opdelt efter SSID RSSI i Wi‑Fi-vælgeren"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Når dette er aktiveret, gennemtvinges en overdragelse af dataforbindelsen fra Wi-Fi til mobilnetværk, når Wi-Fi-signalet er svagt"</string>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index f5423bac9667..328f1fe34156 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP-Prüfung nur für DRM-Inhalte verwenden"</item>
<item msgid="45075631231212732">"HDCP-Prüfung immer verwenden"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Aus"</item>
<item msgid="1593289376502312923">"64.000"</item>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 95ac3135f781..65f72a2ae7c2 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"WLAN-Roamingsuchen immer zulassen"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobile Datennutzung immer aktiviert"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Maximallautstärke deaktivieren"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Level für WLAN-Protokollierung erhöhen, in WiFi Picker pro SSID-RSSI anzeigen"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Wenn diese Option aktiviert ist, ist WLAN bei schwachem Signal bei der Übergabe der Datenverbindung an den Mobilfunk aggressiver."</string>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 9a8d48eda59f..74f59f160459 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Χρήση ελέγχου HDCP μόνο για περιεχόμενο DRM"</item>
<item msgid="45075631231212732">"Να χρησιμοποιείται πάντα έλεγχος HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Ανενεργό"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index f3310809a611..f56f1aa597ae 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Να επιτρέπεται πάντα η σάρωση Wi-Fi κατά την περιαγωγή"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Πάντα ενεργά δεδομένα κινητής τηλεφωνίας"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Απενεργοποίηση απόλυτης έντασης"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Εμφάνιση επιλογών για πιστοποίηση ασύρματης οθόνης"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Αύξηση επιπέδου καταγ. Wi-Fi, εμφάνιση ανά SSID RSSI στο εργαλείο επιλογής Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Όταν είναι ενεργό, το Wi-Fi θα μεταβιβάζει πιο επιθετικά τη σύνδ.δεδομένων σε δίκτυο κινητής τηλ., όταν το σήμα Wi-Fi είναι χαμηλό"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index 60930519c8bb..c3cd50e126f5 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Use HDCP checking for DRM content only"</item>
<item msgid="45075631231212732">"Always use HDCP checking"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Off"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index e27822f80dc3..8c56ede47559 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobile data always active"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"When enabled, Wi‑Fi will be more aggressive in handing over the data connection to Mobile, when Wi‑Fi signal is low"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index 60930519c8bb..c3cd50e126f5 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Use HDCP checking for DRM content only"</item>
<item msgid="45075631231212732">"Always use HDCP checking"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Off"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index e27822f80dc3..8c56ede47559 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobile data always active"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"When enabled, Wi‑Fi will be more aggressive in handing over the data connection to Mobile, when Wi‑Fi signal is low"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index 60930519c8bb..c3cd50e126f5 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Use HDCP checking for DRM content only"</item>
<item msgid="45075631231212732">"Always use HDCP checking"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Off"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index e27822f80dc3..8c56ede47559 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobile data always active"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"When enabled, Wi‑Fi will be more aggressive in handing over the data connection to Mobile, when Wi‑Fi signal is low"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index c88b38abbf2b..7c02ce31fbf9 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Usar comprobación HDCP para contenido DRM solamente"</item>
<item msgid="45075631231212732">"Siempre utilizar comprobación HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Desactivado"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 9127b2a720fc..dbd2bffcd7e6 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Datos móviles siempre activos"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inhabilitar volumen absoluto"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opciones de certificación de pantalla inalámbrica"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar nivel de registro Wi-Fi; mostrar por SSID RSSI en el selector de Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si está habilitada, la conexión Wi‑Fi será más intensa al transferir la conexión de datos al celular (si la señal Wi‑Fi es débil)."</string>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index 3dc392a063ac..ed3ab944fdfc 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Utilizar comprobación de HDCP solo para contenido DRM"</item>
<item msgid="45075631231212732">"Utilizar siempre comprobación de HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"No"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 2d89b0091623..de275a2b4185 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Datos móviles siempre activos"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inhabilitar volumen absoluto"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opciones para la certificación de la pantalla inalámbrica"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar el nivel de logging de Wi-Fi, mostrar por SSID RSSI en el selector Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si está habilitada, la conexión Wi‑Fi será más agresiva al transferir la conexión de datos al móvil (si la señal Wi‑Fi no es estable)"</string>
diff --git a/packages/SettingsLib/res/values-et-rEE/arrays.xml b/packages/SettingsLib/res/values-et-rEE/arrays.xml
index 7bb6e34fda75..0c8c94e4d7a3 100644
--- a/packages/SettingsLib/res/values-et-rEE/arrays.xml
+++ b/packages/SettingsLib/res/values-et-rEE/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Kasuta HDCP-kontrolli ainult DRM-sisu korral"</item>
<item msgid="45075631231212732">"Kasuta alati HDCP-kontrollimist"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Väljas"</item>
<item msgid="1593289376502312923">"64 000"</item>
diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml
index f979db85a0da..1e630eec5a59 100644
--- a/packages/SettingsLib/res/values-et-rEE/strings.xml
+++ b/packages/SettingsLib/res/values-et-rEE/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Luba alati WiFi-rändluse skannimine"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobiilne andmeside on alati aktiivne"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Keela absoluutne helitugevus"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Juhtmeta ekraaniühenduse sertifitseerimisvalikute kuvamine"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Suurenda WiFi logimistaset, kuva WiFi valijas SSID RSSI järgi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kui see on lubatud, siis püüab WiFi nõrga WiFi-signaali korral agressiivsemalt anda andmeside ühenduse üle mobiilsele andmesidele"</string>
diff --git a/packages/SettingsLib/res/values-eu-rES/arrays.xml b/packages/SettingsLib/res/values-eu-rES/arrays.xml
index 82df3e810264..a38ac5b92c82 100644
--- a/packages/SettingsLib/res/values-eu-rES/arrays.xml
+++ b/packages/SettingsLib/res/values-eu-rES/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Erabili HDCP egiaztapena DRM edukirako soilik"</item>
<item msgid="45075631231212732">"Erabili beti HDCP egiaztapena"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Desaktibatuta"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-eu-rES/strings.xml b/packages/SettingsLib/res/values-eu-rES/strings.xml
index 3e08c770745e..68baa333ed96 100644
--- a/packages/SettingsLib/res/values-eu-rES/strings.xml
+++ b/packages/SettingsLib/res/values-eu-rES/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Onartu beti ibiltaritzan Wi-Fi sareak bilatzea"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mugikorreko datuak beti aktibo"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desgaitu bolumen absolutua"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Erakutsi hari gabeko bistaratze-egiaztapenaren aukerak"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Erakutsi datu gehiago Wi-Fi sareetan saioa hasterakoan. Erakutsi sarearen identifikatzailea eta seinalearen indarra Wi‑Fi sareen hautagailuan."</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Aukera hori gaituz gero, gailua errazago aldatuko da datu mugikorren konexiora Wi-Fi seinalea ahultzen dela nabaritutakoan"</string>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 8d01d6bb547d..14680f58b5fa 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"‏استفاده از بررسی HDCP فقط برای محتوای DRM"</item>
<item msgid="45075631231212732">"‏همیشه از بررسی HDCP استفاده شود"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"خاموش"</item>
<item msgid="1593289376502312923">"۶۴ هزار"</item>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 4a741f07cacc..c84c8f9fdf9f 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"‏اسکن‌های رومینگ Wi‑Fi همیشه مجاز است"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"داده سلولی همیشه فعال"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"غیرفعال کردن میزان صدای مطلق"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"نمایش گزینه‌ها برای گواهینامه نمایش بی‌سیم"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"‏افزایش سطح گزارش‌گیری Wi‑Fi، نمایش به ازای SSID RSSI در انتخاب‌کننده Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"‏وقتی فعال است، در شرایط پایین بودن سیگنال، Wi‑Fi برای واگذار کردن اتصال داده به شبکه سلولی فعال‌تر خواهد بود."</string>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index 43688488c567..4abdbbffd142 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Käytä HDCP-tarkistusta vain DRM-suojatulle sisällölle"</item>
<item msgid="45075631231212732">"Käytä aina HDCP-tarkistusta"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Ei käytössä"</item>
<item msgid="1593289376502312923">"64 kt"</item>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 648f7b3e10de..79909aba0f99 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Salli Wi-Fi-verkkovierailuskannaus aina"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobiilidata on aina käytössä"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Poista yleinen äänenvoimakkuuden säätö käytöstä"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Näytä langattoman näytön sertifiointiin liittyvät asetukset"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Lisää Wi‑Fin lokikirjaustasoa, näytä SSID RSSI -kohtaisesti Wi‑Fi-valitsimessa."</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kun asetus on käytössä, Wi-Fi siirtää datayhteyden aggressiivisemmin matkapuhelinverkolle, jos Wi-Fi-signaali on heikko."</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index 7515ecf47a5d..064f45f34775 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Utiliser la vérification HDCP uniquement pour le contenu GDN"</item>
<item msgid="45075631231212732">"Toujours utiliser la vérification HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Désactivé"</item>
<item msgid="1593289376502312923">"64 ko"</item>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index afd343ca1286..77ed33951312 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Toujours autoriser la détection de réseaux Wi-Fi en itinérance"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Données cellulaires toujours actives"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Désactiver le volume absolu"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options pour la certification d\'affichage sans fil"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler davantage les données Wi-Fi, afficher par SSID RSSI dans sélect. Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si cette option est activée, le passage du Wi-Fi aux données cellulaires est forcé lorsque le signal Wi-Fi est faible"</string>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index 59ad1fc1b6b8..8ad3754b9ac1 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Utiliser la vérification HDCP uniquement pour le contenu DRM"</item>
<item msgid="45075631231212732">"Toujours utiliser la vérification HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Désactivé"</item>
<item msgid="1593289376502312923">"64 Ko"</item>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 4d9d90cfe141..e15cc3d29e62 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Toujours autoriser la détection de réseaux Wi-Fi en itinérance"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Données mobiles toujours actives"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Désactiver le volume absolu"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options de la certification de l\'affichage sans fil"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler plus infos Wi-Fi, afficher par RSSI de SSID dans outil sélection Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si cette option est activée, le passage du Wi-Fi aux données mobiles est forcé en cas de signal Wi-Fi faible."</string>
diff --git a/packages/SettingsLib/res/values-gl-rES/arrays.xml b/packages/SettingsLib/res/values-gl-rES/arrays.xml
index 1a9f607981f9..a7c8d32a4a2b 100644
--- a/packages/SettingsLib/res/values-gl-rES/arrays.xml
+++ b/packages/SettingsLib/res/values-gl-rES/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Utiliza a comprobación HDCP só para contido DRM"</item>
<item msgid="45075631231212732">"Utilizar sempre a comprobación HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Desactivado"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml
index 1110fe23167c..bdc0a4dcab23 100644
--- a/packages/SettingsLib/res/values-gl-rES/strings.xml
+++ b/packages/SettingsLib/res/values-gl-rES/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir sempre buscas de itinerancia da wifi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Datos móbiles sempre activados"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desactivar volume absoluto"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra opcións para o certificado de visualización sen fíos"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nivel de rexistro da wifi, mostrar por SSID RSSI no selector de wifi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Cando está activada esta función, a wifi será máis agresiva ao entregar a conexión de datos ao móbil, cando o sinal wifi é feble"</string>
diff --git a/packages/SettingsLib/res/values-gu-rIN/arrays.xml b/packages/SettingsLib/res/values-gu-rIN/arrays.xml
index e0971598c893..45c47268bfcd 100644
--- a/packages/SettingsLib/res/values-gu-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-gu-rIN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"ફક્ત DRM સામગ્રી માટે HDCP તપાસનો ઉપયોગ કરો"</item>
<item msgid="45075631231212732">"હંમેશા HDCP તપાસનો ઉપયોગ કરો"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"બંધ"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-gu-rIN/strings.xml b/packages/SettingsLib/res/values-gu-rIN/strings.xml
index a732ea1dbd8a..f55fd28065a0 100644
--- a/packages/SettingsLib/res/values-gu-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-gu-rIN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"હંમેશા Wi‑Fi રોમ સ્કૅન્સને મંજૂરી આપો"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"સેલ્યુલર ડેટા હંમેશા સક્રિય"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ચોક્કસ વૉલ્યૂમને અક્ષમ કરો"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi લોગિંગ સ્તર વધારો, Wi‑Fi પીકરમાં SSID RSSI દીઠ બતાવો"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"જ્યારે સક્ષમ હોય, ત્યારે Wi‑Fi સિગ્નલ ઓછા હોવા પર, સેલ્યુલર પર ડેટા કનેક્શન મોકલવામાં વધુ આક્રમક હશે"</string>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index 9b03f5fa8752..6e9a088e7d0b 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP जांच का उपयोग केवल DRM सामग्री के लिए करें"</item>
<item msgid="45075631231212732">"हमेशा HDCP जांच का उपयोग करें"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"बंद"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index eefdff1d689e..26004795a99b 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -79,7 +79,7 @@
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> से संचार नहीं कर सकता."</string>
<string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> द्वारा युग्‍मन अस्‍वीकृत किया गया."</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"वाई-फ़ाई बंद है."</string>
- <string name="accessibility_no_wifi" msgid="8834610636137374508">"वाई-फ़ाई डिस्कनेक्ट है."</string>
+ <string name="accessibility_no_wifi" msgid="8834610636137374508">"वाई-फ़ाई डिसकनेक्ट है."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"वाई-फ़ाई का एक बार है."</string>
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"वाई-फ़ाई की दो पट्टी मिल रही हैं."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"वाई-फ़ाई की एक पट्टी मिल रही है."</string>
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"हमेशा वाई-फ़ाई रोम स्कैन करने दें"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"सेल्युलर डेटा हमेशा सक्रिय"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"पूर्ण वॉल्यूम अक्षम करें"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस दिखाई देने के लिए प्रमाणन विकल्प दिखाएं"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाई-फ़ाई प्रवेश स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"इसके सक्षम होने पर, जब वाई-फ़ाई संकेत कमज़ोर हों तो वाई-फ़ाई, डेटा कनेक्शन को सेल्यूलर पर अधिक बलपूर्वक भेजेगा"</string>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index 42d6bd557957..0b96cc61f632 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Upotrebljavaj HDCP provjeru samo za DRM sadržaj"</item>
<item msgid="45075631231212732">"Uvijek upotrebljavaj HDCP provjeru"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Isključeno"</item>
<item msgid="1593289376502312923">"64 KB"</item>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 9b38b61e3b92..a4c965df0407 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvijek dopusti slobodno traženje Wi-Fi mreže"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobilni podaci uvijek aktivni"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogući apsolutnu glasnoću"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Prikaži opcije za certifikaciju bežičnog prikaza"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećana razina prijave na Wi‑Fi, prikaz po SSID RSSI-ju u Biraču Wi‑Fi-ja"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Ako je omogućeno, Wi-Fi će aktivno prebacivati podatkovnu vezu mobilnoj mreži kada je Wi-Fi signal slab."</string>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index a5a8a9bbb576..9ef6995284a9 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Csak DRM-tartalomhoz használjon HDCP ellenőrzést"</item>
<item msgid="45075631231212732">"Mindig használjon HDCP ellenőrzést"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Ki"</item>
<item msgid="1593289376502312923">"64 KB"</item>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index a373545e63e6..323a14c33f20 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi-roaming ellenőrzésének engedélyezése mindig"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"A mobilhálózati adatforgalom mindig aktív"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Abszolút hangerő funkció letiltása"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vezeték nélküli kijelző tanúsítványával kapcsolatos lehetőségek megjelenítése"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi-naplózási szint növelése, RSSI/SSID megjelenítése a Wi‑Fi-választóban"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Ha engedélyezi, a Wi-Fi agresszívebben fogja átadni az adatkapcsolatot a mobilhálózatnak gyenge Wi-Fi-jel esetén"</string>
diff --git a/packages/SettingsLib/res/values-hy-rAM/arrays.xml b/packages/SettingsLib/res/values-hy-rAM/arrays.xml
index 1241beee3e6f..f696e916484a 100644
--- a/packages/SettingsLib/res/values-hy-rAM/arrays.xml
+++ b/packages/SettingsLib/res/values-hy-rAM/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Օգտագործել HDCP-ը` միայն DRM-ի բովանդակությունը ստուգելու համար"</item>
<item msgid="45075631231212732">"Միշտ օգտագործել HDCP ստուգումը"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Անջատված է"</item>
<item msgid="1593289376502312923">"64ԿԲ"</item>
diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml
index bcd56d5a82c9..f7b5965635b7 100644
--- a/packages/SettingsLib/res/values-hy-rAM/strings.xml
+++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Միշտ թույլատրել Wi‑Fi ռոումինգի որոնումը"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Բջջային տվյալները՝ միշտ ակտիվացրած"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Անջատել ձայնի բացարձակ ուժգնությունը"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ցույց տալ անլար էկրանի հավաստագրման ընտրանքները"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Բարձրացնել մակարդակը, Wi‑Fi ընտրիչում ամեն մի SSID-ի համար ցույց տալ RSSI"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Եթե այս գործառույթը միացված է, Wi‑Fi-ի թույլ ազդանշանի դեպքում Wi‑Fi ինտերնետից անցումը բջջային ինտերնետին ավելի կտրուկ կլինի"</string>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index 63bd8f3edf89..dc6f7b806e13 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Gunakan pemeriksaan HDCP untuk konten DRM saja"</item>
<item msgid="45075631231212732">"Selalu gunakan pemeriksaan HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Nonaktif"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 9559887b7e80..8205219479aa 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Selalu izinkan Pemindaian Roaming Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Data seluler selalu aktif"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Nonaktifkan volume absolut"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Tampilkan opsi untuk sertifikasi layar nirkabel"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tingkatkan level pencatatan log Wi-Fi, tampilkan per SSID RSSI di Pemilih Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Jika diaktifkan, Wi-Fi akan menjadi lebih agresif dalam mengalihkan sambungan data ke Seluler saat sinyal Wi-Fi lemah"</string>
diff --git a/packages/SettingsLib/res/values-is-rIS/arrays.xml b/packages/SettingsLib/res/values-is-rIS/arrays.xml
index 6c0a3cd8721c..091c4ed31dd2 100644
--- a/packages/SettingsLib/res/values-is-rIS/arrays.xml
+++ b/packages/SettingsLib/res/values-is-rIS/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Nota HDCP-athugun aðeins fyrir höfundarréttarvarið efni"</item>
<item msgid="45075631231212732">"Nota alltaf HDCP-eftirlit"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Slökkt"</item>
<item msgid="1593289376502312923">"64 k"</item>
diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml
index 8be84442b1b3..2f0d3a90b672 100644
--- a/packages/SettingsLib/res/values-is-rIS/strings.xml
+++ b/packages/SettingsLib/res/values-is-rIS/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Leyfa alltaf reikileit með Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Alltaf kveikt á farsímagögnum"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Slökkva á samstillingu hljóðstyrks"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Sýna valkosti fyrir vottun þráðlausra skjáa"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Auka skráningarstig Wi-Fi, sýna RSSI fyrir hvert SSID í Wi-Fi vali"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Þegar þetta er virkt mun Wi-Fi ganga harðar fram í að færa gagnatenginguna yfir til símkerfisins þegar Wi-Fi merkið er lélegt"</string>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 518afede33cf..5aaf98952568 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Usa la verifica HDCP solo per contenuti DRM"</item>
<item msgid="45075631231212732">"Usa sempre la verifica HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Off"</item>
<item msgid="1593289376502312923">"64 kB"</item>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 74ee5a1e828d..b06eaf502f36 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Consenti sempre scansioni roaming Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Dati cellulare sempre attivi"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disattiva volume assoluto"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra opzioni per la certificazione display wireless"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumenta il livello di registrazione Wi-Fi, mostrando il SSID RSSI nel selettore Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Quando questa impostazione è attivata, il Wi-Fi sarà più aggressivo nel passare la connessione dati al cellulare, quando il segnale Wi-Fi è basso"</string>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index b3aee1db7076..8e25a87d422f 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"‏השתמש בבדיקת HDCP עבור תוכן DRM בלבד"</item>
<item msgid="45075631231212732">"‏תמיד השתמש בבדיקת HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"כבוי"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index aa3dc13f17b9..a0c7f7c847e8 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"‏התר תמיד סריקות נדידה של Wi‑Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"נתונים סלולריים פעילים תמיד"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"השבת עוצמת קול מוחלטת"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"‏הצג אפשרויות עבור אישור של תצוגת WiFi"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"‏העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"‏כשתכונה זו מופעלת, Wi-Fi יתנהג בצורה אגרסיבית יותר בעת העברת חיבור הנתונים לרשת הסלולרית כשאות ה-Wi-Fi חלש."</string>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index 3d7d0709d8b8..df23819550cd 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"DRMコンテンツにのみHDCPチェックを使用する"</item>
<item msgid="45075631231212732">"HDCPチェックを常に使用する"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"OFF"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index f760d9347e97..1def9dc6707c 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fiローミングスキャンを常に許可する"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"モバイルデータを常にON"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"絶対音量を無効にする"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ワイヤレスディスプレイ認証のオプションを表示"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fiログレベルを上げて、Wi-Fi選択ツールでSSID RSSIごとに表示します"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"有効にすると、Wi-Fiの電波強度が弱い場合は強制的にモバイルデータ接続に切り替わるようになります"</string>
diff --git a/packages/SettingsLib/res/values-ka-rGE/arrays.xml b/packages/SettingsLib/res/values-ka-rGE/arrays.xml
index 804e1296b009..df296bab90d6 100644
--- a/packages/SettingsLib/res/values-ka-rGE/arrays.xml
+++ b/packages/SettingsLib/res/values-ka-rGE/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP შემოწმების გამოყენება მხოლოდ DRM კონტენტის შემთხვევაში"</item>
<item msgid="45075631231212732">"ყოველთვის გამოიყენე HDCP შემოწმება"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"გამორთული"</item>
<item msgid="1593289376502312923">"64 კბაიტი"</item>
diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml
index 8a3b81b85720..14447cd45b00 100644
--- a/packages/SettingsLib/res/values-ka-rGE/strings.xml
+++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi Roam სკანირების მუდამ დაშვება"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"ფიჭური მონაცემები ყოველთვის აქტიურია"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ხმის აბსოლუტური სიძლიერის გათიშვა"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"უსადენო ეკრანის სერტიფიცირების ვარიანტების ჩვენება"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi-ს აღრიცხვის დონის გაზრდა, Wi‑Fi ამომრჩეველში ყოველ SSID RSSI-ზე ჩვენება"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"თუ ჩართულია, Wi‑Fi სიგნალის შესუსტების შემთხვევაში Wi-Fi უფრო აქტიურად შეეცდება გადაიყვანოს ინტერნეტ-კავშირი მობილურ ინტერნეტზე"</string>
diff --git a/packages/SettingsLib/res/values-kk-rKZ/arrays.xml b/packages/SettingsLib/res/values-kk-rKZ/arrays.xml
index 78e2f7653854..b08a33afe7ec 100644
--- a/packages/SettingsLib/res/values-kk-rKZ/arrays.xml
+++ b/packages/SettingsLib/res/values-kk-rKZ/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP (кең жолақты сандық мазмұн қорғау) тексеруді DRM (авторлық құқықты техникалық қорғау) мазмұны үшін ғана қолданыңыз"</item>
<item msgid="45075631231212732">"Әрқашан HDCP (жоғары кең жолақты сандық мазмұн қорғаушы) тексерулерін қолданыңыз"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Өшірулі"</item>
<item msgid="1593289376502312923">"64 КБ"</item>
diff --git a/packages/SettingsLib/res/values-kk-rKZ/strings.xml b/packages/SettingsLib/res/values-kk-rKZ/strings.xml
index 920b810379d1..b2ca989d8c61 100644
--- a/packages/SettingsLib/res/values-kk-rKZ/strings.xml
+++ b/packages/SettingsLib/res/values-kk-rKZ/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi роумингін іздеулерге әрқашан рұқсат ету"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Ұялы деректер әрқашан белсенді"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Абсолютті дыбыс деңгейін өшіру"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Сымсыз дисплей растау опцияларын көрсету"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi жур. тір. дең. арт., Wi‑Fi желісін таңдағышта әр SSID RSSI бойынша көрсету"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Wi‑Fi сигналы әлсіз болғанда, деректер байланысы мәжбүрлі түрде ұялы желіге ауысады"</string>
diff --git a/packages/SettingsLib/res/values-km-rKH/arrays.xml b/packages/SettingsLib/res/values-km-rKH/arrays.xml
index 2879b09f39cc..0787bcd75988 100644
--- a/packages/SettingsLib/res/values-km-rKH/arrays.xml
+++ b/packages/SettingsLib/res/values-km-rKH/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"ប្រើ​ការ​ពិនិត្យ HDCP សម្រាប់​តែ​មាតិកា DRM ប៉ុណ្ណោះ"</item>
<item msgid="45075631231212732">"ប្រើ​ការ​ពិនិត្យ HDCP ជា​និច្ច"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"បិទ"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-km-rKH/strings.xml b/packages/SettingsLib/res/values-km-rKH/strings.xml
index d162bd16bf99..a64aeaa8da8e 100644
--- a/packages/SettingsLib/res/values-km-rKH/strings.xml
+++ b/packages/SettingsLib/res/values-km-rKH/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"តែងតែ​អនុញ្ញាត​​​ការវិភាគ​រ៉ូម​វ៉ាយហ្វាយ"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"ទិន្នន័យចល័តសកម្មជានិច្ច"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"បិទកម្រិតសំឡេងលឺខ្លាំង"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"បង្ហាញ​ជម្រើស​សម្រាប់​វិញ្ញាបនបត្រ​បង្ហាញ​ឥត​ខ្សែ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"បង្កើនកម្រិតកំណត់ហេតុវ៉ាយហ្វាយបង្ហាញក្នុង SSID RSSI ក្នុងកម្មវិធីជ្រើស​វ៉ាយហ្វាយ"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ពេល​បាន​បើក វ៉ាយហ្វាយ​នឹង​កាន់តែ​បង្ខំ​ក្នុង​ការ​បញ្ជូន​ការ​ភ្ជាប់​ទិន្នន័យ​ទៅ​បណ្ដាញ​ចល័ត នៅ​ពេល​សញ្ញា​វ៉ាយហ្វាយ​យឺត"</string>
diff --git a/packages/SettingsLib/res/values-kn-rIN/arrays.xml b/packages/SettingsLib/res/values-kn-rIN/arrays.xml
index d3e9f65623f3..102faa56338b 100644
--- a/packages/SettingsLib/res/values-kn-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-kn-rIN/arrays.xml
@@ -51,13 +51,53 @@
<string-array name="hdcp_checking_titles">
<item msgid="441827799230089869">"ಎಂದಿಗೂ ಪರಿಶೀಲಿಸದಿರು"</item>
<item msgid="6042769699089883931">"DRM ವಿಷಯಗಳಿಗಾಗಿ ಮಾತ್ರ ಪರಿಶೀಲಿಸಿ"</item>
- <item msgid="9174900380056846820">"ಯಾವಾಗಲೂ ಪರಿಶೀಲಿಸು"</item>
+ <item msgid="9174900380056846820">"ಯಾವಾಗಲೂ ಪರಿಶೀಲಿಸಿ"</item>
</string-array>
<string-array name="hdcp_checking_summaries">
<item msgid="505558545611516707">"HDCP ಪರಿಶೀಲನೆಯನ್ನು ಎಂದಿಗೂ ಬಳಸದಿರು"</item>
<item msgid="3878793616631049349">"DRM ವಿಷಯಗಳಿಗೆ ಮಾತ್ರ HDCP ಪರೀಕ್ಷಿಸುವಿಕೆಯನ್ನು ಬಳಸು"</item>
<item msgid="45075631231212732">"HDCP ಪರಿಶೀಲನೆಯನ್ನು ಯಾವಾಗಲೂ ಬಳಸು"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ಆಫ್"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-kn-rIN/strings.xml b/packages/SettingsLib/res/values-kn-rIN/strings.xml
index ca0ba0ae0871..bb6f098df8ba 100644
--- a/packages/SettingsLib/res/values-kn-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-kn-rIN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ವೈ-ಫೈ ರೋಮ್ ಸ್ಕ್ಯಾನ್‌ಗಳನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"ಸೆಲ್ಯುಲರ್ ಡೇಟಾ ಯಾವಾಗಲೂ ಸಕ್ರಿಯ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ಸಂಪೂರ್ಣ ವಾಲ್ಯೂಮ್‌ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ವೈರ್‌ಲೆಸ್‌‌‌ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸು"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ಲಾಗಿಂಗ್ ಮಟ್ಟನ್ನು ಹೆಚ್ಚಿಸಿ, Wi‑Fi ಆಯ್ಕೆಯಲ್ಲಿ ಪ್ರತಿಯೊಂದು SSID RSSI ತೋರಿಸಿ"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ಸಕ್ರಿಯಗೊಂಡರೆ, Wi‑Fi ಸಿಗ್ನಲ್ ದುರ್ಬಲವಾಗಿದ್ದರೂ ಕೂಡ, ಸೆಲ್ಯುಲರ್‌ಗೆ ಡೇಟಾ ಸಂಪರ್ಕವನ್ನು ಹಸ್ತಾಂತರಿಸುವಲ್ಲಿ Wi‑Fi ಹೆಚ್ಚು ಆಕ್ರಮಣಕಾರಿಯಾಗಿರುತ್ತದೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index 9cf5fd4c59f4..941b049319a3 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"DRM 콘텐츠에 대해서만 HDCP 확인 사용"</item>
<item msgid="45075631231212732">"항상 HDCP 확인 사용"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"사용 안함"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 2732853e2ac2..ee97fe1f618e 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi 로밍 스캔 항상 허용"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"모바일 데이터 항상 활성화"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"절대 볼륨 사용 안함"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"무선 디스플레이 인증서 옵션 표시"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi 로깅 수준을 높이고, Wi‑Fi 선택도구에서 SSID RSSI당 값을 표시합니다."</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"사용 설정하면 Wi-Fi 신호가 약할 때 데이터 연결을 Wi-Fi에서 데이터 네트워크로 더욱 적극적으로 핸드오버합니다."</string>
diff --git a/packages/SettingsLib/res/values-ky-rKG/arrays.xml b/packages/SettingsLib/res/values-ky-rKG/arrays.xml
index 1aadb9b0a52b..b84a28430370 100644
--- a/packages/SettingsLib/res/values-ky-rKG/arrays.xml
+++ b/packages/SettingsLib/res/values-ky-rKG/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP текшерүү DRM мазмунуна гана колдонулсун"</item>
<item msgid="45075631231212732">"Ар дайым HDCP текшерүү колдонулсун"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Өчүк"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml
index 3783cce69c59..6cac03f788a6 100644
--- a/packages/SettingsLib/res/values-ky-rKG/strings.xml
+++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi Роуминг Скандоо мүмкүнчүлүгүнө ар дайым уруксат берилсин"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Уюлдук дайындар ар дайым активдүү"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Үндүн абсолюттук деңгээли өчүрүлсүн"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Зымсыз дисплейди сертификатто мүмкүнчүлүктөрүн көргөзүү"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi Кармагычта Wi‑Fi протокол деңгээлин жогорулатуу жана ар бир SSID RSSI үчүн көрсөтүү."</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Иштетилгенде, Wi-Fi байланышы үзүл-кесил болуп жатканда, Wi-Fi дайындарды уюктук операторго өжөрлүк менен өткөрөт."</string>
diff --git a/packages/SettingsLib/res/values-lo-rLA/arrays.xml b/packages/SettingsLib/res/values-lo-rLA/arrays.xml
index a003655383a6..f59377de91e9 100644
--- a/packages/SettingsLib/res/values-lo-rLA/arrays.xml
+++ b/packages/SettingsLib/res/values-lo-rLA/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"ໃຊ້ການກວດສອບ HDCP ສຳລັບເນື້ອຫາ DRM ເທົ່ານັ້ນ"</item>
<item msgid="45075631231212732">"ໃຊ້ການກວດສອບ HDCP ສະເໝີ"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ປິດ"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-lo-rLA/strings.xml b/packages/SettingsLib/res/values-lo-rLA/strings.xml
index 7b16fd93540f..dfa6a616f062 100644
--- a/packages/SettingsLib/res/values-lo-rLA/strings.xml
+++ b/packages/SettingsLib/res/values-lo-rLA/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ອະ​ນຸ​ຍາດ​ການ​ສະ​ແກນ​ການ​ໂຣມ Wi‑Fi ​ສະ​ເໝີ"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"ຂໍ້​ມູນ​ມື​ຖື​ເປີດ​ຢູ່​ສະ​ເໝີ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ປິດໃຊ້ລະດັບສຽງສົມບູນ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ສະແດງໂຕເລືອກສຳລັບການສະແດງການຮັບຮອງລະບົບໄຮ້ສາຍ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ເພີ່ມ​ລະ​ດັບ​ການ​ເກັບ​ປະ​ຫວັດ Wi‑Fi, ສະ​ແດງ​ຕໍ່ SSID RSSI ​ໃນ​ Wi‑Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ເມື່ອ​ເປີດ​ນຳ​ໃຊ້​ແລ້ວ, ເຄືອ​ຂ່າຍ Wi-Fi ຈະ​ຖືກ​ປ່ຽນ​ໄປ​ໃຊ້​ເຄືອ​ຂ່າຍ​ໂທ​ລະ​ສັບ​ແທນ​ຫາກ​ສັນ​ຍານ Wi-Fi ອ່ອນ"</string>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 472365d4006b..532e2f9eff39 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Taikyti HDCP tikrinimą tik DRM turiniui"</item>
<item msgid="45075631231212732">"Visada naudoti HDCP tikrinimą"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Išjungta"</item>
<item msgid="1593289376502312923">"64 KB"</item>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 85e044f8074d..1b57628ef172 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Visada leisti „Wi-Fi“ tarptiklinio ryšio nuskaitymą"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Korinio ryšio duomenys visada aktyvūs"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Išjungti didžiausią garsą"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Rodyti belaidžio rodymo sertifikavimo parinktis"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Padidinti „Wi‑Fi“ įrašymo į žurnalą lygį, rodyti SSID RSSI „Wi-Fi“ rinkiklyje"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Jei įgalinta ši parinktis, „Wi‑Fi“ agresyviau perduos duomenų ryšį į mobiliojo ryšio tinklą, kai „Wi‑Fi“ signalas bus silpnas"</string>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index 7edb7459fe81..7bed3fe7a2b4 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Izmantot HDCP pārbaudi tikai DRM saturam"</item>
<item msgid="45075631231212732">"Vienmēr izmantot HDCP pārbaudi"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Izslēgts"</item>
<item msgid="1593289376502312923">"64 KB"</item>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 36378f28d8f7..9ff887009f04 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vienmēr atļaut Wi‑Fi meklēšanu"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Vienmēr aktīvs mobilo datu savienojums"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Atspējot absolūto skaļumu"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Rādīt bezvadu attēlošanas sertifikācijas iespējas"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Palieliniet Wi‑Fi reģistrēšanas līmeni; rādīt katram SSID RSSI Wi‑Fi atlasītājā."</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Ja opcija ir iespējota un Wi‑Fi signāls ir vājš, datu savienojuma pāreja no Wi-Fi uz mobilo tīklu tiks veikta agresīvāk."</string>
diff --git a/packages/SettingsLib/res/values-mk-rMK/arrays.xml b/packages/SettingsLib/res/values-mk-rMK/arrays.xml
index 48d4dca3620e..f26f9d8c143b 100644
--- a/packages/SettingsLib/res/values-mk-rMK/arrays.xml
+++ b/packages/SettingsLib/res/values-mk-rMK/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Користи ХДЦП проверка само за ДРМ содржина"</item>
<item msgid="45075631231212732">"Секогаш користи ХДЦП проверка"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Исклучено"</item>
<item msgid="1593289376502312923">"64.000"</item>
diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml
index ebe8d00396f6..7422828f3d35 100644
--- a/packages/SettingsLib/res/values-mk-rMK/strings.xml
+++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Секогаш дозволувај Wi‑Fi скенирање во роаминг"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Мобилниот интернет е секогаш активен"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Оневозможете апсолутна јачина на звук"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Покажи ги опциите за безжичен приказ на сертификат"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Зголеми Wi‑Fi ниво на пријавување, прикажи по SSID RSSI во Wi‑Fi бирач"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Кога е вклучено, Wi-Fi ќе биде поагресивно при предавање на поврзувањето со податоци на мобилната мрежа при слаб сигнал на Wi-Fi."</string>
diff --git a/packages/SettingsLib/res/values-ml-rIN/arrays.xml b/packages/SettingsLib/res/values-ml-rIN/arrays.xml
index f8cc58211385..b3891cc89e56 100644
--- a/packages/SettingsLib/res/values-ml-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-ml-rIN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"DRM ഉള്ളടക്കത്തിനുമാത്രമായി HDCP പരിശോധന ഉപയോഗിക്കുക"</item>
<item msgid="45075631231212732">"എല്ലായ്‌പ്പോഴും HDCP പരിശോധന ഉപയോഗിക്കുക"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ഓഫ്"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-ml-rIN/strings.xml b/packages/SettingsLib/res/values-ml-rIN/strings.xml
index 09c07ea7cda5..5cf833098543 100644
--- a/packages/SettingsLib/res/values-ml-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-ml-rIN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"എപ്പോഴും വൈഫൈ റോം സ്‌‌കാൻ അനുവദിക്കൂ"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"സെല്ലുലാർ ഡാറ്റ എല്ലായ്‌പ്പോഴും സജീവം"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"അബ്‌സൊല്യൂട്ട് വോളിയം പ്രവർത്തനരഹിതമാക്കുക"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"വയർലെസ് ഡിസ്‌പ്ലേ സർട്ടിഫിക്കേഷനായി ഓപ്‌ഷനുകൾ ദൃശ്യമാക്കുക"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"വൈഫൈ പിക്കറിൽ ഓരോ SSID RSSI പ്രകാരം കാണിക്കാൻ വൈഫൈ ലോഗിംഗ് നില വർദ്ധിപ്പിക്കുക"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"പ്രവർത്തനക്ഷമമായിരിക്കുമ്പോൾ, വൈഫൈ സിഗ്‌നൽ കുറവായിരിക്കുന്ന സമയത്ത് സെല്ലുലാറിലേക്ക് ഡാറ്റ കണക്ഷൻ മുഖേന കൈമാറുന്നതിൽ വൈഫൈ കൂടുതൽ പ്രവർത്തനക്ഷമമാകും"</string>
diff --git a/packages/SettingsLib/res/values-mn-rMN/arrays.xml b/packages/SettingsLib/res/values-mn-rMN/arrays.xml
index 60fe5024642b..224fa2c12e2e 100644
--- a/packages/SettingsLib/res/values-mn-rMN/arrays.xml
+++ b/packages/SettingsLib/res/values-mn-rMN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP шалгахыг зөвхөн DRM контентэд ашиглах"</item>
<item msgid="45075631231212732">"Байнга HDCP шалгахыг ашиглах"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Идэвхгүй"</item>
<item msgid="1593289376502312923">"64000"</item>
diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml
index 86a62a2649f0..9ffbca68bc58 100644
--- a/packages/SettingsLib/res/values-mn-rMN/strings.xml
+++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi Роум сканыг байнга зөвшөөрөх"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Үүрэн холбооны датаг үргэлж идэвхтэй байлгана"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Үнэмлэхүй дууны түвшинг идэвхгүй болгох"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Утасгүй дэлгэцийн сертификатын сонголтыг харуулах"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi лог-н түвшинг нэмэгдүүлэх, Wi‑Fi Сонгогч дээрх SSID-д ногдох RSSI-г харуулах"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Идэвхжүүлсэн үед Wi‑Fi дохио сул бол дата холболтыг Үүрэн рүү шилжүүлэхдээ илүү идэвхтэй байх болно"</string>
diff --git a/packages/SettingsLib/res/values-mr-rIN/arrays.xml b/packages/SettingsLib/res/values-mr-rIN/arrays.xml
index f950ba18ae9c..0fe9200502b2 100644
--- a/packages/SettingsLib/res/values-mr-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-mr-rIN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"केवळ DRM सामग्रीसाठी HDCP तपासणी वापरा"</item>
<item msgid="45075631231212732">"नेहमी HDCP तपासणी वापरा"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"बंद"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-mr-rIN/strings.xml b/packages/SettingsLib/res/values-mr-rIN/strings.xml
index be1fbc692023..0680c7ce1bc6 100644
--- a/packages/SettingsLib/res/values-mr-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-mr-rIN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"वाय-फाय रोम स्‍कॅनला नेहमी अनुमती द्या"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"सेल्युलर डेटा नेहमी सक्रिय"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"संपूर्ण आवाज अक्षम करा"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस प्रदर्शन प्रमाणिकरणासाठी पर्याय दर्शवा"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाय-फाय लॉगिंग स्‍तर वाढवा, वाय-फाय निवडकामध्‍ये प्रति SSID RSSI दर्शवा"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"सक्षम केल्यास, वाय-फाय सिग्‍नल निम्‍न असताना, वाय-फाय डेटा कनेक्‍शन सेल्‍युलरवर बळपूर्वक स्विच करेल."</string>
diff --git a/packages/SettingsLib/res/values-ms-rMY/arrays.xml b/packages/SettingsLib/res/values-ms-rMY/arrays.xml
index 07f219cbe115..31c8f48d67c1 100644
--- a/packages/SettingsLib/res/values-ms-rMY/arrays.xml
+++ b/packages/SettingsLib/res/values-ms-rMY/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Gunakan penyemakan HDCP untuk kandungan DRM sahaja"</item>
<item msgid="45075631231212732">"Sentiasa gunakan penyemakan HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Mati"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml
index 89355816308f..bac1c54c499c 100644
--- a/packages/SettingsLib/res/values-ms-rMY/strings.xml
+++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sentiasa benarkan Imbasan Perayauan Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Data selular sentiasa aktif"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Lumpuhkan kelantangan mutlak"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Apabila didayakan, Wi-Fi akan menjadi lebih agresif dalam menyerahkan sambungan data ke Selular, apabila isyarat Wi-Fi rendah"</string>
diff --git a/packages/SettingsLib/res/values-my-rMM/arrays.xml b/packages/SettingsLib/res/values-my-rMM/arrays.xml
index 622d0aab564f..4510cc8a9e30 100644
--- a/packages/SettingsLib/res/values-my-rMM/arrays.xml
+++ b/packages/SettingsLib/res/values-my-rMM/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"DRMအကြောင်းအရာအတွက် HDCPစစ်ဆေးခြင်းကိုသုံးမည်"</item>
<item msgid="45075631231212732">"HDCP checkingအားအမြဲသုံးပါ"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ပိတ်ပါ"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-my-rMM/strings.xml b/packages/SettingsLib/res/values-my-rMM/strings.xml
index 5f4dc501bfef..5c071f699a79 100644
--- a/packages/SettingsLib/res/values-my-rMM/strings.xml
+++ b/packages/SettingsLib/res/values-my-rMM/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi ရွမ်းရှာဖွေမှုကို အမြဲတမ်း ခွင့်ပြုမည်"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"ဆဲလ်လူလာဒေတာ အမြဲတမ်းဖွင့်ထားသည်"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ပကတိ အသံနှုန်း သတ်မှတ်ချက် ပိတ်ရန်"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ကြိုးမဲ့ အခင်းအကျင်း အသိအမှတ်ပြုလက်မှတ်အတွက် ရွေးချယ်စရာများပြရန်"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi မှတ်တမ်းတင်ခြင်း နှုန်းအားမြင့်ကာ၊ Wi‑Fi ရွေးရာတွင် SSID RSSI ဖြင့်ပြပါ"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ဖွင့်ထားလျှင်၊ Wi‑Fi မှ ဆယ်လူလာသို့ အချက်လက် ချိတ်ဆက်မှုအား လွှဲပြောင်းရာ၌ ပိုမိုထိရောက်ပါသည်၊ WIFI အားနည်းနေချိန်တွင်"</string>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index 917518ca263f..22fe819b9c06 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Bruk HDCP-kontroll kun for DRM-innhold"</item>
<item msgid="45075631231212732">"Bruk alltid HDCP-kontroll"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Av"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 76ff94fe7ba6..16fef064b83f 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillat alltid skanning for Wi-Fi-roaming"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobildata er alltid aktiv"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Slå av funksjonen for absolutt volum"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vis alternativer for sertifisering av trådløs skjerm"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Øk Wi-Fi-loggenivå – vis per SSID RSSI i Wi-Fi-velgeren"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Hvis dette slås på, overfører Wi-Fi-nettverket datatilkoblingen til mobil mer aggressivt når Wi-Fi-signalet er lavt"</string>
diff --git a/packages/SettingsLib/res/values-ne-rNP/arrays.xml b/packages/SettingsLib/res/values-ne-rNP/arrays.xml
index 015a034cc867..edacd0d65380 100644
--- a/packages/SettingsLib/res/values-ne-rNP/arrays.xml
+++ b/packages/SettingsLib/res/values-ne-rNP/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"DRM सामग्रीको लागि मात्र HDCP जाँचको प्रयोग गर्नुहोस्"</item>
<item msgid="45075631231212732">"सधैँ HDCP जाँच प्रयोग गर्नुहोस्"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"निष्क्रिय गर्नुहोस्"</item>
<item msgid="1593289376502312923">"६४के"</item>
diff --git a/packages/SettingsLib/res/values-ne-rNP/strings.xml b/packages/SettingsLib/res/values-ne-rNP/strings.xml
index 8199cdeb0ccb..c06818d84e17 100644
--- a/packages/SettingsLib/res/values-ne-rNP/strings.xml
+++ b/packages/SettingsLib/res/values-ne-rNP/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi घुम्ने स्क्यान गर्न सधैँ अनुमति दिनुहोस्"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"सेलुलर डेटा सधैं सक्रिय"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"निरपेक्ष आवाज असक्षम गर्नुहोस्"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Wi-Fi संकेत कम हुँदा, सक्षम जब गरिन्छ, Wi-Fi सेलुलर लागि डेटा जडान सुम्पनामा बढी आक्रामक हुनेछ"</string>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index 8f73bf9d2b50..2820a165d804 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP-controle alleen voor DRM-content gebruiken"</item>
<item msgid="45075631231212732">"HDCP-controle altijd gebruiken"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Uit"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 89d7fabeda1a..cb0ff8b3a061 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Altijd roamingscans voor wifi toestaan"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobiele data altijd actief"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Absoluut volume uitschakelen"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Opties weergeven voor certificering van draadloze weergave"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Indien ingeschakeld, is wifi agressiever bij het overgeven van de gegevensverbinding aan mobiel wanneer het wifi-signaal zwak is"</string>
diff --git a/packages/SettingsLib/res/values-pa-rIN/arrays.xml b/packages/SettingsLib/res/values-pa-rIN/arrays.xml
index 54565bc4d9a4..97e758cf19f4 100644
--- a/packages/SettingsLib/res/values-pa-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-pa-rIN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"ਕੇਵਲ DRM ਸਮੱਗਰੀ ਲਈ HDCP ਜਾਂਚ"</item>
<item msgid="45075631231212732">"ਹਮੇਸਾਂ HDCP ਜਾਂਚ ਵਰਤੋ"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ਬੰਦ"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-pa-rIN/strings.xml b/packages/SettingsLib/res/values-pa-rIN/strings.xml
index cb463760f98c..7910688d4c46 100644
--- a/packages/SettingsLib/res/values-pa-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-pa-rIN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ਹਮੇਸ਼ਾਂ Wi‑Fi Roam Scans ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"ਸੈਲਿਊਲਰ ਡੇਟਾ ਹਮੇਸ਼ਾ ਕਿਰਿਆਸ਼ੀਲ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ਪੂਰਨ ਵੌਲਿਊਮ ਨੂੰ ਅਯੋਗ ਬਣਾਓ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ਵਾਇਰਲੈਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਦਿਖਾਓ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, Wi‑Fi Picker ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ਜਦੋਂ ਸਮਰਥਿਤ ਹੋਵੇ, ਤਾਂ Wi‑Fi ਸੈਲਿਊਲਰ ਨੂੰ ਡੈਟਾ ਕਨੈਕਸ਼ਨ ਹੈਂਡ ਓਵਰ ਕਰਨ ਵਿੱਚ ਵੱਧ ਅਗ੍ਰੈਸਿਵ ਹੋ ਜਾਏਗਾ, ਜਦੋਂ Wi‑Fi ਸਿਗਨਲ ਘੱਟ ਹੋਵੇ"</string>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index eefca1343483..0e9c1b56aed4 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Użyj sprawdzania HDCP tylko w przypadku treści chronionych DRM"</item>
<item msgid="45075631231212732">"Zawsze używaj sprawdzania HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Wył."</item>
<item msgid="1593289376502312923">"64 KB"</item>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 738974f176cb..47ccc23f5b19 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Zawsze szukaj Wi-Fi w roamingu"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Dane komórkowe zawsze aktywne"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Wyłącz głośność bezwzględną"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaż opcje certyfikacji wyświetlacza bezprzewodowego"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Po włączeniu połączenie danych będzie bardziej agresywnie przełączać się z Wi-Fi na sieć komórkową przy słabym sygnale Wi-Fi"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index 5e49081b90cd..a7cb364cb074 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Usar a verificação HDCP somente para conteúdo DRM"</item>
<item msgid="45075631231212732">"Sempre usar a verificação HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Desativado"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index ab866c890ed9..eb435a67b680 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sempre permitir verif. de roaming de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Dados da rede celular sempre ativos"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desativar volume absoluto"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções de certificação de Display sem fio"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de registro do Wi-Fi; mostrar conforme o RSSI de SSID na Seleção de Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Quando ativada, o Wi-Fi será mais agressivo em transferir a conexão de dados para celular, quando o sinal de Wi-Fi estiver fraco"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index 06d455810ede..6fc7b2fc4a09 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Utilizar a verificação HDCP para conteúdo DRM apenas"</item>
<item msgid="45075631231212732">"Utilizar sempre a verificação HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Desativado"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 2e4bbdc8ae05..df090d5bb3fe 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir sempre a deteção de Wi-Fi em roaming"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Dados móveis sempre ativados"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desativar volume absoluto"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções da certificação de display sem fios"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de reg. de Wi-Fi, mostrar por RSSI de SSID no Selec. de Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Se estiver ativado, o Wi-Fi será mais agressivo ao transmitir a lig. de dados p/ a rede móvel quando o sinal Wi-Fi estiver fraco"</string>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index 5e49081b90cd..a7cb364cb074 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Usar a verificação HDCP somente para conteúdo DRM"</item>
<item msgid="45075631231212732">"Sempre usar a verificação HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Desativado"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index ab866c890ed9..eb435a67b680 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sempre permitir verif. de roaming de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Dados da rede celular sempre ativos"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desativar volume absoluto"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções de certificação de Display sem fio"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de registro do Wi-Fi; mostrar conforme o RSSI de SSID na Seleção de Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Quando ativada, o Wi-Fi será mais agressivo em transferir a conexão de dados para celular, quando o sinal de Wi-Fi estiver fraco"</string>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index 46773e9ff3a8..24a0c3d5f699 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Utilizează verificarea HDCP numai pentru conținut DRM"</item>
<item msgid="45075631231212732">"Utilizează întotdeauna verificarea HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Dezactivată"</item>
<item msgid="1593289376502312923">"64 KB"</item>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index da2f76f4445b..acc53ae47f27 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Se permite întotdeauna scanarea traficului Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Conexiunea de date mobile este întotdeauna activată"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Dezactivați volumul absolut"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afișați opțiunile pentru certificarea Ecran wireless"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Măriți niv. de înr. prin Wi‑Fi, afișați în fcț. de SSID RSSI în Selectorul Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Când este activată, funcția Wi-Fi va fi mai agresivă la predarea conexiunii de date către mobil când semnalul Wi-Fi este slab"</string>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index 0e4816c13753..eef0e4a0727e 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Использовать проверку HDCP только для DRM-контента"</item>
<item msgid="45075631231212732">"Всегда использовать проверку HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Выкл."</item>
<item msgid="1593289376502312923">"64 КБ"</item>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 960002746be1..5904c705166b 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Всегда включать поиск сетей Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Не отключать передачу данных"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Отключить абсолютный уровень громкости"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показывать параметры сертификации беспроводных мониторов"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"При выборе Wi‑Fi указывать в журнале RSSI для каждого SSID"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Принудительно переключаться на мобильную сеть, если сигнал Wi-Fi слабый"</string>
diff --git a/packages/SettingsLib/res/values-si-rLK/arrays.xml b/packages/SettingsLib/res/values-si-rLK/arrays.xml
index ac1a6fedee20..45b6cf3ef813 100644
--- a/packages/SettingsLib/res/values-si-rLK/arrays.xml
+++ b/packages/SettingsLib/res/values-si-rLK/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"DRM අන්තර්ගත සඳහා පමණක් HDCP පරික්ෂාව භාවිතා කරන්න"</item>
<item msgid="45075631231212732">"සැමවිටම HDCP පිරික්සුම භාවිතා කරන්න"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ක්‍රියාවිරහිතය"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-si-rLK/strings.xml b/packages/SettingsLib/res/values-si-rLK/strings.xml
index b775db6bffea..3347b122b053 100644
--- a/packages/SettingsLib/res/values-si-rLK/strings.xml
+++ b/packages/SettingsLib/res/values-si-rLK/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi රෝම් පරිලෝකන වෙතට සැමවිට අවසර දෙන්න"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"සෙලියුලර් දත්ත සැමවිට ක්‍රියාකාරීය"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"නිරපේක්ෂ හඩ පරිමාව අබල කරන්න"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"නොරැහැන් සංදර්ශක සහතිකය සඳහා විකල්ප පෙන්වන්න"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ලොග් මට්ටම වැඩි කරන්න, Wi‑Fi තෝරනයෙහි SSID RSSI අනුව පෙන්වන්න"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"සබල විට Wi‑Fi සිග්නලය අඩු විට Wi‑Fi දත්ත සම්බන්ධතාවය සෙලියුලර් වෙත භාර දීමට වඩා ආක්‍රමණික වේ"</string>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index 77fa6fdb7042..f386de15308b 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Použiť kontrolu HDCP len pre obsah DRM"</item>
<item msgid="45075631231212732">"Vždy používať kontrolu HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Vypnuté"</item>
<item msgid="1593289376502312923">"64 kB"</item>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 81308664ad6f..ea0dd49b206e 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vždy povoliť funkciu Wi-Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobilné dáta vždy aktívne"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Zakázať absolútnu hlasitosť"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Zobraziť možnosti certifikácie bezdrôtového zobrazenia"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zvýšiť úroveň denníkov Wi-Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Keď túto možnosť zapnete, Wi-Fi bude agresívnejšie odovzdávať dát. pripoj. na mob. sieť vtedy, keď bude slabý signál Wi-Fi"</string>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index 54cdd0e8de6a..aad81e8b30d4 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Preverjanje HDCP uporabi samo za vsebino DRM"</item>
<item msgid="45075631231212732">"Vedno uporabi preverjanje HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Izklopljeno"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index a3b666ca7ce7..881a3dd4fbf3 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vedno omogoči iskanje omrežij Wi-Fi za gostovanje"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Prenos podatkov v mobilnih omrežjih je vedno aktiven"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogočanje absolutnega praga glasnosti"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaži možnosti za potrdilo brezžičnega zaslona"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povečaj raven zapis. dnev. za Wi-Fi; v izbir. Wi‑Fi-ja pokaži glede na SSID RSSI"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Če je ta možnost omogočena, Wi-Fi odločneje preda podatkovno povezavo mobilnemu omrežju, ko je signal Wi-Fi šibek"</string>
diff --git a/packages/SettingsLib/res/values-sq-rAL/arrays.xml b/packages/SettingsLib/res/values-sq-rAL/arrays.xml
index 8fab1dc2bf77..39c5819cbf71 100644
--- a/packages/SettingsLib/res/values-sq-rAL/arrays.xml
+++ b/packages/SettingsLib/res/values-sq-rAL/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Përdor kontrollin e HDCP-së vetëm për përmbajtjet DRM"</item>
<item msgid="45075631231212732">"Përdor gjithmonë kontrollin e HDCP-së"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Joaktiv"</item>
<item msgid="1593289376502312923">"64 mijë"</item>
diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml
index 232ca0a9f699..c92ec2bd491e 100644
--- a/packages/SettingsLib/res/values-sq-rAL/strings.xml
+++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Lejo gjithmonë skanimet për Wi-Fi edhe kur je në lëvizje"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Të dhënat celulare gjithmonë aktive"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Çaktivizo volumin absolut"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Shfaq opsionet për certifikimin e ekranit valor"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Rrit nivelin regjistrues të Wi‑Fi duke shfaqur SSID RSSI-në te Zgjedhësi i Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kur ky funksion aktivizohet, Wi‑Fi bëhet më agresiv në kalimin e lidhjes së të dhënave te rrjeti celular, në rastet kur sinjali Wi‑Fi është i dobët"</string>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 97a01db3255e..5f13d6d1721f 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Користи HDCP проверу само за DRM садржај"</item>
<item msgid="45075631231212732">"Увек користи HDCP проверу"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Искључено"</item>
<item msgid="1593289376502312923">"64 kB"</item>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 5fd58a5c6c45..73c492320fa4 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Увек дозволи скенирање Wi‑Fi-ја у ромингу"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Подаци за мобилне уређаје су увек активни"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Онемогући главно подешавање јачине звука"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Приказ опција за сертификацију бежичног екрана"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Повећава ниво евидентирања за Wi‑Fi. Приказ по SSID RSSI-у у бирачу Wi‑Fi мреже"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Када се омогући, Wi‑Fi ће бити агресивнији при пребацивању мреже за пренос података на Мобилну, када је Wi‑Fi сигнал слаб"</string>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index 746bc15cc9e8..8985048d0f13 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Använd bara HDCP-kontroll för DRM-innehåll"</item>
<item msgid="45075631231212732">"Använd alltid HDCP-kontroll"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Av"</item>
<item msgid="1593289376502312923">"64 kB"</item>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index ee9362234465..fa7b2642129d 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillåt alltid sökning efter Wi-Fi-roaming"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobildata alltid aktiverad"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inaktivera Absolute volume"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Visa certifieringsalternativ för Wi-Fi-skärmdelning"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Öka loggningsnivån för Wi-Fi, visa per SSID RSSI i Wi‑Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"När funktionen har aktiverats kommer dataanslutningen lämnas över från Wi-Fi till mobilen på ett aggressivare sätt när Wi-Fi-signalen är svag"</string>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index f56961bbfbec..7039d9071ae0 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Tumia ukaguaji wa HDCP kwa maudhui ya DRM pekee"</item>
<item msgid="45075631231212732">"Kila wakati tumia ukakuaji wa HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Imezimwa"</item>
<item msgid="1593289376502312923">"K64"</item>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 3c06d727a87b..c4784455a5a5 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Ruhusu Uchanganuzi wa Matumizi ya Mitandao mingine"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Data ya kifaa cha mkononi inatumika kila wakati"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Zima sauti kamili"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Onyesha chaguo za cheti cha kuonyesha pasiwaya"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Ongeza hatua ya uwekaji kumbukumbu ya Wi-Fi, onyesha kwa kila SSID RSSI kwenye Kichukuzi cha Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Ikiwashwa, Wifi itakabidhi kwa hima muunganisho wa data kwa mtandao wa Simu za Mkononi, mawimbi ya Wifi yanapokuwa hafifu"</string>
diff --git a/packages/SettingsLib/res/values-ta-rIN/arrays.xml b/packages/SettingsLib/res/values-ta-rIN/arrays.xml
index e21e1c4662c0..b48f8bc2c24d 100644
--- a/packages/SettingsLib/res/values-ta-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-ta-rIN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"DRM உள்ளடக்கத்திற்கு மட்டும் HDCP சோதனையைப் பயன்படுத்து"</item>
<item msgid="45075631231212732">"HDCP சரிபார்ப்பை எப்போதும் பயன்படுத்து"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"முடக்கு"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml
index daf3ff20de21..60aa4192563d 100644
--- a/packages/SettingsLib/res/values-ta-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"எப்போதும் வைஃபை ரோமிங் ஸ்கேன்களை அனுமதி"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"செல்லுலார் தரவு எப்போதும் இயக்கத்தில்"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"அப்சல்யூட் ஒலியளவு அம்சத்தை முடக்கு"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டு"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wifi நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"இயக்கப்பட்டதும், வைஃபை சிக்னல் குறையும் போது, வைஃபை முழுமையாக ஒத்துழைக்காமல் இருப்பதால் செல்லுலாரின் தரவு இணைப்புக்கு மாறும்"</string>
diff --git a/packages/SettingsLib/res/values-te-rIN/arrays.xml b/packages/SettingsLib/res/values-te-rIN/arrays.xml
index f1d20b737704..ac69bd5917b1 100644
--- a/packages/SettingsLib/res/values-te-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-te-rIN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"DRM కంటెంట్‌కు మాత్రమే HDCP తనిఖీని ఉపయోగించండి"</item>
<item msgid="45075631231212732">"ఎప్పటికీ HDCP తనిఖీని ఉపయోగించు"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ఆఫ్"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-te-rIN/strings.xml b/packages/SettingsLib/res/values-te-rIN/strings.xml
index 31defb6bb8da..b7183e7ef4f2 100644
--- a/packages/SettingsLib/res/values-te-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-te-rIN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi సంచార స్కాన్‌లను ఎల్లప్పుడూ అనుమతించు"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"ఎల్లప్పుడూ సెల్యులార్ డేటాను సక్రియంగా ఉంచు"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"సంపూర్ణ వాల్యూమ్‌‍ను నిలిపివేయి"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"వైర్‌లెస్ ప్రదర్శన ప్రమాణపత్రం కోసం ఎంపికలను చూపు"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ప్రారంభించబడినప్పుడు, Wi‑Fi సిగ్నల్ బలహీనంగా ఉంటే డేటా కనెక్షన్‌ను సెల్యులార్‌కి మార్చేలా Wi‑Fiపై మరింత తీవ్ర ఒత్తిడి కలుగుతుంది"</string>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 7ac53d9e0e9d..2961d76b0789 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"ใช้การตรวจสอบ HDCP สำหรับเนื้อหา DRM เท่านั้น"</item>
<item msgid="45075631231212732">"ใช้การตรวจสอบ HDCP เสมอ"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"ปิด"</item>
<item msgid="1593289376502312923">"64 K"</item>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 5ec5871247d6..5f3f706d258f 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ใช้การสแกน Wi-Fi ข้ามเครือข่ายเสมอ"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"เปิดใช้ข้อมูลมือถือเสมอ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ปิดใช้การควบคุมระดับเสียงของอุปกรณ์อื่น"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"แสดงตัวเลือกสำหรับการรับรองการแสดงผล แบบไร้สาย"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"เมื่อเปิดใช้แล้ว Wi-Fi จะส่งผ่านการเชื่อมต่อข้อมูลไปยังเครือข่ายมือถือในทันทีที่พบสัญญาณ Wi-Fi อ่อน"</string>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index 756e865c9b66..fb6270ef8b48 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Gamitin lang ang pagsusuring HDCP para sa nilalamang DRM"</item>
<item msgid="45075631231212732">"Palaging gumamit ng pagsusuring HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"I-off"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 07e1c8bd6914..e6017a291357 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Palaging payagan ang Mga Pag-scan sa Roaming ng Wi‑Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Palaging aktibo ang cellular data"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"I-disable ang absolute volume"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ipakita ang mga opsyon para sa certification ng wireless display"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Pataasin ang antas ng Wi‑Fi logging, ipakita sa bawat SSID RSSI sa Wi‑Fi Picker"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kapag naka-enable, mas magiging agresibo ang Wi‑Fi sa paglipat ng koneksyon ng data sa Cellular, kapag mahina ang signal ng Wi‑Fi"</string>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index ec989a4336b0..f54c42d4a0aa 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP denetimini yalnızca DRM içeriği için kullan"</item>
<item msgid="45075631231212732">"HDCP denetimini her zaman kullan"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Kapalı"</item>
<item msgid="1593289376502312923">"64 KB"</item>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 78b4a617fb73..fa913888f533 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Kablosuz Dolaşım Taramalarına daima izin ver"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Hücresel veri her zaman etkin"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Mutlak sesi iptal et"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Kablosuz ekran sertifikası seçeneklerini göster"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Kablosuz günlük kaydı seviyesini artır. Kablosuz Seçici\'de her bir SSID RSSI için göster."</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Etkinleştirildiğinde, Kablosuz ağ sinyali zayıfken veri bağlantısının Hücresel ağa geçirilmesinde daha agresif olunur"</string>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index e546fa237534..2fa8acea8bab 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Використовувати перевірку HDCP лише для вмісту, захищеного DRM"</item>
<item msgid="45075631231212732">"Завжди використовувати перевірку HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Вимкнено"</item>
<item msgid="1593289376502312923">"64 Кб"</item>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 29557ec6942f..9d4c69b46386 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Завжди шукати мережі Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Не вимикати передавання даних"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Вимкнути абсолютну гучність"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показати параметри сертифікації бездротового екрана"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Показувати в журналі RSSI для кожного SSID під час вибору Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Примусово перемикатися на мобільну мережу, коли сигнал Wi-Fi слабкий"</string>
diff --git a/packages/SettingsLib/res/values-ur-rPK/arrays.xml b/packages/SettingsLib/res/values-ur-rPK/arrays.xml
index 245fed833309..3a692ffa4f57 100644
--- a/packages/SettingsLib/res/values-ur-rPK/arrays.xml
+++ b/packages/SettingsLib/res/values-ur-rPK/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"‏HDCP چیکنگ صرف DRM مواد کیلئے استعمال کریں"</item>
<item msgid="45075631231212732">"‏ہمیشہ HDCP چیکنگ استعمال کریں"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"آف"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml
index e1b545f5b685..785dba9a3b75 100644
--- a/packages/SettingsLib/res/values-ur-rPK/strings.xml
+++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"‏ہمیشہ Wi‑Fi روم اسکینز کی اجازت دیں"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"سیلولر ڈیٹا کو ہمیشہ فعال رکھیں"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"مطلق والیوم کو غیر فعال کریں"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"وائرلیس ڈسپلے سرٹیفیکیشن کیلئے اختیارات دکھائیں"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"‏Wi‑Fi لاگنگ لیول میں اضافہ کریں، Wi‑Fi منتخب کنندہ میں فی SSID RSSI دکھائیں"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"‏فعال ہونے پر، جب Wi‑Fi سگنل کمزور ہوگا تو Wi‑Fi سیلولر پر ڈیٹا کنکشن بھیجنے کیلئے مزید جارحانہ کاروائی کرے گا۔"</string>
diff --git a/packages/SettingsLib/res/values-uz-rUZ/arrays.xml b/packages/SettingsLib/res/values-uz-rUZ/arrays.xml
index 69b9bfb69804..0db5a9a9b2db 100644
--- a/packages/SettingsLib/res/values-uz-rUZ/arrays.xml
+++ b/packages/SettingsLib/res/values-uz-rUZ/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"HDCP tekshiruvi faqat DRM kontent uchun ishlatilsin"</item>
<item msgid="45075631231212732">"Har doim HDCP tekshiruvidan foydalanilsin"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"O‘chiq"</item>
<item msgid="1593289376502312923">"64 KB"</item>
diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml
index 05879a2d4405..d105b5fc80ee 100644
--- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml
+++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi tarmoqlarini qidirishga doim ruxsat"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Mobil internet o‘chirilmasin"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Ovoz balangligining mutlaq darajasini o‘chirib qo‘yish"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Simsiz monitorlarni sertifikatlash parametrini ko‘rsatish"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi ulanishini tanlashda har bir SSID uchun jurnalda ko‘rsatilsin"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Agar ushbu funksiya yoqilsa, Wi-Fi signali past bo‘lganda internetga ulanish majburiy ravishda mobil internetga o‘tkaziladi."</string>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index 4d79d395b81b..b1f4d80c709f 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Chỉ sử dụng kiểm tra HDCP cho nội dung DRM"</item>
<item msgid="45075631231212732">"Luôn sử dụng kiểm tra HDCP"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Tắt"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 28dbe510a91e..db3a18ff22c0 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Luôn cho phép quét chuyển vùng Wi‑Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Dữ liệu di động luôn hoạt động"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Vô hiệu hóa âm lượng tuyệt đối"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Hiển thị tùy chọn chứng nhận hiển thị không dây"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tăng mức ghi nhật ký Wi‑Fi, hiển thị mỗi SSID RSSI trong bộ chọn Wi‑Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Khi được bật, Wi‑Fi sẽ tích cực hơn trong việc chuyển vùng kết nối dữ liệu sang mạng di động khi tín hiệu Wi‑Fi yếu"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
index f449a94ff2df..10bd5a6fbdb5 100644
--- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"仅使用 HDCP 检查 DRM 内容"</item>
<item msgid="45075631231212732">"始终使用 HDCP 检查"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"关闭"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 7c8bb2063c1c..975dc4f75585 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"一律允许WLAN漫游扫描"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"始终开启移动数据网络"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"停用绝对音量功能"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"显示无线显示认证选项"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"提升WLAN日志记录级别(在WLAN选择器中显示每个SSID的RSSI)"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"开启此设置后,系统会在WLAN信号较弱时,主动将网络模式从WLAN网络切换到移动数据网络"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 949bbcefe2cb..bb6450016387 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"僅使用 HDCP 檢查 DRM 內容"</item>
<item msgid="45075631231212732">"永遠使用 HDCP 檢查"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"關閉"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 62c7715ec4f2..4dc9b1c9fdd1 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"永遠允許 Wi-Fi 漫遊掃瞄"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"經常啟用流動數據"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"停用絕對音量功能"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"顯示無線螢幕分享認證的選項"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"啟用時,Wi-Fi 連線會在訊號不穩的情況下更積極轉換成流動數據連線"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index 766bc954cb91..eafaf3fcbf66 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"僅使用 HDCP 檢查 DRM 內容"</item>
<item msgid="45075631231212732">"一律使用 HDCP 檢查"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"關閉"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 17a62e10b744..cf7b01124ddc 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"一律允許 Wi-Fi 漫遊掃描"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"行動數據連線一律保持啟用狀態"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"停用絕對音量功能"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"顯示無線螢幕分享認證的選項"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"啟用時,Wi-Fi 連線在訊號不穩的情況下會更積極轉換成行動數據連線"</string>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index a2b176c8ea5e..deb801fe335d 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -58,6 +58,46 @@
<item msgid="3878793616631049349">"Sebenzisa ukuhlola kwe-HDCP kokuqukethwe i-DRM kuphela"</item>
<item msgid="45075631231212732">"Sebenzisa njalo ukuhlola kwe-HDPC"</item>
</string-array>
+ <!-- no translation found for bluetooth_a2dp_codec_titles:0 (1852387125374225729) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:1 (7539690996561263909) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:2 (4260844283202960798) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:3 (7279983368484312990) -->
+ <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2301339338870319651) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:0 (9072025520360316957) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:1 (6898329690939802290) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:2 (1190434429082395888) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (649699003004233053) -->
+ <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (508106435710925399) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:0 (7102940318360468759) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:1 (8895532488906185219) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:2 (2909915718994807056) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:3 (3347287377354164611) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_titles:4 (1234212100239985373) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:0 (7224433008148687313) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:1 (4482862757811638365) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:2 (354495328188724404) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:3 (7329816882213695083) -->
+ <!-- no translation found for bluetooth_a2dp_codec_sample_rate_summaries:4 (6967397666254430476) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:0 (6694044160540313386) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:1 (5618929009984956469) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:2 (3412640499234627248) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_titles:3 (121583001492929387) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:0 (5091076677792306320) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:1 (4726688794884191540) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:2 (305344756485516870) -->
+ <!-- no translation found for bluetooth_a2dp_codec_bits_per_sample_summaries:3 (244568657919675099) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:0 (13423709606339855) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:1 (4106832974775067314) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_titles:2 (5571632958424639155) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:0 (8128478683963250130) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:1 (8900559293912978337) -->
+ <!-- no translation found for bluetooth_a2dp_codec_channel_mode_summaries:2 (8883739882299884241) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:0 (2944889121850394020) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:1 (138837449700903545) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_titles:2 (4777177307869441982) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:0 (172302906231378902) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:1 (9091111147684472529) -->
+ <!-- no translation found for bluetooth_a2dp_codec_ldac_playback_quality_summaries:2 (3367904477834831032) -->
<string-array name="select_logd_size_titles">
<item msgid="8665206199209698501">"Valiwe"</item>
<item msgid="1593289376502312923">"64K"</item>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 7e982eec9c74..30fab23c16ad 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -170,6 +170,26 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vumela njalo ukuskena kokuzula kwe-Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="7745605759775320362">"Idatha yeselula ihlala isebenza"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Khubaza ivolumu ngokuphelele"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type (90597356942154882) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (6470824182074383881) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate (4788245703824623062) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (4263851572248033749) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample (2099645202720164141) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (2096170505745650345) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode (884855779449390540) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (4073812880900816325) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality (4846872213548295632) -->
+ <skip />
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (3940973633342423717) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Bonisa izinketho zokunikeza isitifiketi ukubukeka okungenantambo"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"khuphula izinga lokungena le-Wi-Fi, bonisa nge-SSID RSSI engayodwana kusikhethi se-Wi-Fi"</string>
<string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Uma inikwe amandla, i-Wi-Fi izoba namandla kakhulu ekunikezeleni ukuxhumeka kwedatha kuselula, uma isiginali ye-Wi-Fi iphansi"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java
index de762791a0a9..320494c68faf 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java
@@ -41,4 +41,9 @@ public class StorageManagerVolumeProvider implements StorageVolumeProvider {
public List<VolumeInfo> getVolumes() {
return mStorageManager.getVolumes();
}
+
+ @Override
+ public VolumeInfo findEmulatedForPrivate(VolumeInfo privateVolume) {
+ return mStorageManager.findEmulatedForPrivate(privateVolume);
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java
index 95bb18d19188..646c42f05a8e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java
@@ -34,4 +34,9 @@ public interface StorageVolumeProvider {
* Returns a list of VolumeInfos for the device.
*/
List<VolumeInfo> getVolumes();
+
+ /**
+ * Returns the emulated volume for a given private volume.
+ */
+ VolumeInfo findEmulatedForPrivate(VolumeInfo privateVolume);
}
diff --git a/packages/Shell/res/values-da/strings.xml b/packages/Shell/res/values-da/strings.xml
index 154193e51602..265828ed99ae 100644
--- a/packages/Shell/res/values-da/strings.xml
+++ b/packages/Shell/res/values-da/strings.xml
@@ -23,8 +23,8 @@
<string name="bugreport_updating_wait" msgid="3322151947853929470">"Vent et øjeblik…"</string>
<string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Fejlrapporten vises på telefonen om et øjeblik"</string>
<string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Tryk for at dele din fejlrapport"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Tryk for at dele din fejlrapport uden et skærmbillede, eller vent på, at skærmbilledet fuldføres"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tryk for at dele din fejlrapport uden et skærmbillede, eller vent på, at skærmbilledet fuldføres"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Tryk for at dele din fejlrapport uden et screenshot, eller vent på, at screenshott fuldføres"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tryk for at dele din fejlrapport uden et screenshot, eller vent på, at screenshott fuldføres"</string>
<string name="bugreport_confirm" msgid="5917407234515812495">"Fejlrapporter indeholder data fra systemets forskellige logfiler, som kan være data, du mener er følsomme, f.eks. appforbrug og placeringsdata. Del kun fejlrapporter med personer og apps, du har tillid til."</string>
<string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Vis ikke igen"</string>
<string name="bugreport_storage_title" msgid="5332488144740527109">"Fejlrapporter"</string>
@@ -33,8 +33,8 @@
<string name="bugreport_unnamed" msgid="2800582406842092709">"ikke navngivet"</string>
<string name="bugreport_info_action" msgid="2158204228510576227">"Oplysninger"</string>
<string name="bugreport_screenshot_action" msgid="8677781721940614995">"Skærmbillede"</string>
- <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Der blev taget et skærmbillede."</string>
- <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Der kunne ikke tages et skærmbillede."</string>
+ <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Der blev taget et screenshot."</string>
+ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Der kunne ikke tages et screenshot."</string>
<string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Oplysninger om fejlrapporten <xliff:g id="ID">#%d</xliff:g>"</string>
<string name="bugreport_info_name" msgid="4414036021935139527">"Filnavn"</string>
<string name="bugreport_info_title" msgid="2306030793918239804">"Fejlrapportens titel"</string>
diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-hdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-hdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..c3aea469d1cf
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-sw900dp-hdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-mdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-mdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..470b3e2c21df
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-sw900dp-mdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back.png
index 94cb03237ac9..965d2f5f4063 100644
--- a/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back.png
+++ b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..e7137c68f752
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxhdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxhdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..03dec1566ff9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxhdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxxhdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxxhdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..e1ca853959ca
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxxhdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..0520c493af27
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_ime_dark.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_ime_dark.png
new file mode 100644
index 000000000000..3dc2b8804447
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_ime_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..2ba5d5b150fb
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_home_dark.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_home_dark.png
new file mode 100644
index 000000000000..62dc2d9a9eff
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_home_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_menu_dark.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_menu_dark.png
new file mode 100644
index 000000000000..e718b7ad1848
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_menu_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_recent_dark.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_recent_dark.png
new file mode 100644
index 000000000000..469800a34e12
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_recent_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-land-hdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-land-hdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..42863c634ade
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-land-hdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-land-mdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-land-mdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..d9ec9d5d71b7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-land-mdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked.png
new file mode 100644
index 000000000000..ea7ac9361471
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..8ee4e43ab78f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-land-xxhdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-land-xxhdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..dfa8a974f50f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-land-xxhdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-land-xxxhdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-land-xxxhdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..d23abc7f4971
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-land-xxxhdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..8e56e9cf7fa4
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_ime_dark.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_ime_dark.png
new file mode 100644
index 000000000000..28a1465efa18
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_ime_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..0fc9677c0301
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_home_dark.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_home_dark.png
new file mode 100644
index 000000000000..7b81eeea67f8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_home_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_menu_dark.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_menu_dark.png
new file mode 100644
index 000000000000..a6483452601e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_menu_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_recent_dark.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_recent_dark.png
new file mode 100644
index 000000000000..7f7452107d94
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_recent_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back.png
index fbdc93c17ee3..3b831a3cd619 100644
--- a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back.png
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..8c9945518464
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_ime.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_ime.png
index 419518c099f3..3c377827f516 100644
--- a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_ime.png
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_ime.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked.png
new file mode 100644
index 000000000000..b2baa099aca6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..b78dc9cb395f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home.png
index a2406b1408c1..37590a5381b6 100644
--- a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home_dark.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home_dark.png
new file mode 100644
index 000000000000..3a208aa0ea46
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_menu_dark.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_menu_dark.png
new file mode 100644
index 000000000000..625ba45235b3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_menu_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent.png
index c449449541f4..7ad2a29cce6a 100644
--- a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent.png
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent_dark.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent_dark.png
new file mode 100644
index 000000000000..604397e9728e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..274e5df76fb4
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..ac1689524020
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_home_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_home_dark.png
new file mode 100644
index 000000000000..e69a03790bbc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_home_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_ime_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_ime_dark.png
new file mode 100644
index 000000000000..65a43544732b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_ime_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_menu_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_menu_dark.png
new file mode 100644
index 000000000000..8bddcd9e754e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_menu_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_recent_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_recent_dark.png
new file mode 100644
index 000000000000..38c5959566f3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_recent_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_dark.png
new file mode 100644
index 000000000000..c6d7c98a5e1e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_ime_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_ime_dark.png
new file mode 100644
index 000000000000..06c52aa43d71
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_ime_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_docked_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_docked_dark.png
new file mode 100644
index 000000000000..766099774e52
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_docked_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_home_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_home_dark.png
new file mode 100644
index 000000000000..0d9ecc2a73e2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_home_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_menu_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_menu_dark.png
new file mode 100644
index 000000000000..d6bb8b151f0d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_menu_dark.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_recent_dark.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_recent_dark.png
new file mode 100644
index 000000000000..298ef3ac7193
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_recent_dark.png
Binary files differ
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
index 03cd9595d354..b91800a6b7a2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -196,6 +196,9 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene
profileVpn, deviceOwnerOrganization, hasProfileOwner, isBranded);
if (deviceOwnerPackage == null) {
mDialog.setMessage(msg);
+ if (mSecurityController.isVpnEnabled() && !mSecurityController.isVpnRestricted()) {
+ mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getSettingsButton(), this);
+ }
} else {
View dialogView = LayoutInflater.from(mContext)
.inflate(R.layout.quick_settings_footer_dialog, null, false);
@@ -213,10 +216,12 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene
final SpannableStringBuilder message = new SpannableStringBuilder();
message.append(mContext.getString(R.string.monitoring_description_do_body_vpn,
primaryVpn));
- message.append(mContext.getString(
- R.string.monitoring_description_vpn_settings_separator));
- message.append(mContext.getString(R.string.monitoring_description_vpn_settings),
- new VpnSpan(), 0);
+ if (!mSecurityController.isVpnRestricted()) {
+ message.append(mContext.getString(
+ R.string.monitoring_description_vpn_settings_separator));
+ message.append(mContext.getString(R.string.monitoring_description_vpn_settings),
+ new VpnSpan(), 0);
+ }
TextView vpnWarning = (TextView) dialogView.findViewById(R.id.vpn_warning);
vpnWarning.setText(message);
diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
index e8039c35bb4f..3059a0537b75 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
@@ -30,6 +30,9 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.provider.Settings;
+import android.service.vr.IVrManager;
+import android.service.vr.IVrStateCallbacks;
+import android.util.Log;
import android.widget.ImageView;
import com.android.internal.logging.MetricsLogger;
@@ -52,9 +55,12 @@ public class BrightnessController implements ToggleSlider.Listener {
private static final int MSG_SET_CHECKED = 2;
private static final int MSG_ATTACH_LISTENER = 3;
private static final int MSG_DETACH_LISTENER = 4;
+ private static final int MSG_VR_MODE_CHANGED = 5;
private final int mMinimumBacklight;
private final int mMaximumBacklight;
+ private final int mMinimumBacklightForVr;
+ private final int mMaximumBacklightForVr;
private final Context mContext;
private final ImageView mIcon;
@@ -62,6 +68,7 @@ public class BrightnessController implements ToggleSlider.Listener {
private final boolean mAutomaticAvailable;
private final IPowerManager mPower;
private final CurrentUserTracker mUserTracker;
+ private final IVrManager mVrManager;
private Handler mBackgroundHandler;
private final BrightnessObserver mBrightnessObserver;
@@ -69,7 +76,8 @@ public class BrightnessController implements ToggleSlider.Listener {
private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
new ArrayList<BrightnessStateChangeCallback>();
- private volatile boolean mAutomatic;
+ private volatile boolean mAutomatic; // Brightness adjusted automatically using ambient light.
+ private volatile boolean mIsVrModeEnabled;
private boolean mListening;
private boolean mExternalChange;
@@ -84,6 +92,8 @@ public class BrightnessController implements ToggleSlider.Listener {
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
private final Uri BRIGHTNESS_URI =
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
+ private final Uri BRIGHTNESS_FOR_VR_URI =
+ Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_VR);
private final Uri BRIGHTNESS_ADJ_URI =
Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ);
@@ -105,6 +115,8 @@ public class BrightnessController implements ToggleSlider.Listener {
mBackgroundHandler.post(mUpdateSliderRunnable);
} else if (BRIGHTNESS_URI.equals(uri) && !mAutomatic) {
mBackgroundHandler.post(mUpdateSliderRunnable);
+ } else if (BRIGHTNESS_FOR_VR_URI.equals(uri)) {
+ mBackgroundHandler.post(mUpdateSliderRunnable);
} else if (BRIGHTNESS_ADJ_URI.equals(uri) && mAutomatic) {
mBackgroundHandler.post(mUpdateSliderRunnable);
} else {
@@ -126,6 +138,9 @@ public class BrightnessController implements ToggleSlider.Listener {
BRIGHTNESS_URI,
false, this, UserHandle.USER_ALL);
cr.registerContentObserver(
+ BRIGHTNESS_FOR_VR_URI,
+ false, this, UserHandle.USER_ALL);
+ cr.registerContentObserver(
BRIGHTNESS_ADJ_URI,
false, this, UserHandle.USER_ALL);
}
@@ -191,7 +206,14 @@ public class BrightnessController implements ToggleSlider.Listener {
private final Runnable mUpdateSliderRunnable = new Runnable() {
@Override
public void run() {
- if (mAutomatic) {
+ if (mIsVrModeEnabled) {
+ int value = Settings.System.getIntForUser(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_FOR_VR, mMaximumBacklight,
+ UserHandle.USER_CURRENT);
+ mHandler.obtainMessage(MSG_UPDATE_SLIDER,
+ mMaximumBacklightForVr - mMinimumBacklightForVr,
+ value - mMinimumBacklightForVr).sendToTarget();
+ } else if (mAutomatic) {
float value = Settings.System.getFloatForUser(mContext.getContentResolver(),
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0,
UserHandle.USER_CURRENT);
@@ -208,6 +230,14 @@ public class BrightnessController implements ToggleSlider.Listener {
}
};
+ private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
+ @Override
+ public void onVrStateChanged(boolean enabled) {
+ mHandler.obtainMessage(MSG_VR_MODE_CHANGED, enabled ? 1 : 0, 0)
+ .sendToTarget();
+ }
+ };
+
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -230,6 +260,9 @@ public class BrightnessController implements ToggleSlider.Listener {
case MSG_DETACH_LISTENER:
mControl.setOnChangedListener(null);
break;
+ case MSG_VR_MODE_CHANGED:
+ updateVrMode(msg.arg1 != 0);
+ break;
default:
super.handleMessage(msg);
}
@@ -256,10 +289,13 @@ public class BrightnessController implements ToggleSlider.Listener {
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
+ mMinimumBacklightForVr = pm.getMinimumScreenBrightnessForVrSetting();
+ mMaximumBacklightForVr = pm.getMaximumScreenBrightnessForVrSetting();
mAutomaticAvailable = context.getResources().getBoolean(
com.android.internal.R.bool.config_automatic_brightness_available);
mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
+ mVrManager = IVrManager.Stub.asInterface(ServiceManager.getService("vrmanager"));
}
public void setBackgroundLooper(Looper backgroundLooper) {
@@ -284,6 +320,15 @@ public class BrightnessController implements ToggleSlider.Listener {
return;
}
+ if (mVrManager != null) {
+ try {
+ mVrManager.registerListener(mVrStateCallbacks);
+ mIsVrModeEnabled = mVrManager.getVrModeState();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to register VR mode state listener: ", e);
+ }
+ }
+
mBackgroundHandler.post(mStartListeningRunnable);
mListening = true;
}
@@ -294,6 +339,14 @@ public class BrightnessController implements ToggleSlider.Listener {
return;
}
+ if (mVrManager != null) {
+ try {
+ mVrManager.unregisterListener(mVrStateCallbacks);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to unregister VR mode state listener: ", e);
+ }
+ }
+
mBackgroundHandler.post(mStopListeningRunnable);
mListening = false;
}
@@ -304,7 +357,22 @@ public class BrightnessController implements ToggleSlider.Listener {
updateIcon(mAutomatic);
if (mExternalChange) return;
- if (!mAutomatic) {
+ if (mIsVrModeEnabled) {
+ final int val = value + mMinimumBacklightForVr;
+ if (stopTracking) {
+ MetricsLogger.action(mContext, MetricsEvent.ACTION_BRIGHTNESS_FOR_VR, val);
+ }
+ setBrightness(val);
+ if (!tracking) {
+ AsyncTask.execute(new Runnable() {
+ public void run() {
+ Settings.System.putIntForUser(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_FOR_VR, val,
+ UserHandle.USER_CURRENT);
+ }
+ });
+ }
+ } else if (!mAutomatic) {
final int val = value + mMinimumBacklight;
if (stopTracking) {
MetricsLogger.action(mContext, MetricsEvent.ACTION_BRIGHTNESS, val);
@@ -368,4 +436,11 @@ public class BrightnessController implements ToggleSlider.Listener {
com.android.systemui.R.drawable.ic_qs_brightness_auto_off);
}
}
+
+ private void updateVrMode(boolean isEnabled) {
+ if (mIsVrModeEnabled != isEnabled) {
+ mIsVrModeEnabled = isEnabled;
+ mBackgroundHandler.post(mUpdateSliderRunnable);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
index f43fc4065766..bd5fb923cb84 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
@@ -381,7 +381,12 @@ public final class KeyboardShortcuts {
if (appShortcuts != null) {
result.add(appShortcuts);
}
- showKeyboardShortcutsDialog(result);
+ synchronized (sLock) {
+ // showKeyboardShortcutsDialog only if it has not been dismissed already
+ if (sInstance != null) {
+ showKeyboardShortcutsDialog(result);
+ }
+ }
}
}, deviceId);
}
diff --git a/proto/src/ipconnectivity.proto b/proto/src/ipconnectivity.proto
index cf372bc90c74..b5afc402b7ab 100644
--- a/proto/src/ipconnectivity.proto
+++ b/proto/src/ipconnectivity.proto
@@ -17,14 +17,26 @@ message NetworkId {
optional int32 network_id = 1;
};
-// Transport describes a physical technology used by a network. It is a subset
-// of the TRANSPORT_* constants defined in android.net.NetworkCapabilities.
-enum Transport {
+// LinkLayer describes a physical link layer technology used by a network.
+// It is not intended to map one to one to the TRANSPORT_* constants defined in
+// android.net.NetworkCapabilities. Instead it is intended to be used as
+// a dimension field for metrics events and aggregated metrics.
+// Next tag: 7
+enum LinkLayer {
+ // An unknown link layer technology.
UNKNOWN = 0;
+
BLUETOOTH = 1;
CELLULAR = 2;
ETHERNET = 3;
WIFI = 4;
+
+ // Indicates that the link layer dimension is not relevant for the metrics or
+ // event considered.
+ NONE = 5;
+
+ // Indicates that the metrics or event considered may involve several links.
+ MULTIPLE = 6;
};
// A pair of (key, value) integers for describing histogram-like statistics.
@@ -65,7 +77,7 @@ message DefaultNetworkEvent {
// This message is associated to android.net.metrics.IpReachabilityEvent.
message IpReachabilityEvent {
// The interface name (wlan, rmnet, lo, ...) on which the probe was sent.
- // Deprecated since version 2, replaced by transport field.
+ // Deprecated since version 2, to be replaced by link_layer field.
optional string if_name = 1 [deprecated = true];
// The event type code of the probe, represented by constants defined in
@@ -179,7 +191,7 @@ message ConnectStatistics {
// android.net.metrics.DhcpErrorEvent.
message DHCPEvent {
// The interface name (wlan, rmnet, lo, ...) on which the event happened.
- // Deprecated since version 2, replaced by transport field.
+ // Deprecated since version 2, to be replaced by link_layer field.
optional string if_name = 1 [deprecated = true];
oneof value {
@@ -284,7 +296,7 @@ message RaEvent {
// This message is associated to android.net.metrics.IpManagerEvent.
message IpProvisioningEvent {
// The interface name (wlan, rmnet, lo, ...) on which the probe was sent.
- // Deprecated since version 2, replaced by transport field.
+ // Deprecated since version 2, to be replaced by link_layer field.
optional string if_name = 1 [deprecated = true];
// The code of the IP provisioning event, represented by constants defined in
@@ -296,19 +308,21 @@ message IpProvisioningEvent {
}
// Represents one of the IP connectivity event defined in this file.
-// Next tag: 15
+// Next tag: 16
message IpConnectivityEvent {
// Time in ms when the event was recorded.
optional int64 time_ms = 1;
- // Physical transport of the network on which the event happened.
+ // Physical link layer of the network on which the event happened.
+ // Acts as a dimension key.
// Since version 2.
- optional Transport transport = 12;
+ optional LinkLayer link_layer = 15;
// Event type.
oneof event {
// An event about the system default network.
+ // The link_layer field is not relevant for this event and set to NONE.
DefaultNetworkEvent default_network_event = 2;
// An IP reachability probe event.
@@ -318,7 +332,8 @@ message IpConnectivityEvent {
NetworkEvent network_event = 4;
// A batch of DNS lookups.
- // Deprecated in the nyc-mr2 release since version 2, and replaced by dns_latencies.
+ // Deprecated in the nyc-mr2 release since version 2,and replaced by
+ // dns_latencies.
DNSLookupBatch dns_lookup_batch = 5 [deprecated = true];
// DNS lookup latency statistics.
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 2048cc8e5b02..bf3620e3b2af 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -3105,6 +3105,12 @@ message MetricsEvent {
// PACKAGE: The package name of the app the permission was revoked for
ACTION_PERMISSION_REVOKE_READ_PHONE_NUMBER = 739;
+ // ACTION: QS Brightness Slider (with auto brightness disabled, and VR enabled)
+ // SUBTYPE: slider value
+ // CATEGORY: QUICK_SETTINGS
+ // OS: 6.0
+ ACTION_BRIGHTNESS_FOR_VR = 498;
+
// ACTION: A captive portal was detected during network validation
// CATEGORY: NOTIFICATION
// OS: N-MR2
@@ -3171,6 +3177,9 @@ message MetricsEvent {
RESERVED_FOR_LOGBUILDER_CATEGORY = 758;
RESERVED_FOR_LOGBUILDER_TYPE = 759;
+ // ACTION: "Do not show again" was enabled in the support disclaimer and the
+ // user accepted
+ ACTION_SKIP_DISCLAIMER_SELECTED = 760;
// ---- End O Constants, all O constants go above this line ----
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java b/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java
index 6a1613113c10..87eaf29fb306 100644
--- a/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java
@@ -18,28 +18,23 @@ package com.android.server.autofill;
import static android.Manifest.permission.MANAGE_AUTO_FILL;
import static android.content.Context.AUTO_FILL_MANAGER_SERVICE;
-import static android.view.View.ASSIST_FLAG_SANITIZED_TEXT;
-import static android.view.View.ASSIST_FLAG_NON_SANITIZED_TEXT;
+import static android.view.View.AUTO_FILL_FLAG_TYPE_FILL;
+import static android.view.View.AUTO_FILL_FLAG_TYPE_SAVE;
+
+import static com.android.server.autofill.AutoFillUI.MSG_SHOW_ALL_NOTIFICATIONS;
+import static com.android.server.autofill.AutoFillUI.SHOW_ALL_NOTIFICATIONS_DELAY_MS;
import android.Manifest;
import android.app.AppGlobals;
-import android.app.Notification;
-import android.app.Notification.Action;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
-import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Binder;
+import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -48,7 +43,6 @@ import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.os.UserManager;
import android.provider.Settings;
import android.service.autofill.IAutoFillManagerService;
import android.text.TextUtils;
@@ -65,7 +59,6 @@ import com.android.server.SystemService;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.List;
/**
* Entry point service for auto-fill management.
@@ -86,6 +79,7 @@ public final class AutoFillManagerService extends SystemService {
protected static final int MSG_UNBIND = 1;
private final AutoFillManagerServiceStub mServiceStub;
+ private final AutoFillUI mUi;
private final Context mContext;
private final ContentResolver mResolver;
@@ -99,7 +93,7 @@ public final class AutoFillManagerService extends SystemService {
removeStaleServiceForUser(msg.arg1);
return;
case MSG_SHOW_ALL_NOTIFICATIONS:
- showAllNotifications();
+ mUi.showAllNotifications();
return;
default:
Slog.w(TAG, "Invalid message: " + msg);
@@ -129,6 +123,7 @@ public final class AutoFillManagerService extends SystemService {
super(context);
mContext = context;
+ mUi = new AutoFillUI(context, this, mLock);
mResolver = context.getContentResolver();
mServiceStub = new AutoFillManagerServiceStub();
}
@@ -176,8 +171,9 @@ public final class AutoFillManagerService extends SystemService {
Slog.w(TAG, "no service info for " + serviceComponent);
return null;
}
- return new AutoFillManagerServiceImpl(this, mContext, mLock, FgThread.getHandler(), userId,
- serviceInfo.applicationInfo.uid, serviceComponent, SERVICE_BINDING_LIFETIME_MS);
+ return new AutoFillManagerServiceImpl(this, mUi, mContext, mLock, FgThread.getHandler(),
+ userId, serviceInfo.applicationInfo.uid, serviceComponent,
+ SERVICE_BINDING_LIFETIME_MS);
}
/**
@@ -186,7 +182,8 @@ public final class AutoFillManagerService extends SystemService {
* <p>First it tries to return the existing instance from the cache; if it's not cached, it
* creates a new instance and caches it.
*/
- private AutoFillManagerServiceImpl getServiceForUserLocked(int userId) {
+ // TODO(b/33197203): make private once AutoFillUi does not uses notifications
+ AutoFillManagerServiceImpl getServiceForUserLocked(int userId) {
AutoFillManagerServiceImpl service = mServicesCache.get(userId);
if (service != null) {
if (DEBUG) Log.d(TAG, "reusing cached service for userId " + userId);
@@ -251,14 +248,14 @@ public final class AutoFillManagerService extends SystemService {
final class AutoFillManagerServiceStub extends IAutoFillManagerService.Stub {
@Override
- public void requestAutoFill(IBinder activityToken, int userId, int flags) {
+ public void requestAutoFill(IBinder activityToken, int userId, Bundle extras, int flags) {
if (DEBUG) Slog.d(TAG, "requestAutoFill: flags=" + flags + ", userId=" + userId);
mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
synchronized (mLock) {
final AutoFillManagerServiceImpl service = getServiceForUserLocked(userId);
if (service != null) {
- service.requestAutoFill(activityToken, flags);
+ service.requestAutoFill(activityToken, extras, flags);
}
}
}
@@ -310,147 +307,8 @@ public final class AutoFillManagerService extends SystemService {
if (DEBUG) Slog.d(TAG, "settings (" + uri + " changed for " + userId);
synchronized (mLock) {
removeCachedServiceForUserLocked(userId);
- final ComponentName serviceComponent = getProviderForUser(userId);
- if (serviceComponent == null) {
- cancelNotificationLocked(userId);
- } else {
- showNotification(serviceComponent, userId);
- }
- }
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // TODO: temporary code using a notification to request auto-fill. //
- // Will be removed once UX decide the right way to present it to the user //
- ////////////////////////////////////////////////////////////////////////////
-
- // TODO: remove from frameworks/base/core/res/AndroidManifest.xml once it's not used anymore
- private static final String NOTIFICATION_AUTO_FILL_INTENT =
- "com.android.internal.autofill.action.REQUEST_AUTOFILL";
- private static final String EXTRA_USER_ID = "user_id";
- private static final String EXTRA_FLAGS = "flags";
-
- private static final int MSG_SHOW_ALL_NOTIFICATIONS = 42;
- private static final int SHOW_ALL_NOTIFICATIONS_DELAY_MS = 5000;
-
- private BroadcastReceiver mNotificationReceiver;
-
- final class NotificationReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- final int userId = intent.getIntExtra(EXTRA_USER_ID, -1);
- final int flags = intent.getIntExtra(EXTRA_FLAGS, 0);
- if (DEBUG) Slog.d(TAG, "Requesting autofill by notification for user " + userId);
- synchronized (mLock) {
- final AutoFillManagerServiceImpl service = getServiceForUserLocked(userId);
- if (service == null) {
- Slog.w(TAG, "no auto-fill service for user " + userId);
- } else {
- service.requestAutoFill(null, flags);
- }
- }
- }
- }
-
- private ComponentName getProviderForUser(int userId) {
- ComponentName serviceComponent = null;
- ServiceInfo serviceInfo = null;
- final String componentName = Settings.Secure.getStringForUser(
- mResolver, Settings.Secure.AUTO_FILL_SERVICE, userId);
- if (!TextUtils.isEmpty(componentName)) {
- try {
- serviceComponent = ComponentName.unflattenFromString(componentName);
- serviceInfo =
- AppGlobals.getPackageManager().getServiceInfo(serviceComponent, 0, userId);
- } catch (RuntimeException | RemoteException e) {
- Slog.wtf(TAG, "Bad auto-fill service name " + componentName, e);
- return null;
+ mUi.updateNotification(userId);
}
}
-
- if (DEBUG) Slog.d(TAG, "getServiceComponentForUser(" + userId + "): component="
- + serviceComponent + ", info: " + serviceInfo);
- if (serviceInfo == null) {
- Slog.w(TAG, "no service info for " + serviceComponent);
- return null;
- }
- return serviceComponent;
}
-
- private void showAllNotifications() {
- final UserManager userManager =
- (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-
- final List<UserInfo> allUsers = userManager.getUsers(true);
-
- for (UserInfo user : allUsers) {
- final ComponentName serviceComponent = getProviderForUser(user.id);
- if (serviceComponent != null) {
- showNotification(serviceComponent, user.id);
- }
- }
- }
-
- private void showNotification(ComponentName serviceComponent, int userId) {
- if (DEBUG) Log.d(TAG, "showNotification() for " + userId + ": " + serviceComponent);
-
- synchronized (mLock) {
- if (mNotificationReceiver == null) {
- mNotificationReceiver = new NotificationReceiver();
- mContext.registerReceiver(mNotificationReceiver,
- new IntentFilter(NOTIFICATION_AUTO_FILL_INTENT));
- }
- }
-
- final Intent fillIntent = new Intent(NOTIFICATION_AUTO_FILL_INTENT);
- fillIntent.putExtra(EXTRA_USER_ID, userId);
- fillIntent.putExtra(EXTRA_FLAGS, ASSIST_FLAG_SANITIZED_TEXT);
- final PendingIntent fillPendingIntent = PendingIntent.getBroadcast(mContext,
- ASSIST_FLAG_SANITIZED_TEXT, fillIntent, PendingIntent.FLAG_UPDATE_CURRENT);
- final Action fillAction = new Action.Builder(null, "FILL", fillPendingIntent).build();
-
- final Intent saveIntent = new Intent(NOTIFICATION_AUTO_FILL_INTENT);
- saveIntent.putExtra(EXTRA_USER_ID, userId);
- saveIntent.putExtra(EXTRA_FLAGS, ASSIST_FLAG_NON_SANITIZED_TEXT);
- final PendingIntent savePendingIntent = PendingIntent.getBroadcast(mContext,
- ASSIST_FLAG_NON_SANITIZED_TEXT, saveIntent, PendingIntent.FLAG_UPDATE_CURRENT);
- final Action saveAction = new Action.Builder(null, "SAVE", savePendingIntent).build();
-
- final String packageName = serviceComponent.getPackageName();
- String providerName = null;
- final PackageManager pm = mContext.getPackageManager();
- try {
- final ApplicationInfo info = pm.getApplicationInfoAsUser(packageName, 0, userId);
- if (info != null) {
- providerName = pm.getApplicationLabel(info).toString();
- }
- } catch (Exception e) {
- providerName = packageName;
- }
- final String title = "AutoFill actions";
- final String subTitle = "Provider: " + providerName + "\n" + "User: " + userId;
-
- final Notification notification = new Notification.Builder(mContext)
- .setCategory(Notification.CATEGORY_SYSTEM)
- .setOngoing(true)
- .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
- .setLocalOnly(true)
- .setColor(mContext.getColor(
- com.android.internal.R.color.system_notification_accent_color))
- .setContentTitle(title)
- .setStyle(new Notification.BigTextStyle().bigText(subTitle))
- .setActions(fillAction, saveAction)
- .build();
- NotificationManager.from(mContext).notify(userId, notification);
- }
-
- private void cancelNotificationLocked(int userId) {
- if (DEBUG) Log.d(TAG, "cancelNotificationLocked(): " + userId);
- NotificationManager.from(mContext).cancel(userId);
- }
-
- /////////////////////////////////////////
- // End of temporary notification code. //
- /////////////////////////////////////////
}
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java
index 82356c8458b3..3de8a8bac511 100644
--- a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java
@@ -18,9 +18,12 @@ package com.android.server.autofill;
import static com.android.server.autofill.AutoFillManagerService.DEBUG;
+import android.annotation.Nullable;
+import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.IActivityManager;
+import android.app.assist.AssistStructure;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -29,6 +32,7 @@ import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.icu.text.DateFormat;
+import android.os.Bundle;
import android.os.DeadObjectException;
import android.os.Handler;
import android.os.IBinder;
@@ -37,16 +41,24 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.service.autofill.AutoFillService;
import android.service.autofill.AutoFillServiceInfo;
+import android.service.autofill.IAutoFillAppCallback;
+import android.service.autofill.IAutoFillServerCallback;
import android.service.autofill.IAutoFillService;
-import android.util.Log;
+import android.service.voice.VoiceInteractionSession;
import android.util.PrintWriterPrinter;
import android.util.Slog;
+import android.util.SparseArray;
import android.util.TimeUtils;
+import android.view.autofill.AutoFillId;
+import android.view.autofill.Dataset;
+import android.view.autofill.FillResponse;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.IResultReceiver;
import com.android.server.LocalServices;
import java.io.PrintWriter;
+import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
@@ -60,6 +72,9 @@ final class AutoFillManagerServiceImpl {
private static final String TAG = "AutoFillManagerServiceImpl";
+ /** Used do assign ids to new ServerCallback instances. */
+ private static int sServerCallbackCounter = 0;
+
private final int mUserId;
private final int mUid;
private final ComponentName mComponent;
@@ -68,6 +83,7 @@ final class AutoFillManagerServiceImpl {
private final Object mLock;
private final AutoFillServiceInfo mInfo;
private final AutoFillManagerService mManagerService;
+ private final AutoFillUI mUi;
// TODO(b/33197203): improve its usage
// - set maximum number of entries
@@ -89,10 +105,19 @@ final class AutoFillManagerServiceImpl {
}
};
+ /**
+ * Cache of pending ServerCallbacks, keyed by {@link ServerCallback#id}.
+ *
+ * <p>They're kept until the AutoFillService handles a request, or an error occurs.
+ */
+ // TODO(b/33197203): need to make sure service is bound while callback is pending
+ @GuardedBy("mLock")
+ private static final SparseArray<ServerCallback> mServerCallbacks = new SparseArray<>();
+
private final ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
- if (DEBUG) Log.d(TAG, "onServiceConnected():" + name);
+ if (DEBUG) Slog.d(TAG, "onServiceConnected():" + name);
synchronized (mLock) {
mService = IAutoFillService.Stub.asInterface(service);
try {
@@ -102,17 +127,18 @@ final class AutoFillManagerServiceImpl {
return;
}
if (!mQueuedRequests.isEmpty()) {
- if (DEBUG) Log.d(TAG, "queued requests:" + mQueuedRequests.size());
+ if (DEBUG) Slog.d(TAG, "queued requests:" + mQueuedRequests.size());
}
for (final QueuedRequest request: mQueuedRequests) {
- requestAutoFillLocked(request.activityToken, request.flags, false);
+ requestAutoFillLocked(request.activityToken, request.extras, request.flags,
+ false);
}
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
- if (DEBUG) Log.d(TAG, name + " disconnected");
+ if (DEBUG) Slog.d(TAG, name + " disconnected");
synchronized (mLock) {
mService = null;
mManagerService.removeCachedServiceForUserLocked(mUserId);
@@ -120,6 +146,39 @@ final class AutoFillManagerServiceImpl {
}
};
+
+ /**
+ * Receiver of assist data from the app's {@link Activity}, uses the {@code resultData} as
+ * the {@link ServerCallback#id}.
+ */
+ private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() {
+ @Override
+ public void send(int resultCode, Bundle resultData) throws RemoteException {
+ if (DEBUG) Slog.d(TAG, "resultCode on mAssistReceiver: " + resultCode);
+
+ final IBinder appBinder = resultData.getBinder(AutoFillService.KEY_CALLBACK);
+ if (appBinder == null) {
+ Slog.w(TAG, "no app callback on mAssistReceiver's resultData");
+ return;
+ }
+ final AssistStructure structure = resultData
+ .getParcelable(VoiceInteractionSession.KEY_STRUCTURE);
+ final Bundle data = resultData.getBundle(VoiceInteractionSession.KEY_RECEIVER_EXTRAS);
+ final int flags = resultData.getInt(VoiceInteractionSession.KEY_FLAGS, 0);
+
+ final ServerCallback serverCallback;
+ synchronized (mLock) {
+ serverCallback = mServerCallbacks.get(resultCode);
+ if (serverCallback == null) {
+ Slog.w(TAG, "no server callback for id " + resultCode);
+ return;
+ }
+ serverCallback.appCallback = IAutoFillAppCallback.Stub.asInterface(appBinder);
+ }
+ mService.autoFill(structure, serverCallback, serverCallback.extras, flags);
+ }
+ };
+
@GuardedBy("mLock")
private IAutoFillService mService;
private boolean mBound;
@@ -128,9 +187,11 @@ final class AutoFillManagerServiceImpl {
// Estimated time when the service will be evicted from the cache.
long mEstimateTimeOfDeath;
- AutoFillManagerServiceImpl(AutoFillManagerService managerService, Context context, Object lock,
- Handler handler, int userId, int uid,ComponentName component, long ttl) {
+ AutoFillManagerServiceImpl(AutoFillManagerService managerService, AutoFillUI ui,
+ Context context, Object lock, Handler handler, int userId, int uid,
+ ComponentName component, long ttl) {
mManagerService = managerService;
+ mUi = ui;
mContext = context;
mLock = lock;
mUserId = userId;
@@ -180,7 +241,14 @@ final class AutoFillManagerServiceImpl {
if (DEBUG) Slog.d(TAG, "Bound to " + mComponent);
}
- void requestAutoFill(IBinder activityToken, int flags) {
+ /**
+ * Asks service to auto-fill an activity.
+ *
+ * @param activityToken activity token
+ * @param extras bundle to be passed to the {@link AutoFillService} method.
+ * @param flags optional flags.
+ */
+ void requestAutoFill(@Nullable IBinder activityToken, @Nullable Bundle extras, int flags) {
synchronized (mLock) {
if (!mBound) {
Slog.w(TAG, "requestAutoFill() failed because it's not bound to service");
@@ -211,21 +279,26 @@ final class AutoFillManagerServiceImpl {
DateFormat.getDateTimeInstance().format(new Date()) + " - " + activityToken;
synchronized (mLock) {
mRequestHistory.add(historyItem);
- requestAutoFillLocked(activityToken, flags, true);
+ requestAutoFillLocked(activityToken, extras, flags, true);
}
}
- private void requestAutoFillLocked(IBinder activityToken, int flags, boolean queueIfNecessary) {
+ private void requestAutoFillLocked(IBinder activityToken, @Nullable Bundle extras, int flags,
+ boolean queueIfNecessary) {
if (mService == null) {
if (!queueIfNecessary) {
Slog.w(TAG, "requestAutoFillLocked(): service is null");
return;
}
if (DEBUG) Slog.d(TAG, "requestAutoFill(): service not set yet, queuing it");
- mQueuedRequests.add(new QueuedRequest(activityToken, flags));
+ mQueuedRequests.add(new QueuedRequest(activityToken, extras, flags));
return;
}
+ final int callbackId = ++sServerCallbackCounter;
+ final ServerCallback serverCallback = new ServerCallback(callbackId, extras);
+ mServerCallbacks.put(callbackId, serverCallback);
+
/*
* TODO(b/33197203): apply security checks below:
* - checks if disabled by secure settings / device policy
@@ -235,8 +308,7 @@ final class AutoFillManagerServiceImpl {
*/
try {
// TODO(b/33197203): add MetricsLogger call
- if (!mAm.requestAutoFillData(mService.getAssistReceiver(), null, activityToken,
- flags)) {
+ if (!mAm.requestAutoFillData(mAssistReceiver, null, callbackId, activityToken, flags)) {
// TODO(b/33197203): might need a way to warn user (perhaps a new method on
// AutoFillService).
Slog.w(TAG, "failed to request auto-fill data for " + activityToken);
@@ -251,7 +323,7 @@ final class AutoFillManagerServiceImpl {
// Sanity check.
if (mService == null) {
- Log.w(TAG, "service already null on shutdown");
+ Slog.w(TAG, "service already null on shutdown");
return;
}
try {
@@ -273,6 +345,44 @@ final class AutoFillManagerServiceImpl {
}
}
+ /**
+ * Called by {@link AutoFillUI} to fill an activity after the user selected a dataset.
+ */
+ void autoFillApp(int callbackId, Dataset dataset) {
+ // TODO(b/33197203): add MetricsLogger call
+
+ if (dataset == null) {
+ Slog.w(TAG, "autoFillApp(): no dataset for callback id " + callbackId);
+ return;
+ }
+
+ final ServerCallback serverCallback;
+ synchronized (mLock) {
+ serverCallback = mServerCallbacks.get(callbackId);
+ if (serverCallback == null) {
+ Slog.w(TAG, "autoFillApp(): no server callback with id " + callbackId);
+ return;
+ }
+ if (serverCallback.appCallback == null) {
+ Slog.w(TAG, "autoFillApp(): no app callback for server callback " + callbackId);
+ return;
+ }
+ // TODO(b/33197203): use a handler?
+ try {
+ if (DEBUG) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
+ serverCallback.appCallback.autoFill(dataset);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Error auto-filling activity: " + e);
+ }
+ removeServerCallbackLocked(callbackId);
+ }
+ }
+
+ void removeServerCallbackLocked(int id) {
+ if (DEBUG) Slog.d(TAG, "Removing " + id + " from server callbacks");
+ mServerCallbacks.remove(id);
+ }
+
void dumpLocked(String prefix, PrintWriter pw) {
if (!mValid) {
pw.print(" NOT VALID: ");
@@ -284,6 +394,8 @@ final class AutoFillManagerServiceImpl {
return;
}
+ final String prefix2 = prefix + " ";
+
pw.print(prefix); pw.print("mUserId="); pw.println(mUserId);
pw.print(prefix); pw.print("mUid="); pw.println(mUid);
pw.print(prefix); pw.print("mComponent="); pw.println(mComponent.flattenToShortString());
@@ -303,7 +415,6 @@ final class AutoFillManagerServiceImpl {
pw.print(prefix); pw.println("No history");
} else {
pw.print(prefix); pw.println("History:");
- final String prefix2 = prefix + prefix;
for (int i = 0; i < mRequestHistory.size(); i++) {
pw.print(prefix2); pw.print(i); pw.print(": "); pw.println(mRequestHistory.get(i));
}
@@ -312,11 +423,28 @@ final class AutoFillManagerServiceImpl {
pw.print(prefix); pw.println("No queued requests");
} else {
pw.print(prefix); pw.println("Queued requests:");
- final String prefix2 = prefix + prefix;
for (int i = 0; i < mQueuedRequests.size(); i++) {
pw.print(prefix2); pw.print(i); pw.print(": "); pw.println(mQueuedRequests.get(i));
}
}
+
+ pw.print(prefix); pw.print("sServerCallbackCounter="); pw.println(sServerCallbackCounter);
+ final int size = mServerCallbacks.size();
+ if (size == 0) {
+ pw.print(prefix); pw.println("No server callbacks");
+ } else {
+ pw.print(prefix); pw.print(size); pw.println(" server callbacks:");
+ for (int i = 0; i < size; i++) {
+ pw.print(prefix2); pw.print(mServerCallbacks.keyAt(i));
+ final ServerCallback callback = mServerCallbacks.valueAt(i);
+ if (callback.appCallback == null) {
+ pw.println("(no appCallback)");
+ } else {
+ pw.print(" (app callback: "); pw.print(callback.appCallback) ; pw.println(")");
+ }
+ }
+ pw.println();
+ }
}
@Override
@@ -327,10 +455,12 @@ final class AutoFillManagerServiceImpl {
private static final class QueuedRequest {
final IBinder activityToken;
+ final Bundle extras;
final int flags;
- QueuedRequest(IBinder activityToken, int flags) {
+ QueuedRequest(IBinder activityToken, Bundle extras, int flags) {
this.activityToken = activityToken;
+ this.extras = extras;
this.flags = flags;
}
@@ -339,4 +469,54 @@ final class AutoFillManagerServiceImpl {
return "flags: " + flags + " token: " + activityToken;
}
}
+
+ /**
+ * A bridge between the {@link AutoFillService} implementation and the activity being
+ * auto-filled (represented through the {@link IAutoFillAppCallback}).
+ */
+ private final class ServerCallback extends IAutoFillServerCallback.Stub {
+
+ private final int id;
+ private final Bundle extras;
+ private IAutoFillAppCallback appCallback;
+
+ private ServerCallback(int id, Bundle extras) {
+ this.id = id;
+ this.extras = extras;
+ }
+
+ @Override
+ public void showResponse(FillResponse response) {
+ // TODO(b/33197203): add MetricsLogger call
+ if (DEBUG) Slog.d(TAG, "showResponse(): " + response);
+
+ mUi.showOptions(mUserId, id, response);
+ }
+
+ @Override
+ public void showError(String message) {
+ // TODO(b/33197203): add MetricsLogger call
+ if (DEBUG) Slog.d(TAG, "showError(): " + message);
+
+ mUi.showError(message);
+
+ removeSelf();
+ }
+
+ @Override
+ public void highlightSavedFields(AutoFillId[] ids) {
+ // TODO(b/33197203): add MetricsLogger call
+ if (DEBUG) Slog.d(TAG, "showSaved(): " + Arrays.toString(ids));
+
+ mUi.highlightSavedFields(ids);
+
+ removeSelf();
+ }
+
+ private void removeSelf() {
+ synchronized (mLock) {
+ removeServerCallbackLocked(id);
+ }
+ }
+ }
}
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceShellCommand.java b/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceShellCommand.java
index aa3503b9a6d3..26f24519ffc8 100644
--- a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceShellCommand.java
+++ b/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceShellCommand.java
@@ -16,10 +16,11 @@
package com.android.server.autofill;
-import static android.view.View.ASSIST_FLAG_SANITIZED_TEXT;
-import static android.view.View.ASSIST_FLAG_NON_SANITIZED_TEXT;
+import static android.view.View.AUTO_FILL_FLAG_TYPE_FILL;
+import static android.view.View.AUTO_FILL_FLAG_TYPE_SAVE;
import android.app.ActivityManager;
+import android.os.Bundle;
import android.os.RemoteException;
import android.os.ShellCommand;
import android.os.UserHandle;
@@ -44,9 +45,9 @@ public final class AutoFillManagerServiceShellCommand extends ShellCommand {
try {
switch (cmd) {
case "fill":
- return requestAutoFill(ASSIST_FLAG_SANITIZED_TEXT);
+ return requestAutoFill(AUTO_FILL_FLAG_TYPE_FILL);
case "save":
- return requestAutoFill(ASSIST_FLAG_NON_SANITIZED_TEXT);
+ return requestAutoFill(AUTO_FILL_FLAG_TYPE_SAVE);
default:
return handleDefaultCommands(cmd);
}
@@ -73,7 +74,7 @@ public final class AutoFillManagerServiceShellCommand extends ShellCommand {
private int requestAutoFill(int flags) throws RemoteException {
final int userId = getUserIdFromArgs();
- mService.requestAutoFill(null, userId, flags);
+ mService.requestAutoFill(null, userId, null, flags);
return 0;
}
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/AutoFillUI.java
new file mode 100644
index 000000000000..08e81d36f9cf
--- /dev/null
+++ b/services/autofill/java/com/android/server/autofill/AutoFillUI.java
@@ -0,0 +1,471 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.autofill;
+
+import static android.view.View.AUTO_FILL_FLAG_TYPE_SAVE;
+import static android.view.View.AUTO_FILL_FLAG_TYPE_FILL;
+
+import static com.android.server.autofill.AutoFillManagerService.DEBUG;
+
+import android.app.Activity;
+import android.app.AppGlobals;
+import android.app.Notification;
+import android.app.Notification.Action;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.content.pm.UserInfo;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.service.autofill.AutoFillService;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Slog;
+import android.view.autofill.Dataset;
+import android.view.autofill.AutoFillId;
+import android.view.autofill.FillResponse;
+import android.widget.Toast;
+
+import com.android.server.UiThread;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Handles all auto-fill related UI tasks.
+ */
+// TODO(b/33197203): document exactly what once the auto-fill bar is implemented
+final class AutoFillUI {
+
+ private static final String TAG = "AutoFillUI";
+
+ private final Context mContext;
+
+ AutoFillUI(Context context, AutoFillManagerService service, Object lock) {
+ mContext = context;
+ mResolver = context.getContentResolver();
+ mService = service;
+ mLock = lock;
+ }
+
+ /**
+ * Displays an error message to the user.
+ */
+ void showError(String message) {
+ // TODO(b/33197203): proper implementation
+ UiThread.getHandler().runWithScissors(() -> {
+ Toast.makeText(mContext, "AutoFill error: " + message, Toast.LENGTH_LONG).show();
+ }, 0);
+ }
+
+ /**
+ * Highlights in the {@link Activity} the fields saved by the service.
+ */
+ void highlightSavedFields(AutoFillId[] ids) {
+ // TODO(b/33197203): proper implementation (must be handled by activity)
+ UiThread.getHandler().runWithScissors(() -> {
+ Toast.makeText(mContext, "AutoFill: service saved ids " + Arrays.toString(ids),
+ Toast.LENGTH_LONG).show();
+ }, 0);
+ }
+
+ /**
+ * Shows the options from a {@link FillResponse} so the user can pick up the proper
+ * {@link Dataset} (when the response has one).
+ */
+ void showOptions(int userId, int callbackId, FillResponse response) {
+ // TODO(b/33197203): proper implementation
+ // TODO(b/33197203): make sure if removes the callback from cache
+ showOptionsNotification(userId, callbackId, response);
+ }
+
+ /////////////////////////////////////////////////////////////////////////////////
+ // TODO(b/33197203): temporary code using a notification to request auto-fill. //
+ // Will be removed once UX decide the right way to present it to the user. //
+ /////////////////////////////////////////////////////////////////////////////////
+
+ // TODO(b/33197203): remove from frameworks/base/core/res/AndroidManifest.xml once not used
+ private static final String NOTIFICATION_AUTO_FILL_INTENT =
+ "com.android.internal.autofill.action.REQUEST_AUTOFILL";
+
+ // Extras used in the notification intents
+ private static final String EXTRA_USER_ID = "user_id";
+ private static final String EXTRA_NOTIFICATION_TYPE = "notification_type";
+ private static final String EXTRA_CALLBACK_ID = "callback_id";
+ private static final String EXTRA_FILL_RESPONSE = "fill_response";
+ private static final String EXTRA_DATASET = "dataset";
+
+ private static final String TYPE_EMULATE = "emulate";
+ private static final String TYPE_OPTIONS = "options";
+ private static final String TYPE_DELETE_CALLBACK = "delete_callback";
+ private static final String TYPE_PICK_DATASET = "pick_dataset";
+ private static final String TYPE_SAVE = "save";
+
+ static final int MSG_SHOW_ALL_NOTIFICATIONS = 42;
+ static final int SHOW_ALL_NOTIFICATIONS_DELAY_MS = 5000;
+
+ private BroadcastReceiver mNotificationReceiver;
+ private final ContentResolver mResolver;
+ private final AutoFillManagerService mService;
+ private final Object mLock;
+
+ // Hack used to generate unique pending intents
+ static int sResultCode = 0;
+
+ final class NotificationReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final int userId = intent.getIntExtra(EXTRA_USER_ID, -1);
+
+ final AutoFillManagerServiceImpl service = mService.getServiceForUserLocked(userId);
+ if (service == null) {
+ Slog.w(TAG, "no auto-fill service for user " + userId);
+ return;
+ }
+
+ final int callbackId = intent.getIntExtra(EXTRA_CALLBACK_ID, -1);
+ final String type = intent.getStringExtra(EXTRA_NOTIFICATION_TYPE);
+ if (type == null) {
+ Slog.wtf(TAG, "No extra " + EXTRA_NOTIFICATION_TYPE + " on intent " + intent);
+ return;
+ }
+ final FillResponse fillData = intent.getParcelableExtra(EXTRA_FILL_RESPONSE);
+ final Dataset dataset = intent.getParcelableExtra(EXTRA_DATASET);
+ final Bundle datasetArgs = dataset == null ? null : dataset.getExtras();
+ final Bundle fillDataArgs = fillData == null ? null : fillData.getExtras();
+
+ // Bundle sent on AutoFillService methods - only set if service provided a bundle
+ final Bundle extras = (datasetArgs == null && fillDataArgs == null)
+ ? null : new Bundle();
+
+ if (DEBUG) Slog.d(TAG, "Notification received: type=" + type + ", userId=" + userId
+ + ", callbackId=" + callbackId);
+ synchronized (mLock) {
+ switch (type) {
+ case TYPE_EMULATE:
+ service.requestAutoFill(null, extras, AUTO_FILL_FLAG_TYPE_FILL);
+ break;
+ case TYPE_SAVE:
+ if (datasetArgs != null) {
+ if (DEBUG) Log.d(TAG, "filldata args on save notificataion: " +
+ bundleToString(fillDataArgs));
+ extras.putBundle(AutoFillService.EXTRA_RESPONSE_EXTRAS, fillDataArgs);
+ }
+ if (dataset != null) {
+ if (DEBUG) Log.d(TAG, "dataset args on save notificataion: " +
+ bundleToString(datasetArgs));
+ extras.putBundle(AutoFillService.EXTRA_DATASET_EXTRAS, datasetArgs);
+ }
+ service.requestAutoFill(null, extras, AUTO_FILL_FLAG_TYPE_SAVE);
+ break;
+ case TYPE_DELETE_CALLBACK:
+ service.removeServerCallbackLocked(callbackId);
+ break;
+ case TYPE_PICK_DATASET:
+ service.autoFillApp(callbackId, dataset);
+ // Must cancel notification because it might be comming from action
+ if (DEBUG) Log.d(TAG, "Cancelling notification");
+ NotificationManager.from(mContext).cancel(TYPE_OPTIONS, userId);
+
+ if (datasetArgs != null) {
+ if (DEBUG) Log.d(TAG, "adding dataset's extra_data on save intent: "
+ + bundleToString(datasetArgs));
+ extras.putBundle(AutoFillService.EXTRA_DATASET_EXTRAS, datasetArgs);
+ }
+
+ // Also show notification with option to save the data
+ showSaveNotification(userId, fillData, dataset);
+ break;
+ default: {
+ Slog.w(TAG, "Unknown notification type: " + type);
+ }
+ }
+ }
+ }
+ }
+
+ private ComponentName getProviderForUser(int userId) {
+ ComponentName serviceComponent = null;
+ ServiceInfo serviceInfo = null;
+ final String componentName = Settings.Secure.getStringForUser(
+ mResolver, Settings.Secure.AUTO_FILL_SERVICE, userId);
+ if (!TextUtils.isEmpty(componentName)) {
+ try {
+ serviceComponent = ComponentName.unflattenFromString(componentName);
+ serviceInfo =
+ AppGlobals.getPackageManager().getServiceInfo(serviceComponent, 0, userId);
+ } catch (RuntimeException | RemoteException e) {
+ Slog.wtf(TAG, "Bad auto-fill service name " + componentName, e);
+ return null;
+ }
+ }
+
+ if (DEBUG) Slog.d(TAG, "getServiceComponentForUser(" + userId + "): component="
+ + serviceComponent + ", info: " + serviceInfo);
+ if (serviceInfo == null) {
+ Slog.w(TAG, "no service info for " + serviceComponent);
+ return null;
+ }
+ return serviceComponent;
+ }
+
+ void showAllNotifications() {
+ final UserManager userManager =
+ (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+
+ final List<UserInfo> allUsers = userManager.getUsers(true);
+
+ for (UserInfo user : allUsers) {
+ final ComponentName serviceComponent = getProviderForUser(user.id);
+ if (serviceComponent != null) {
+ showMainNotification(serviceComponent, user.id);
+ }
+ }
+ }
+
+ void updateNotification(int userId) {
+ final ComponentName serviceComponent = getProviderForUser(userId);
+ if (serviceComponent == null) {
+ cancelMainNotification(userId);
+ } else {
+ showMainNotification(serviceComponent, userId);
+ }
+ }
+
+ private static Intent newNotificationIntent(int userId, String type) {
+ final Intent intent = new Intent(NOTIFICATION_AUTO_FILL_INTENT);
+ intent.putExtra(EXTRA_USER_ID, userId);
+ intent.putExtra(EXTRA_NOTIFICATION_TYPE, type);
+ return intent;
+ }
+
+ private PendingIntent newPickDatasetPI(int userId, int callbackId, FillResponse response,
+ Dataset dataset) {
+ final int resultCode = ++ sResultCode;
+ if (DEBUG) Log.d(TAG, "newPickDatasetPI: userId=" + userId + ", callback=" + callbackId
+ + ", resultCode=" + resultCode);
+
+ final Intent intent = newNotificationIntent(userId, TYPE_PICK_DATASET);
+ intent.putExtra(EXTRA_CALLBACK_ID, callbackId);
+ intent.putExtra(EXTRA_FILL_RESPONSE, response);
+ intent.putExtra(EXTRA_DATASET, dataset);
+ return PendingIntent.getBroadcast(mContext, resultCode, intent,
+ PendingIntent.FLAG_ONE_SHOT);
+ }
+
+ private static String bundleToString(Bundle bundle) {
+ if (bundle == null) {
+ return "null";
+ }
+ final Set<String> keySet = bundle.keySet();
+ final StringBuilder builder = new StringBuilder("[Bundle with ").append(keySet.size())
+ .append(" keys:");
+ for (String key : keySet) {
+ final Object value = bundle.get(key);
+ builder.append(' ').append(key).append('=');
+ builder.append((value instanceof Object[])
+ ? Arrays.toString((Objects[]) value) : value);
+ }
+ return builder.append(']').toString();
+ }
+
+ /**
+ * Shows a permanent notification that triggers the auto-fill workflow for the given user.
+ *
+ * <p>It emulates calling the auto-fill service when the IME is shown.
+ */
+ private void showMainNotification(ComponentName serviceComponent, int userId) {
+ if (DEBUG) Log.d(TAG, "showNotification() for " + userId + ": " + serviceComponent);
+
+ synchronized (mLock) {
+ if (mNotificationReceiver == null) {
+ mNotificationReceiver = new NotificationReceiver();
+ mContext.registerReceiver(mNotificationReceiver,
+ new IntentFilter(NOTIFICATION_AUTO_FILL_INTENT));
+ }
+ }
+
+ final Intent fillIntent = newNotificationIntent(userId, TYPE_EMULATE);
+ final PendingIntent fillPendingIntent = PendingIntent.getBroadcast(mContext,
+ -1, fillIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ final String packageName = serviceComponent.getPackageName();
+ String providerName = null;
+ final PackageManager pm = mContext.getPackageManager();
+ try {
+ final ApplicationInfo info = pm.getApplicationInfoAsUser(packageName, 0, userId);
+ if (info != null) {
+ providerName = pm.getApplicationLabel(info).toString();
+ }
+ } catch (Exception e) {
+ providerName = packageName;
+ }
+ final String title = "AutoFill IME Emulation";
+ final String subTitle = "Tap notification to start auto-fill workflow (by '" + providerName
+ + "' on top activity on user " + userId + ".\n"
+ + "Once provider replies, a new notification will show your options.";
+
+ final Notification notification = new Notification.Builder(mContext)
+ .setCategory(Notification.CATEGORY_SYSTEM)
+ .setOngoing(true)
+ .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
+ .setLocalOnly(true)
+ .setColor(mContext.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setContentTitle(title)
+ .setStyle(new Notification.BigTextStyle().bigText(subTitle))
+ .setContentIntent(fillPendingIntent)
+ .build();
+ NotificationManager.from(mContext).notify(TYPE_EMULATE, userId, notification);
+ }
+
+ /**
+ * Cancels the permament notification created by
+ * {@link #showMainNotification(ComponentName, int)}.
+ */
+ private void cancelMainNotification(int userId) {
+ if (DEBUG) Log.d(TAG, "cancelNotificationLocked(): " + userId);
+ NotificationManager.from(mContext).cancel(TYPE_EMULATE, userId);
+ }
+
+ /**
+ * Shows a notification with the results of an auto-fill request, using notications actions
+ * to emulate the auto-fill bar buttons displaying the dataset names.
+ */
+ private void showOptionsNotification(int userId, int callbackId, FillResponse response) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ showOptionsNotificationAsSystem(userId, callbackId, response);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ private void showOptionsNotificationAsSystem(int userId, int callbackId,
+ FillResponse response) {
+ // Make sure server callback is removed from cache if user cancels the notification.
+ final Intent deleteIntent = newNotificationIntent(userId, TYPE_DELETE_CALLBACK);
+ deleteIntent.putExtra(EXTRA_CALLBACK_ID, callbackId);
+ final PendingIntent deletePendingIntent = PendingIntent.getBroadcast(mContext,
+ ++sResultCode, deleteIntent, PendingIntent.FLAG_ONE_SHOT);
+
+ final String title = "AutoFill Options";
+
+ final Notification.Builder notification = new Notification.Builder(mContext)
+ .setCategory(Notification.CATEGORY_SYSTEM)
+ .setOngoing(false)
+ .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
+ .setLocalOnly(true)
+ .setColor(mContext.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setDeleteIntent(deletePendingIntent)
+ .setContentTitle(title);
+
+ boolean autoCancel = true;
+ final String subTitle;
+ final List<Dataset> datasets;
+ final AutoFillId[] savableIds;
+ if (response != null) {
+ datasets = response.getDatasets();
+ savableIds = response.getSavableIds();
+ } else {
+ datasets = null;
+ savableIds = null;
+ }
+ boolean showSave = false;
+ if (datasets == null ) {
+ subTitle = "No options to auto-fill this activity.";
+ } else if (datasets.isEmpty()) {
+ if (savableIds.length == 0) {
+ subTitle = "No options to auto-fill this activity.";
+ } else {
+ subTitle = "No options to auto-fill this activity, but provider can save ids:\n"
+ + Arrays.toString(savableIds);
+ showSave = true;
+ }
+ } else {
+ final AutoFillManagerServiceImpl service = mService.getServiceForUserLocked(userId);
+ if (service == null) {
+ subTitle = "No auto-fill service for user " + userId;
+ Slog.w(TAG, subTitle);
+ } else {
+ autoCancel = false;
+ final int size = datasets.size();
+ subTitle = "There are " + size + " option(s).\n"
+ + "Use the notification action(s) to select the proper one.";
+ for (Dataset dataset : datasets) {
+ final CharSequence name = dataset.getName();
+ final PendingIntent pi = newPickDatasetPI(userId, callbackId, response, dataset);
+ notification.addAction(new Action.Builder(null, name, pi).build());
+ }
+ }
+ }
+
+ notification.setAutoCancel(autoCancel);
+ notification.setStyle(new Notification.BigTextStyle().bigText(subTitle));
+
+ NotificationManager.from(mContext).notify(TYPE_OPTIONS, userId, notification.build());
+
+ if (showSave) {
+ showSaveNotification(userId, response, null);
+ }
+ }
+
+ private void showSaveNotification(int userId, FillResponse response, Dataset dataset) {
+ final Intent saveIntent = newNotificationIntent(userId, TYPE_SAVE);
+ saveIntent.putExtra(EXTRA_FILL_RESPONSE, response);
+ if (dataset != null) {
+ saveIntent.putExtra(EXTRA_DATASET, dataset);
+ }
+ final PendingIntent savePendingIntent = PendingIntent.getBroadcast(mContext,
+ ++sResultCode, saveIntent, PendingIntent.FLAG_ONE_SHOT);
+
+ final String title = "AutoFill Save";
+ final String subTitle = "Tap notification to ask provider to save fields: \n"
+ + Arrays.toString(response.getSavableIds());
+
+ final Notification notification = new Notification.Builder(mContext)
+ .setCategory(Notification.CATEGORY_SYSTEM)
+ .setAutoCancel(true)
+ .setOngoing(false)
+ .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
+ .setLocalOnly(true)
+ .setColor(mContext.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setContentTitle(title)
+ .setContentIntent(savePendingIntent)
+ .setStyle(new Notification.BigTextStyle().bigText(subTitle))
+ .build();
+ NotificationManager.from(mContext).notify(TYPE_SAVE, userId, notification);
+ }
+
+ /////////////////////////////////////////
+ // End of temporary notification code. //
+ /////////////////////////////////////////
+}
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index e7f1d16fcc61..2ca1b4eddb49 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -218,6 +218,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
@Override
public void onUserRestrictionsChanged(int userId, Bundle newRestrictions,
Bundle prevRestrictions) {
+ if (!newRestrictions.containsKey(UserManager.DISALLOW_BLUETOOTH)
+ && !prevRestrictions.containsKey(UserManager.DISALLOW_BLUETOOTH)) {
+ // The relevant restriction has not changed - do nothing.
+ return;
+ }
final boolean bluetoothDisallowed =
newRestrictions.getBoolean(UserManager.DISALLOW_BLUETOOTH);
if ((mEnable || mEnableExternal) && bluetoothDisallowed) {
@@ -228,6 +233,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
e);
}
}
+ updateOppLauncherComponentState(bluetoothDisallowed);
}
};
@@ -953,7 +959,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
UserManagerInternal userManagerInternal =
LocalServices.getService(UserManagerInternal.class);
userManagerInternal.addUserRestrictionsListener(mUserRestrictionsListener);
- if (isBluetoothDisallowed()) {
+ final boolean isBluetoothDisallowed = isBluetoothDisallowed();
+ updateOppLauncherComponentState(isBluetoothDisallowed);
+ if (isBluetoothDisallowed) {
return;
}
if (mEnableExternal && isBluetoothPersistedStateOnBluetooth()) {
@@ -2011,6 +2019,24 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
}
}
+ /**
+ * Disables BluetoothOppLauncherActivity component, so the Bluetooth sharing option is not
+ * offered to the user if Bluetooth is disallowed. Puts the component to its default state if
+ * Bluetooth is not disallowed.
+ *
+ * @param bluetoothDisallowed whether the {@link UserManager.DISALLOW_BLUETOOTH} user
+ * restriction was set.
+ */
+ private void updateOppLauncherComponentState(boolean bluetoothDisallowed) {
+ final ComponentName oppLauncherComponent = new ComponentName("com.android.bluetooth",
+ "com.android.bluetooth.opp.BluetoothOppLauncherActivity");
+ final int newState = bluetoothDisallowed
+ ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
+ mContext.getPackageManager()
+ .setComponentEnabledSetting(oppLauncherComponent, newState, 0);
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 372e9a640994..f718fa11598e 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -1666,6 +1666,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@Override
public void onServiceDisconnected(ComponentName name) {
+ // Note that mContext.unbindService(this) does not trigger this. Hence if we are here the
+ // disconnection is not intended by IMMS (e.g. triggered because the current IMS crashed),
+ // which is irregular but can eventually happen for everyone just by continuing using the
+ // device. Thus it is important to make sure that all the internal states are properly
+ // refreshed when this method is called back. Running
+ // adb install -r <APK that implements the current IME>
+ // would be a good way to trigger such a situation.
synchronized (mMethodMap) {
if (DEBUG) Slog.v(TAG, "Service disconnected: " + name
+ " mCurIntent=" + mCurIntent);
@@ -1677,11 +1684,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mLastBindTime = SystemClock.uptimeMillis();
mShowRequested = mInputShown;
mInputShown = false;
- if (mCurClient != null) {
- executeOrSendMessage(mCurClient.client, mCaller.obtainMessageIIO(
- MSG_UNBIND_CLIENT, InputMethodClient.UNBIND_REASON_DISCONNECT_IME,
- mCurSeq, mCurClient.client));
- }
+ unbindCurrentClientLocked(InputMethodClient.UNBIND_REASON_DISCONNECT_IME);
}
}
}
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index 4d6ffe6e99c6..a5552b836564 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -176,12 +176,8 @@ public class LockSettingsService extends ILockSettings.Stub {
}
@Override
- public void onBootPhase(int phase) {
- if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
- mLockSettingsService.maybeShowEncryptionNotifications();
- } else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
- // TODO
- }
+ public void onStartUser(int userHandle) {
+ mLockSettingsService.onStartUser(userHandle);
}
@Override
@@ -313,27 +309,25 @@ public class LockSettingsService extends ILockSettings.Stub {
* If the account is credential-encrypted, show notification requesting the user to unlock
* the device.
*/
- private void maybeShowEncryptionNotifications() {
- final List<UserInfo> users = mUserManager.getUsers();
- for (int i = 0; i < users.size(); i++) {
- UserInfo user = users.get(i);
- UserHandle userHandle = user.getUserHandle();
- final boolean isSecure = mStorage.hasPassword(user.id) || mStorage.hasPattern(user.id);
- if (isSecure && !mUserManager.isUserUnlockingOrUnlocked(userHandle)) {
- if (!user.isManagedProfile()) {
- // When the user is locked, we communicate it loud-and-clear
- // on the lockscreen; we only show a notification below for
- // locked managed profiles.
- } else {
- UserInfo parent = mUserManager.getProfileParent(user.id);
- if (parent != null &&
- mUserManager.isUserUnlockingOrUnlocked(parent.getUserHandle()) &&
- !mUserManager.isQuietModeEnabled(userHandle)) {
- // Only show notifications for managed profiles once their parent
- // user is unlocked.
- showEncryptionNotificationForProfile(userHandle);
- }
- }
+ private void maybeShowEncryptionNotificationForUser(@UserIdInt int userId) {
+ final UserInfo user = mUserManager.getUserInfo(userId);
+ if (!user.isManagedProfile()) {
+ // When the user is locked, we communicate it loud-and-clear
+ // on the lockscreen; we only show a notification below for
+ // locked managed profiles.
+ return;
+ }
+
+ final UserHandle userHandle = user.getUserHandle();
+ final boolean isSecure = mStorage.hasPassword(userId) || mStorage.hasPattern(userId);
+ if (isSecure && !mUserManager.isUserUnlockingOrUnlocked(userHandle)) {
+ UserInfo parent = mUserManager.getProfileParent(userId);
+ if (parent != null &&
+ mUserManager.isUserUnlockingOrUnlocked(parent.getUserHandle()) &&
+ !mUserManager.isQuietModeEnabled(userHandle)) {
+ // Only show notifications for managed profiles once their parent
+ // user is unlocked.
+ showEncryptionNotificationForProfile(userHandle);
}
}
}
@@ -384,7 +378,7 @@ public class LockSettingsService extends ILockSettings.Stub {
mNotificationManager.notifyAsUser(null, FBE_ENCRYPTED_NOTIFICATION, notification, user);
}
- public void hideEncryptionNotification(UserHandle userHandle) {
+ private void hideEncryptionNotification(UserHandle userHandle) {
if (DEBUG) Slog.v(TAG, "hide encryption notification, user: "+ userHandle.getIdentifier());
mNotificationManager.cancelAsUser(null, FBE_ENCRYPTED_NOTIFICATION, userHandle);
}
@@ -393,6 +387,10 @@ public class LockSettingsService extends ILockSettings.Stub {
hideEncryptionNotification(new UserHandle(userId));
}
+ public void onStartUser(final int userId) {
+ maybeShowEncryptionNotificationForUser(userId);
+ }
+
public void onUnlockUser(final int userId) {
// Hide notification first, as tie managed profile lock takes time
hideEncryptionNotification(new UserHandle(userId));
diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java
index cef459a3ae39..e23844c3e633 100644
--- a/services/core/java/com/android/server/NetworkScoreService.java
+++ b/services/core/java/com/android/server/NetworkScoreService.java
@@ -301,7 +301,8 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
// If we're not connected at all then create a new connection.
if (mServiceConnection == null) {
- mServiceConnection = new ScoringServiceConnection(componentName);
+ mServiceConnection = new ScoringServiceConnection(componentName,
+ scorerData.packageUid);
}
// Make sure the connection is connected (idempotent)
@@ -325,7 +326,7 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
@Override
public boolean updateScores(ScoredNetwork[] networks) {
- if (!mNetworkScorerAppManager.isCallerActiveScorer(getCallingUid())) {
+ if (!isCallerActiveScorer(getCallingUid())) {
throw new SecurityException("Caller with UID " + getCallingUid() +
" is not the active scorer.");
}
@@ -389,7 +390,7 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
@Override
public boolean clearScores() {
// Only the active scorer or the system should be allowed to flush all scores.
- if (mNetworkScorerAppManager.isCallerActiveScorer(getCallingUid()) || isCallerSystemUid()) {
+ if (isCallerActiveScorer(getCallingUid()) || isCallerSystemUid()) {
final long token = Binder.clearCallingIdentity();
try {
clearInternal();
@@ -418,10 +419,39 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
return false;
}
+ /**
+ * Determine whether the application with the given UID is the enabled scorer.
+ *
+ * @param callingUid the UID to check
+ * @return true if the provided UID is the active scorer, false otherwise.
+ */
+ @Override
+ public boolean isCallerActiveScorer(int callingUid) {
+ synchronized (mServiceConnectionLock) {
+ return mServiceConnection != null && mServiceConnection.mScoringAppUid == callingUid;
+ }
+ }
+
+ /**
+ * Obtain the package name of the current active network scorer.
+ *
+ * @return the full package name of the current active scorer, or null if there is no active
+ * scorer.
+ */
+ @Override
+ public String getActiveScorerPackage() {
+ synchronized (mServiceConnectionLock) {
+ if (mServiceConnection != null) {
+ return mServiceConnection.mComponentName.getPackageName();
+ }
+ }
+ return null;
+ }
+
@Override
public void disableScoring() {
// Only the active scorer or the system should be allowed to disable scoring.
- if (mNetworkScorerAppManager.isCallerActiveScorer(getCallingUid()) || isCallerSystemUid()) {
+ if (isCallerActiveScorer(getCallingUid()) || isCallerSystemUid()) {
// no-op for now but we could write to the setting if needed.
} else {
throw new SecurityException(
@@ -623,12 +653,14 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
private static class ScoringServiceConnection implements ServiceConnection {
private final ComponentName mComponentName;
+ private final int mScoringAppUid;
private volatile boolean mBound = false;
private volatile boolean mConnected = false;
private volatile INetworkRecommendationProvider mRecommendationProvider;
- ScoringServiceConnection(ComponentName componentName) {
+ ScoringServiceConnection(ComponentName componentName, int scoringAppUid) {
mComponentName = componentName;
+ mScoringAppUid = scoringAppUid;
}
void connect(Context context) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index bdfdab1559f4..3ab30f234bf0 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -690,19 +690,21 @@ public class ActivityManagerService extends IActivityManager.Stub
public AssistStructure structure = null;
public AssistContent content = null;
public Bundle receiverExtras;
+ public int resultCode;
public int flags;
public PendingAssistExtras(ActivityRecord _activity, Bundle _extras, Intent _intent,
- String _hint, IResultReceiver _receiver, Bundle _receiverExtras, int _flags,
- int _userHandle) {
+ String _hint, IResultReceiver _receiver, Bundle _receiverExtras, int _resultCode,
+ int _userHandle, int _flags) {
activity = _activity;
extras = _extras;
intent = _intent;
hint = _hint;
receiver = _receiver;
receiverExtras = _receiverExtras;
- flags = _flags;
+ resultCode = _resultCode;
userHandle = _userHandle;
+ flags = _flags;
}
@Override
public void run() {
@@ -12190,7 +12192,7 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public Bundle getAssistContextExtras(int requestType) {
PendingAssistExtras pae = enqueueAssistContext(requestType, null, null, null,
- null, null, true /* focused */, true /* newSessionId */,
+ null, 0, null, true /* focused */, true /* newSessionId */,
UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT, 0);
if (pae == null) {
return null;
@@ -12258,22 +12260,37 @@ public class ActivityManagerService extends IActivityManager.Stub
Bundle receiverExtras,
IBinder activityToken, boolean focused, boolean newSessionId) {
return enqueueAssistContext(requestType, null, null, receiver, receiverExtras,
- activityToken, focused, newSessionId,
- UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_LONG_TIMEOUT, 0)
- != null;
+ 0, activityToken, focused, newSessionId, UserHandle.getCallingUserId(), null,
+ PENDING_ASSIST_EXTRAS_LONG_TIMEOUT, 0) != null;
}
@Override
public boolean requestAutoFillData(IResultReceiver receiver, Bundle receiverExtras,
- IBinder activityToken, int flags) {
- return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_FULL, null, null, receiver,
- receiverExtras, activityToken, true, true,
- UserHandle.getCallingUserId(), null, PENDING_AUTO_FILL_ASSIST_STRUCTURE_TIMEOUT,
- flags) != null;
+ int resultCode, IBinder activityToken, int flags) {
+ final boolean forFill = (flags & View.AUTO_FILL_FLAG_TYPE_FILL) != 0;
+ final boolean forSave = (flags & View.AUTO_FILL_FLAG_TYPE_SAVE) != 0;
+ if ((forFill && forSave) || (!forFill) && !(forSave)) {
+ // There can be only one!
+ Slog.w(TAG, "requestAutoFillData(): invalid flags (" + flags + ")");
+ return false;
+ }
+
+ // NOTE: we could always use ActivityManager.ASSIST_CONTEXT_FULL and let ActivityThread
+ // rely on the flags to decide whether the handleRequestAssistContextExtras() is for
+ // auto-fill, but it's safer to explicitly use new AutoFill types, in case the Assist
+ // requests use flags in the future as well (since their flags value might collide with the
+ // auto-fill flag values).
+ final int type = forFill?
+ ActivityManager.ASSIST_CONTEXT_AUTO_FILL :
+ ActivityManager.ASSIST_CONTEXT_AUTO_FILL_SAVE;
+
+ return enqueueAssistContext(type, null, null, receiver, receiverExtras, resultCode,
+ activityToken, true, true, UserHandle.getCallingUserId(), null,
+ PENDING_AUTO_FILL_ASSIST_STRUCTURE_TIMEOUT, flags) != null;
}
private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
- IResultReceiver receiver, Bundle receiverExtras, IBinder activityToken,
+ IResultReceiver receiver, Bundle receiverExtras, int resultCode, IBinder activityToken,
boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout,
int flags) {
enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO,
@@ -12314,7 +12331,7 @@ public class ActivityManagerService extends IActivityManager.Stub
extras.putString(Intent.EXTRA_ASSIST_PACKAGE, activity.packageName);
extras.putInt(Intent.EXTRA_ASSIST_UID, activity.app.uid);
pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, receiverExtras,
- flags, userHandle);
+ resultCode, userHandle, flags);
// Increment the sessionId if necessary
if (newSessionId) {
mViSessionId++;
@@ -12400,17 +12417,15 @@ public class ActivityManagerService extends IActivityManager.Stub
if (pae.flags > 0) {
sendBundle.putInt(VoiceInteractionSession.KEY_FLAGS, pae.flags);
}
- IBinder autoFillCallback =
- extras.getBinder(AutoFillService.KEY_CALLBACK);
- if (autoFillCallback != null) {
- sendBundle.putBinder(AutoFillService.KEY_CALLBACK,
- autoFillCallback);
+ IBinder cb = extras.getBinder(AutoFillService.KEY_CALLBACK);
+ if (cb != null) {
+ sendBundle.putBinder(AutoFillService.KEY_CALLBACK, cb);
}
}
}
if (sendReceiver != null) {
try {
- sendReceiver.send(0, sendBundle);
+ sendReceiver.send(pae.resultCode, sendBundle);
} catch (RemoteException e) {
}
return;
@@ -12435,9 +12450,9 @@ public class ActivityManagerService extends IActivityManager.Stub
public boolean launchAssistIntent(Intent intent, int requestType, String hint, int userHandle,
Bundle args) {
- return enqueueAssistContext(requestType, intent, hint, null, null, null,
- true /* focused */, true /* newSessionId */,
- userHandle, args, PENDING_ASSIST_EXTRAS_TIMEOUT, 0) != null;
+ return enqueueAssistContext(requestType, intent, hint, null, null, 0, null,
+ true /* focused */, true /* newSessionId */, userHandle, args,
+ PENDING_ASSIST_EXTRAS_TIMEOUT, 0) != null;
}
public void registerProcessObserver(IProcessObserver observer) {
@@ -17875,6 +17890,11 @@ public class ActivityManagerService extends IActivityManager.Stub
private void checkBroadcastFromSystem(Intent intent, ProcessRecord callerApp,
String callerPackage, int callingUid, boolean isProtectedBroadcast, List receivers) {
+ if ((intent.getFlags() & Intent.FLAG_RECEIVER_FROM_SHELL) != 0) {
+ // Don't yell about broadcasts sent via shell
+ return;
+ }
+
final String action = intent.getAction();
if (isProtectedBroadcast
|| Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
@@ -18018,11 +18038,7 @@ public class ActivityManagerService extends IActivityManager.Stub
case Process.PHONE_UID:
case Process.BLUETOOTH_UID:
case Process.NFC_UID:
- if ((intent.getFlags() & Intent.FLAG_RECEIVER_FROM_SHELL) != 0) {
- isCallerSystem = false;
- } else {
- isCallerSystem = true;
- }
+ isCallerSystem = true;
break;
default:
isCallerSystem = (callerApp != null) && callerApp.persistent;
@@ -22661,6 +22677,11 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
+ @Override
+ public int restartUserInBackground(final int userId) {
+ return mUserController.restartUser(userId, /* foreground */ false);
+ }
+
/**
* Attach an agent to the specified process (proces name or PID)
*/
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 5def3403dc56..8bd7c9010181 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -3335,6 +3335,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
final int focusStackId = mFocusedStack.getStackId();
// We dismiss the docked stack whenever we switch users.
moveTasksToFullscreenStackLocked(DOCKED_STACK_ID, focusStackId == DOCKED_STACK_ID);
+ // Also dismiss the pinned stack whenever we switch users. Removing the pinned stack will
+ // also cause all tasks to be moved to the fullscreen stack at a position that is
+ // appropriate.
+ removeStackLocked(PINNED_STACK_ID);
mUserStackInFront.put(mCurrentUser, focusStackId);
final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID);
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 09af9412da64..007a478ec683 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -949,14 +949,18 @@ class ActivityStarter {
}
void sendPowerHintForLaunchStartIfNeeded(boolean forceSend) {
- // Trigger launch power hint if activity being launched is not in the current task
- final ActivityStack focusStack = mSupervisor.getFocusedStack();
- final ActivityRecord curTop = (focusStack == null)
- ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop);
- if ((forceSend || (!mPowerHintSent && curTop != null &&
- curTop.task != null && mStartActivity != null &&
- curTop.task != mStartActivity.task )) &&
- mService.mLocalPowerManager != null) {
+ boolean sendHint = forceSend;
+
+ if (!sendHint) {
+ // If not forced, send power hint when the activity's process is different than the
+ // current resumed activity.
+ final ActivityRecord resumedActivity = mSupervisor.getResumedActivityLocked();
+ sendHint = resumedActivity == null
+ || resumedActivity.app == null
+ || !resumedActivity.app.equals(mStartActivity.app);
+ }
+
+ if (sendHint && mService.mLocalPowerManager != null) {
mService.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 1);
mPowerHintSent = true;
}
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index a0a04bbc3bd5..45e06b0743f4 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -442,6 +442,19 @@ final class UserController {
}
}
+ int restartUser(final int userId, final boolean foreground) {
+ return stopUser(userId, /* force */ true, new IStopUserCallback.Stub() {
+ @Override
+ public void userStopped(final int userId) {
+ // Post to the same handler that this callback is called from to ensure the user
+ // cleanup is complete before restarting.
+ mHandler.post(() -> startUser(userId, foreground));
+ }
+ @Override
+ public void userStopAborted(final int userId) {}
+ });
+ }
+
int stopUser(final int userId, final boolean force, final IStopUserCallback callback) {
if (mInjector.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
!= PackageManager.PERMISSION_GRANTED) {
@@ -634,6 +647,12 @@ final class UserController {
}
if (stopped) {
+ // Evict the user's credential encryption key
+ try {
+ getStorageManager().lockUserKey(userId);
+ } catch (RemoteException re) {
+ throw re.rethrowAsRuntimeException();
+ }
mInjector.systemServiceManagerCleanupUser(userId);
synchronized (mLock) {
mInjector.stackSupervisorRemoveUserLocked(userId);
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 6d96a1015aa2..79567d50c31c 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -199,7 +199,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
mTetherMasterSM.start();
- mUpstreamNetworkMonitor = new UpstreamNetworkMonitor();
+ mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
+ mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
mStateReceiver = new StateReceiver();
IntentFilter filter = new IntentFilter();
@@ -1027,38 +1028,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
}
/**
- * A NetworkCallback class that relays information of interest to the
- * tethering master state machine thread for subsequent processing.
- */
- class UpstreamNetworkCallback extends NetworkCallback {
- @Override
- public void onAvailable(Network network) {
- mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
- UpstreamNetworkMonitor.EVENT_ON_AVAILABLE, 0, network);
- }
-
- @Override
- public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
- mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
- UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES, 0,
- new NetworkState(null, null, newNc, network, null, null));
- }
-
- @Override
- public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
- mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
- UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES, 0,
- new NetworkState(null, newLp, null, network, null, null));
- }
-
- @Override
- public void onLost(Network network) {
- mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
- UpstreamNetworkMonitor.EVENT_ON_LOST, 0, network);
- }
- }
-
- /**
* A class to centralize all the network and link properties information
* pertaining to the current and any potential upstream network.
*
@@ -1072,21 +1041,31 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
* TODO: Investigate whether more "upstream-specific" logic/functionality
* could/should be moved here.
*/
- class UpstreamNetworkMonitor {
- static final int EVENT_ON_AVAILABLE = 1;
- static final int EVENT_ON_CAPABILITIES = 2;
- static final int EVENT_ON_LINKPROPERTIES = 3;
- static final int EVENT_ON_LOST = 4;
-
- final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>();
- NetworkCallback mDefaultNetworkCallback;
- NetworkCallback mDunTetheringCallback;
-
- void start() {
+ public class UpstreamNetworkMonitor {
+ public static final int EVENT_ON_AVAILABLE = 1;
+ public static final int EVENT_ON_CAPABILITIES = 2;
+ public static final int EVENT_ON_LINKPROPERTIES = 3;
+ public static final int EVENT_ON_LOST = 4;
+
+ private final Context mContext;
+ private final StateMachine mTarget;
+ private final int mWhat;
+ private final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>();
+ private ConnectivityManager mCM;
+ private NetworkCallback mDefaultNetworkCallback;
+ private NetworkCallback mDunTetheringCallback;
+
+ public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) {
+ mContext = ctx;
+ mTarget = tgt;
+ mWhat = what;
+ }
+
+ public void start() {
stop();
mDefaultNetworkCallback = new UpstreamNetworkCallback();
- getConnectivityManager().registerDefaultNetworkCallback(mDefaultNetworkCallback);
+ cm().registerDefaultNetworkCallback(mDefaultNetworkCallback);
final NetworkRequest dunTetheringRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
@@ -1094,29 +1073,28 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN)
.build();
mDunTetheringCallback = new UpstreamNetworkCallback();
- getConnectivityManager().registerNetworkCallback(
- dunTetheringRequest, mDunTetheringCallback);
+ cm().registerNetworkCallback(dunTetheringRequest, mDunTetheringCallback);
}
- void stop() {
+ public void stop() {
if (mDefaultNetworkCallback != null) {
- getConnectivityManager().unregisterNetworkCallback(mDefaultNetworkCallback);
+ cm().unregisterNetworkCallback(mDefaultNetworkCallback);
mDefaultNetworkCallback = null;
}
if (mDunTetheringCallback != null) {
- getConnectivityManager().unregisterNetworkCallback(mDunTetheringCallback);
+ cm().unregisterNetworkCallback(mDunTetheringCallback);
mDunTetheringCallback = null;
}
mNetworkMap.clear();
}
- NetworkState lookup(Network network) {
+ public NetworkState lookup(Network network) {
return (network != null) ? mNetworkMap.get(network) : null;
}
- NetworkState processCallback(int arg1, Object obj) {
+ public NetworkState processCallback(int arg1, Object obj) {
switch (arg1) {
case EVENT_ON_AVAILABLE: {
final Network network = (Network) obj;
@@ -1128,7 +1106,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
new NetworkState(null, null, null, network, null, null));
}
- final ConnectivityManager cm = getConnectivityManager();
+ final ConnectivityManager cm = cm();
if (mDefaultNetworkCallback != null) {
cm.requestNetworkCapabilities(mDefaultNetworkCallback);
@@ -1199,6 +1177,42 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
return null;
}
}
+
+ // Fetch (and cache) a ConnectivityManager only if and when we need one.
+ private ConnectivityManager cm() {
+ if (mCM == null) {
+ mCM = mContext.getSystemService(ConnectivityManager.class);
+ }
+ return mCM;
+ }
+
+ /**
+ * A NetworkCallback class that relays information of interest to the
+ * tethering master state machine thread for subsequent processing.
+ */
+ private class UpstreamNetworkCallback extends NetworkCallback {
+ @Override
+ public void onAvailable(Network network) {
+ mTarget.sendMessage(mWhat, EVENT_ON_AVAILABLE, 0, network);
+ }
+
+ @Override
+ public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
+ mTarget.sendMessage(mWhat, EVENT_ON_CAPABILITIES, 0,
+ new NetworkState(null, null, newNc, network, null, null));
+ }
+
+ @Override
+ public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
+ mTarget.sendMessage(mWhat, EVENT_ON_LINKPROPERTIES, 0,
+ new NetworkState(null, newLp, null, network, null, null));
+ }
+
+ @Override
+ public void onLost(Network network) {
+ mTarget.sendMessage(mWhat, EVENT_ON_LOST, 0, network);
+ }
+ }
}
// Needed because the canonical source of upstream truth is just the
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 477ecdf60c48..015345c23a1a 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -577,6 +577,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
brightness = mPowerRequest.dozeScreenBrightness;
}
break;
+ case DisplayPowerRequest.POLICY_VR:
+ state = Display.STATE_VR;
+ break;
case DisplayPowerRequest.POLICY_DIM:
case DisplayPowerRequest.POLICY_BRIGHT:
default:
@@ -618,6 +621,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// Animate the screen state change unless already animating.
// The transition may be deferred, so after this point we will use the
// actual state instead of the desired one.
+ final int oldState = mPowerState.getScreenState();
animateScreenStateChange(state, performScreenOffTransition);
state = mPowerState.getScreenState();
@@ -717,9 +721,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
// Animate the screen brightness when the screen is on or dozing.
- // Skip the animation when the screen is off or suspended.
+ // Skip the animation when the screen is off or suspended or transition to/from VR.
if (!mPendingScreenOff) {
- if (state == Display.STATE_ON || state == Display.STATE_DOZE) {
+ boolean wasOrWillBeInVr = (state == Display.STATE_VR || oldState == Display.STATE_VR);
+ if ((state == Display.STATE_ON || state == Display.STATE_DOZE) && !wasOrWillBeInVr) {
animateScreenBrightness(brightness,
slowChange ? mBrightnessRampRateSlow : mBrightnessRampRateFast);
} else {
@@ -903,6 +908,23 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mPowerState.setColorFadeLevel(1.0f);
mPowerState.dismissColorFade();
}
+ } else if (target == Display.STATE_VR) {
+ // Wait for brightness animation to complete beforehand when entering VR
+ // from screen on to prevent a perceptible jump because brightness may operate
+ // differently when the display is configured for dozing.
+ if (mScreenBrightnessRampAnimator.isAnimating()
+ && mPowerState.getScreenState() == Display.STATE_ON) {
+ return;
+ }
+
+ // Set screen state.
+ if (!setScreenState(Display.STATE_VR)) {
+ return; // screen on blocked
+ }
+
+ // Dismiss the black surface without fanfare.
+ mPowerState.setColorFadeLevel(1.0f);
+ mPowerState.dismissColorFade();
} else if (target == Display.STATE_DOZE) {
// Want screen dozing.
// Wait for brightness animation to complete beforehand when entering doze
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 61c2eacaa8f9..867322578a66 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -471,6 +471,16 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
}
+ // If the state change was from or to VR, then we need to tell the light
+ // so that it can apply appropriate VR brightness settings. This should
+ // happen prior to changing the brightness but also if there is no
+ // brightness change at all.
+ if ((state == Display.STATE_VR || currentState == Display.STATE_VR) &&
+ currentState != state) {
+ setVrMode(state == Display.STATE_VR);
+ }
+
+
// Apply brightness changes given that we are in a non-suspended state.
if (brightnessChanged) {
setDisplayBrightness(brightness);
@@ -482,6 +492,15 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
}
+ private void setVrMode(boolean isVrEnabled) {
+ if (DEBUG) {
+ Slog.d(TAG, "setVrMode("
+ + "id=" + displayId
+ + ", state=" + Display.stateToString(state) + ")");
+ }
+ mBacklight.setVrMode(isVrEnabled);
+ }
+
private void setDisplayState(int state) {
if (DEBUG) {
Slog.d(TAG, "setDisplayState("
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index b0f67a81db28..2514012d0d16 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -1142,6 +1142,12 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
mHandler.obtainMessage(MSG_USER_SWITCHING, newUserId, 0 /* unused */)
.sendToTarget();
}
+
+ @Override
+ public void onForegroundProfileSwitch(int newProfileId) throws RemoteException {
+ mHandler.obtainMessage(MSG_USER_SWITCHING, newProfileId, 0 /* unused */)
+ .sendToTarget();
+ }
}, TAG);
} catch (RemoteException e) {
Slog.w(TAG, "Failed to listen for user switching event" ,e);
diff --git a/services/core/java/com/android/server/lights/Light.java b/services/core/java/com/android/server/lights/Light.java
index 0bab86b67e82..b5ec603f5f70 100644
--- a/services/core/java/com/android/server/lights/Light.java
+++ b/services/core/java/com/android/server/lights/Light.java
@@ -46,4 +46,5 @@ public abstract class Light {
public abstract void pulse();
public abstract void pulse(int color, int onMS);
public abstract void turnOff();
+ public abstract void setVrMode(boolean enabled);
}
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index bba0a50e7af4..e07156ece1b9 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -1,5 +1,4 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
+/* * Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,18 +16,13 @@
package com.android.server.lights;
import com.android.server.SystemService;
-import com.android.server.vr.VrManagerService;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
-import android.os.RemoteException;
import android.os.Trace;
-import android.os.UserHandle;
import android.provider.Settings;
-import android.service.vr.IVrManager;
-import android.service.vr.IVrStateCallbacks;
import android.util.Slog;
public class LightsService extends SystemService {
@@ -36,7 +30,6 @@ public class LightsService extends SystemService {
static final boolean DEBUG = false;
final LightImpl mLights[] = new LightImpl[LightsManager.LIGHT_ID_COUNT];
- private boolean mVrModeEnabled;
private final class LightImpl extends Light {
@@ -52,6 +45,13 @@ public class LightsService extends SystemService {
@Override
public void setBrightness(int brightness, int brightnessMode) {
synchronized (this) {
+ // LOW_PERSISTENCE cannot be manually set
+ if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
+ Slog.w(TAG, "setBrightness with LOW_PERSISTENCE unexpected #" + mId +
+ ": brightness=0x" + Integer.toHexString(brightness));
+ return;
+ }
+
int color = brightness & 0x000000ff;
color = 0xff000000 | (color << 16) | (color << 8) | color;
setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
@@ -80,11 +80,9 @@ public class LightsService extends SystemService {
@Override
public void pulse(int color, int onMS) {
synchronized (this) {
- if (mBrightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
- return;
- }
if (mColor == 0 && !mFlashing) {
- setLightLocked(color, LIGHT_FLASH_HARDWARE, onMS, 1000, BRIGHTNESS_MODE_USER);
+ setLightLocked(color, LIGHT_FLASH_HARDWARE, onMS, 1000,
+ BRIGHTNESS_MODE_USER);
mColor = 0;
mH.sendMessageDelayed(Message.obtain(mH, 1, this), onMS);
}
@@ -98,17 +96,23 @@ public class LightsService extends SystemService {
}
}
- void enableLowPersistence() {
- synchronized(this) {
- setLightLocked(0, LIGHT_FLASH_NONE, 0, 0, BRIGHTNESS_MODE_LOW_PERSISTENCE);
- mLocked = true;
- }
- }
-
- void disableLowPersistence() {
- synchronized(this) {
- mLocked = false;
- setLightLocked(mLastColor, LIGHT_FLASH_NONE, 0, 0, mLastBrightnessMode);
+ @Override
+ public void setVrMode(boolean enabled) {
+ synchronized (this) {
+ if (mVrModeEnabled != enabled) {
+ mVrModeEnabled = enabled;
+
+ mUseLowPersistenceForVR =
+ (getVrDisplayMode() == Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE);
+ if (shouldBeInLowPersistenceMode()) {
+ mLastBrightnessMode = mBrightnessMode;
+ }
+
+ // NOTE: We do not trigger a call to setLightLocked here. We do not know the
+ // current brightness or other values when leaving VR so we avoid any incorrect
+ // jumps. The code that calls this method will immediately issue a brightness
+ // update which is when the change will occur.
+ }
}
}
@@ -119,7 +123,13 @@ public class LightsService extends SystemService {
}
private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) {
- if (!mLocked && (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS ||
+ if (shouldBeInLowPersistenceMode()) {
+ brightnessMode = BRIGHTNESS_MODE_LOW_PERSISTENCE;
+ } else if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
+ brightnessMode = mLastBrightnessMode;
+ }
+
+ if ((color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS ||
mBrightnessMode != brightnessMode)) {
if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#"
+ Integer.toHexString(color) + ": brightnessMode=" + brightnessMode);
@@ -128,7 +138,6 @@ public class LightsService extends SystemService {
mMode = mode;
mOnMS = onMS;
mOffMS = offMS;
- mLastBrightnessMode = mBrightnessMode;
mBrightnessMode = brightnessMode;
Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLight(" + mId + ", 0x"
+ Integer.toHexString(color) + ")");
@@ -140,6 +149,10 @@ public class LightsService extends SystemService {
}
}
+ private boolean shouldBeInLowPersistenceMode() {
+ return mVrModeEnabled && mUseLowPersistenceForVR;
+ }
+
private int mId;
private int mColor;
private int mMode;
@@ -149,7 +162,8 @@ public class LightsService extends SystemService {
private int mBrightnessMode;
private int mLastBrightnessMode;
private int mLastColor;
- private boolean mLocked;
+ private boolean mVrModeEnabled;
+ private boolean mUseLowPersistenceForVR;
}
public LightsService(Context context) {
@@ -167,17 +181,6 @@ public class LightsService extends SystemService {
@Override
public void onBootPhase(int phase) {
- if (phase == PHASE_SYSTEM_SERVICES_READY) {
- IVrManager vrManager =
- (IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE);
- if (vrManager != null) {
- try {
- vrManager.registerListener(mVrStateCallbacks);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to register VR mode state listener: " + e);
- }
- }
- }
}
private int getVrDisplayMode() {
@@ -188,30 +191,6 @@ public class LightsService extends SystemService {
currentUser);
}
- private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
- @Override
- public void onVrStateChanged(boolean enabled) throws RemoteException {
- LightImpl l = mLights[LightsManager.LIGHT_ID_BACKLIGHT];
- int vrDisplayMode = getVrDisplayMode();
-
- // User leaves VR mode before altering display settings.
- if (enabled && vrDisplayMode == Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE) {
- if (!mVrModeEnabled) {
- if (DEBUG)
- Slog.v(TAG, "VR mode enabled, setting brightness to low persistence");
- l.enableLowPersistence();
- mVrModeEnabled = true;
- }
- } else {
- if (mVrModeEnabled) {
- if (DEBUG) Slog.v(TAG, "VR mode disabled, resetting brightnes");
- l.disableLowPersistence();
- mVrModeEnabled = false;
- }
- }
- }
- };
-
private final LightsManager mService = new LightsManager() {
@Override
public Light getLight(int id) {
diff --git a/services/core/java/com/android/server/location/ContextHubService.java b/services/core/java/com/android/server/location/ContextHubService.java
index 12627372a7a8..a4c0fa85f2f7 100644
--- a/services/core/java/com/android/server/location/ContextHubService.java
+++ b/services/core/java/com/android/server/location/ContextHubService.java
@@ -29,9 +29,6 @@ import android.hardware.location.NanoApp;
import android.hardware.location.NanoAppInstanceInfo;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.service.vr.IVrManager;
-import android.service.vr.IVrStateCallbacks;
import android.util.Log;
import java.io.FileDescriptor;
@@ -51,7 +48,6 @@ public class ContextHubService extends IContextHubService.Stub {
private static final String ENFORCE_HW_PERMISSION_MESSAGE = "Permission '"
+ HARDWARE_PERMISSION + "' not granted to access ContextHub Hardware";
-
public static final int ANY_HUB = -1;
public static final int MSG_LOAD_NANO_APP = 3;
public static final int MSG_UNLOAD_NANO_APP = 4;
@@ -73,8 +69,6 @@ public class ContextHubService extends IContextHubService.Stub {
private static final int OS_APP_INSTANCE = -1;
- private static final long APP_ID_ACTIVITY_RECOGNITION = 0x476f6f676c001000L;
-
private final Context mContext;
private final ConcurrentHashMap<Integer, NanoAppInstanceInfo> mNanoAppHash =
new ConcurrentHashMap<>();
@@ -85,18 +79,6 @@ public class ContextHubService extends IContextHubService.Stub {
private native int nativeSendMessage(int[] header, byte[] data);
private native ContextHubInfo[] nativeInitialize();
- private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
- @Override
- public void onVrStateChanged(boolean enabled) {
- for (NanoAppInstanceInfo app : mNanoAppHash.values()) {
- if (app.getAppId() == APP_ID_ACTIVITY_RECOGNITION) {
- sendVrStateChangeMessageToApp(app, enabled);
- break;
- }
- }
- }
- };
-
public ContextHubService(Context context) {
mContext = context;
mContextHubInfo = nativeInitialize();
@@ -105,18 +87,6 @@ public class ContextHubService extends IContextHubService.Stub {
Log.d(TAG, "ContextHub[" + i + "] id: " + mContextHubInfo[i].getId()
+ ", name: " + mContextHubInfo[i].getName());
}
-
- if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_VR_MODE)) {
- IVrManager vrManager =
- IVrManager.Stub.asInterface(ServiceManager.getService("vrmanager"));
- if (vrManager != null) {
- try {
- vrManager.registerListener(mVrStateCallbacks);
- } catch (RemoteException e) {
- Log.e(TAG, "VR state listener registration failed", e);
- }
- }
- }
}
@Override
@@ -394,19 +364,4 @@ public class ContextHubService extends IContextHubService.Stub {
return 0;
}
-
- private void sendVrStateChangeMessageToApp(NanoAppInstanceInfo app, boolean vrModeEnabled) {
- int[] msgHeader = new int[MSG_HEADER_SIZE];
- msgHeader[HEADER_FIELD_MSG_TYPE] = 0;
- msgHeader[HEADER_FIELD_MSG_VERSION] = 0;
- msgHeader[HEADER_FIELD_HUB_HANDLE] = ANY_HUB;
- msgHeader[HEADER_FIELD_APP_INSTANCE] = app.getHandle();
-
- byte[] data = new byte[1];
- data[0] = (byte) ((vrModeEnabled) ? 1 : 0);
- int ret = nativeSendMessage(msgHeader, data);
- if (ret != 0) {
- Log.e(TAG, "Couldn't send VR state change notification (" + ret + ")!");
- }
- }
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index dffe86ab47b4..ded8a1bfba49 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -55,7 +55,6 @@ import android.app.AppOpsManager;
import android.app.AutomaticZenRule;
import android.app.backup.BackupManager;
import android.app.IActivityManager;
-import android.app.IOnNotificationChannelCreatedListener;
import android.app.INotificationManager;
import android.app.ITransientNotification;
import android.app.Notification;
@@ -944,22 +943,16 @@ public class NotificationManagerService extends SystemService {
mPackageManager = packageManager;
}
- // TODO: This probably should not be mocked, it's an implementation detail.
+ // TODO: Tests should call onStart instead once the methods above are removed.
@VisibleForTesting
- void setRankingHelper(RankingHelper rankingHelper) {
- mRankingHelper = rankingHelper;
- }
-
- @Override
- public void onStart() {
+ void init(IPackageManager packageManager, LightsManager lightsManager) {
Resources resources = getContext().getResources();
-
mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(),
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE);
mAm = ActivityManager.getService();
- mPackageManager = AppGlobals.getPackageManager();
+ mPackageManager = packageManager;
mAppOps = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
mVibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
mAppUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
@@ -1065,9 +1058,8 @@ public class NotificationManagerService extends SystemService {
mStatusBar.setNotificationDelegate(mNotificationDelegate);
}
- final LightsManager lights = getLocalService(LightsManager.class);
- mNotificationLight = lights.getLight(LightsManager.LIGHT_ID_NOTIFICATIONS);
- mAttentionLight = lights.getLight(LightsManager.LIGHT_ID_ATTENTION);
+ mNotificationLight = lightsManager.getLight(LightsManager.LIGHT_ID_NOTIFICATIONS);
+ mAttentionLight = lightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
mDefaultNotificationColor = resources.getColor(
R.color.config_defaultNotificationColor);
@@ -1134,7 +1126,11 @@ public class NotificationManagerService extends SystemService {
mArchive = new Archive(resources.getInteger(
R.integer.config_notificationServiceArchiveSize));
+ }
+ @Override
+ public void onStart() {
+ init(AppGlobals.getPackageManager(), getLocalService(LightsManager.class));
publishBinderService(Context.NOTIFICATION_SERVICE, mService);
publishLocalService(NotificationManagerInternal.class, mInternalService);
}
@@ -1514,13 +1510,18 @@ public class NotificationManagerService extends SystemService {
}
@Override
- public void createNotificationChannel(String pkg, NotificationChannel channel,
- IOnNotificationChannelCreatedListener listener) throws RemoteException {
+ public void createNotificationChannels(String pkg,
+ ParceledListSlice channelsList) throws RemoteException {
checkCallerIsSystemOrSameApp(pkg);
- mRankingHelper.createNotificationChannel(pkg, Binder.getCallingUid(), channel,
- true /* fromTargetApp */);
+ List<NotificationChannel> channels = channelsList.getList();
+ final int channelsSize = channels.size();
+ for (int i = 0; i < channelsSize; i++) {
+ final NotificationChannel channel = channels.get(i);
+ Preconditions.checkNotNull(channel, "channel in list is null");
+ mRankingHelper.createNotificationChannel(pkg, Binder.getCallingUid(), channel,
+ true /* fromTargetApp */);
+ }
savePolicyFile();
- listener.onNotificationChannelCreated(channel);
}
@Override
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 598ac2edf5b1..3fcce3c05c97 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -434,7 +434,8 @@ public class RankingHelper implements RankingConfig {
}
if (r.channels.containsKey(channel.getId()) || channel.getName().equals(
mContext.getString(R.string.default_notification_channel_label))) {
- throw new IllegalArgumentException("Channel already exists");
+ // Channel already exists, no-op.
+ return;
}
if (channel.getImportance() < NotificationManager.IMPORTANCE_NONE
|| channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 2bf5ef10ec89..601a2194e8f3 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -42,12 +42,18 @@ import java.util.concurrent.TimeUnit;
* {@hide}
*/
public class BackgroundDexOptService extends JobService {
- static final String TAG = "BackgroundDexOptService";
+ private static final String TAG = "BackgroundDexOptService";
- static final long RETRY_LATENCY = 4 * AlarmManager.INTERVAL_HOUR;
+ private static final boolean DEBUG = false;
- static final int JOB_IDLE_OPTIMIZE = 800;
- static final int JOB_POST_BOOT_UPDATE = 801;
+ private static final long RETRY_LATENCY = 4 * AlarmManager.INTERVAL_HOUR;
+
+ private static final int JOB_IDLE_OPTIMIZE = 800;
+ private static final int JOB_POST_BOOT_UPDATE = 801;
+
+ private static final long IDLE_OPTIMIZATION_PERIOD = DEBUG
+ ? TimeUnit.MINUTES.toMillis(1)
+ : TimeUnit.DAYS.toMillis(1);
private static ComponentName sDexoptServiceName = new ComponentName(
"android",
@@ -86,7 +92,7 @@ public class BackgroundDexOptService extends JobService {
js.schedule(new JobInfo.Builder(JOB_IDLE_OPTIMIZE, sDexoptServiceName)
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
- .setPeriodic(TimeUnit.DAYS.toMillis(1))
+ .setPeriodic(IDLE_OPTIMIZATION_PERIOD)
.build());
if (DEBUG_DEXOPT) {
@@ -208,6 +214,7 @@ public class BackgroundDexOptService extends JobService {
private void idleOptimization(JobParameters jobParams, PackageManagerService pm,
ArraySet<String> pkgs) {
+ Log.i(TAG, "Performing idle optimizations");
// If post-boot update is still running, request that it exits early.
mExitPostBootUpdate.set(true);
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 605fa5d8d0c3..98249dd12634 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -199,16 +199,44 @@ public class Installer extends SystemService {
}
}
- public void getAppSize(String uuid, String packageName, int userId, int flags, int appId,
- long ceDataInode, String codePath, String externalUuid, PackageStats stats)
+ public void getAppSize(String uuid, String[] packageNames, int userId, int flags, int appId,
+ long[] ceDataInodes, String[] codePaths, PackageStats stats)
throws InstallerException {
if (!checkBeforeRemote()) return;
try {
- final long[] res = mInstalld.getAppSize(uuid, packageName, userId, flags, appId,
- ceDataInode, codePath, externalUuid);
+ final long[] res = mInstalld.getAppSize(uuid, packageNames, userId, flags,
+ appId, ceDataInodes, codePaths);
stats.codeSize += res[0];
stats.dataSize += res[1];
stats.cacheSize += res[2];
+ stats.externalCodeSize += res[3];
+ stats.externalDataSize += res[4];
+ stats.externalCacheSize += res[5];
+ } catch (Exception e) {
+ throw InstallerException.from(e);
+ }
+ }
+
+ public void getUserSize(String uuid, int userId, int flags, int[] appIds, PackageStats stats)
+ throws InstallerException {
+ if (!checkBeforeRemote()) return;
+ try {
+ final long[] res = mInstalld.getUserSize(uuid, userId, flags, appIds);
+ stats.codeSize += res[0];
+ stats.dataSize += res[1];
+ stats.cacheSize += res[2];
+ stats.externalCodeSize += res[3];
+ stats.externalDataSize += res[4];
+ stats.externalCacheSize += res[5];
+ } catch (Exception e) {
+ throw InstallerException.from(e);
+ }
+ }
+
+ public long[] getExternalSize(String uuid, int userId, int flags) throws InstallerException {
+ if (!checkBeforeRemote()) return new long[4];
+ try {
+ return mInstalld.getExternalSize(uuid, userId, flags);
} catch (Exception e) {
throw InstallerException.from(e);
}
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 2e0199b0b863..8c4a95ce1cdf 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -217,26 +217,11 @@ class PackageDexOptimizer {
dexoptNeeded);
}
- final String dexoptType;
- String oatDir = null;
- boolean isOdexLocation = (dexoptNeeded < 0);
- switch (Math.abs(dexoptNeeded)) {
- case DexFile.NO_DEXOPT_NEEDED:
- continue;
- case DexFile.DEX2OAT_FROM_SCRATCH:
- case DexFile.DEX2OAT_FOR_BOOT_IMAGE:
- case DexFile.DEX2OAT_FOR_FILTER:
- case DexFile.DEX2OAT_FOR_RELOCATION:
- dexoptType = "dex2oat";
- oatDir = createOatDirIfSupported(pkg, dexCodeInstructionSet);
- break;
- case DexFile.PATCHOAT_FOR_RELOCATION:
- dexoptType = "patchoat";
- break;
- default:
- throw new IllegalStateException("Invalid dexopt:" + dexoptNeeded);
+ if (dexoptNeeded == DexFile.NO_DEXOPT_NEEDED) {
+ continue;
}
+ String oatDir = createOatDirIfSupported(pkg, dexCodeInstructionSet);
String sharedLibrariesPath = null;
if (sharedLibraries != null && sharedLibraries.length != 0) {
StringBuilder sb = new StringBuilder();
@@ -248,7 +233,7 @@ class PackageDexOptimizer {
}
sharedLibrariesPath = sb.toString();
}
- Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg="
+ Log.i(TAG, "Running dexopt on: " + path + " pkg="
+ pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet
+ " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable
+ " target-filter=" + targetCompilerFilter + " oatDir=" + oatDir
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 5bb8c05c1be5..76ae57e0e15a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -17441,11 +17441,6 @@ public class PackageManagerService extends IPackageManager.Stub {
mHandler.sendMessage(msg);
}
- private boolean equals(PackageStats a, PackageStats b) {
- return (a.codeSize == b.codeSize) && (a.dataSize == b.dataSize)
- && (a.cacheSize == b.cacheSize);
- }
-
private boolean getPackageSizeInfoLI(String packageName, int userId, PackageStats stats) {
final PackageSetting ps;
synchronized (mPackages) {
@@ -17456,44 +17451,21 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
- final long ceDataInode = ps.getCeDataInode(userId);
- final PackageStats quotaStats = new PackageStats(stats.packageName, stats.userHandle);
+ final String[] packageNames = { packageName };
+ final long[] ceDataInodes = { ps.getCeDataInode(userId) };
+ final String[] codePaths = { ps.codePathString };
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
- final String externalUuid = storage.getPrimaryStorageUuid();
try {
- final long start = SystemClock.elapsedRealtimeNanos();
- mInstaller.getAppSize(ps.volumeUuid, packageName, userId, 0,
- ps.appId, ceDataInode, ps.codePathString, externalUuid, stats);
- final long stopManual = SystemClock.elapsedRealtimeNanos();
- if (ENABLE_QUOTA) {
- mInstaller.getAppSize(ps.volumeUuid, packageName, userId, Installer.FLAG_USE_QUOTA,
- ps.appId, ceDataInode, ps.codePathString, externalUuid, quotaStats);
- }
- final long stopQuota = SystemClock.elapsedRealtimeNanos();
+ mInstaller.getAppSize(ps.volumeUuid, packageNames, userId, 0,
+ ps.appId, ceDataInodes, codePaths, stats);
// For now, ignore code size of packages on system partition
if (isSystemApp(ps) && !isUpdatedSystemApp(ps)) {
stats.codeSize = 0;
- quotaStats.codeSize = 0;
- }
-
- if (ENABLE_QUOTA && Build.IS_ENG && !ps.isSharedUser()) {
- if (!equals(stats, quotaStats)) {
- Log.w(TAG, "Found discrepancy between statistics:");
- Log.w(TAG, "Manual: " + stats);
- Log.w(TAG, "Quota: " + quotaStats);
- }
- final long manualTime = stopManual - start;
- final long quotaTime = stopQuota - stopManual;
- EventLogTags.writePmPackageStats(manualTime, quotaTime,
- stats.dataSize, quotaStats.dataSize,
- stats.cacheSize, quotaStats.cacheSize);
}
// External clients expect these to be tracked separately
stats.dataSize -= stats.cacheSize;
- quotaStats.dataSize -= quotaStats.cacheSize;
} catch (InstallerException e) {
Slog.w(TAG, String.valueOf(e));
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index ddbc5fa59e16..3085c9cc9d29 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -361,6 +361,11 @@ class ShortcutPackage extends ShortcutPackageItem {
}
oldShortcut.setTimestamp(mShortcutUser.mService.injectCurrentTimeMillis());
+ // See ShortcutRequestPinProcessor.directPinShortcut().
+ if (mShortcutUser.mService.isDummyMainActivity(oldShortcut.getActivity())) {
+ oldShortcut.setActivity(null);
+ }
+
return oldShortcut;
} else {
deleteShortcutInner(shortcutId);
@@ -1515,6 +1520,8 @@ class ShortcutPackage extends ShortcutPackageItem {
boolean failed = false;
+ final ShortcutService s = mShortcutUser.mService;
+
final ArrayMap<ComponentName, ArrayList<ShortcutInfo>> all =
sortShortcutsToActivities();
@@ -1554,10 +1561,10 @@ class ShortcutPackage extends ShortcutPackageItem {
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is both dynamic and manifest at the same time.");
}
- if (si.getActivity() == null) {
+ if (si.getActivity() == null && !si.isFloating()) {
failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
- + " has null activity.");
+ + " has null activity, but not floating.");
}
if ((si.isDynamic() || si.isManifestShortcut()) && !si.isEnabled()) {
failed = true;
@@ -1579,6 +1586,11 @@ class ShortcutPackage extends ShortcutPackageItem {
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has both resource and bitmap icons");
}
+ if (s.isDummyMainActivity(si.getActivity())) {
+ failed = true;
+ Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ + " has a dummy target activity");
+ }
}
if (failed) {
diff --git a/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java b/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
index e815f0ae18fd..c8ddf0a711bf 100644
--- a/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
+++ b/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
@@ -16,7 +16,6 @@
package com.android.server.pm;
import android.annotation.Nullable;
-import android.app.PendingIntent;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.content.Intent;
@@ -209,7 +208,7 @@ class ShortcutRequestPinProcessor {
final boolean existsAlready = existing != null;
if (DEBUG) {
- Slog.d(TAG, "requestPinnedShortcut package=" + inShortcut.getPackage()
+ Slog.d(TAG, "requestPinnedShortcut: package=" + inShortcut.getPackage()
+ " existsAlready=" + existsAlready
+ " shortcut=" + inShortcut.toInsecureString());
}
@@ -237,6 +236,14 @@ class ShortcutRequestPinProcessor {
// FLAG_PINNED is still set, if it's pinned by other launchers.
shortcutForLauncher.clearFlags(ShortcutInfo.FLAG_PINNED);
} else {
+ // If the shortcut has no default activity, try to set the main activity.
+ // But in the request-pin case, it's optional, so it's okay even if the caller
+ // has no default activity.
+ if (inShortcut.getActivity() == null) {
+ inShortcut.setActivity(mService.injectGetDefaultMainActivity(
+ inShortcut.getPackage(), inShortcut.getUserId()));
+ }
+
// It doesn't exist, so it must have all mandatory fields.
mService.validateShortcutForPinRequest(inShortcut);
@@ -244,12 +251,15 @@ class ShortcutRequestPinProcessor {
inShortcut.resolveResourceStrings(mService.injectGetResourcesForApplicationAsUser(
inShortcut.getPackage(), inShortcut.getUserId()));
if (DEBUG) {
- Slog.d(TAG, "resolved shortcut=" + inShortcut.toInsecureString());
+ Slog.d(TAG, "Resolved shortcut=" + inShortcut.toInsecureString());
}
// We should strip out the intent, but should preserve the icon.
shortcutForLauncher = inShortcut.clone(
ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER_APPROVAL);
}
+ if (DEBUG) {
+ Slog.d(TAG, "Sending to launcher=" + shortcutForLauncher.toInsecureString());
+ }
// Create a request object.
final PinShortcutRequestInner inner =
@@ -360,7 +370,9 @@ class ShortcutRequestPinProcessor {
if (DEBUG) {
Slog.d(TAG, "Temporarily adding " + shortcutId + " as dynamic");
}
- // Add as a dynamic shortcut.
+ // Add as a dynamic shortcut. In order for a shortcut to be dynamic, it must
+ // have a target activity, so we set a dummy here. It's later removed
+ // in deleteDynamicWithId().
if (original.getActivity() == null) {
original.setActivity(mService.getDummyMainActivity(appPackageName));
}
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index c02ce6e0daeb..a890526c0f91 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -1604,7 +1604,7 @@ public class ShortcutService extends IShortcutService.Stub {
private void fixUpIncomingShortcutInfo(@NonNull ShortcutInfo shortcut, boolean forUpdate,
boolean forPinRequest) {
Preconditions.checkNotNull(shortcut, "Null shortcut detected");
- if (!forPinRequest && shortcut.getActivity() != null) {
+ if (shortcut.getActivity() != null) {
Preconditions.checkState(
shortcut.getPackage().equals(shortcut.getActivity().getPackageName()),
"Cannot publish shortcut: activity " + shortcut.getActivity() + " does not"
@@ -1618,10 +1618,8 @@ public class ShortcutService extends IShortcutService.Stub {
if (!forUpdate) {
shortcut.enforceMandatoryFields(/* forPinned= */ forPinRequest);
if (!forPinRequest) {
- Preconditions.checkArgument(
- injectIsMainActivity(shortcut.getActivity(), shortcut.getUserId()),
- "Cannot publish shortcut: " + shortcut.getActivity()
- + " is not main activity");
+ Preconditions.checkState(shortcut.getActivity() != null,
+ "Cannot publish shortcut: target activity is not set");
}
}
if (shortcut.getIcon() != null) {
@@ -1870,9 +1868,7 @@ public class ShortcutService extends IShortcutService.Stub {
throwIfUserLockedL(userId);
Preconditions.checkState(isUidForegroundLocked(injectBinderCallingUid()),
- "Calling application must have a foreground activity or a foreground service");
-
- // TODO Cancel all pending requests from the caller.
+ "Calling application must have a foreground activity or a foreground service");
// Send request to the launcher, if supported.
ret = mShortcutRequestPinProcessor.requestPinItemLocked(shortcut, appWidget, userId,
@@ -3193,6 +3189,10 @@ public class ShortcutService extends IShortcutService.Stub {
return new ComponentName(packageName, DUMMY_MAIN_ACTIVITY);
}
+ boolean isDummyMainActivity(@Nullable ComponentName name) {
+ return name != null && DUMMY_MAIN_ACTIVITY.equals(name.getClassName());
+ }
+
/**
* Return all the enabled, exported and main activities from a package.
*/
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 05228ec50e5d..9b47beba232e 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -26,6 +26,7 @@ import android.annotation.UserIdInt;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
+import android.app.ActivityManagerNative;
import android.app.AppGlobals;
import android.app.IActivityManager;
import android.app.IStopUserCallback;
@@ -857,6 +858,25 @@ public class UserManagerService extends IUserManager.Stub {
}
}
+ /**
+ * Evicts a user's CE key by stopping and restarting the user.
+ *
+ * The key is evicted automatically by the user controller when the user has stopped.
+ */
+ @Override
+ public void evictCredentialEncryptionKey(@UserIdInt int userId) {
+ checkManageUsersPermission("evict CE key");
+ final IActivityManager am = ActivityManagerNative.getDefault();
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ am.restartUserInBackground(userId);
+ } catch (RemoteException re) {
+ throw re.rethrowAsRuntimeException();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
@Override
public UserInfo getUserInfo(int userId) {
checkManageOrCreateUsersPermission("query user");
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index fa1d991fa39a..0a312f0ad7ee 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -251,9 +251,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final boolean DEBUG_INPUT = false;
static final boolean DEBUG_KEYGUARD = false;
static final boolean DEBUG_LAYOUT = false;
- static final boolean DEBUG_STARTING_WINDOW = false;
+ static final boolean DEBUG_SPLASH_SCREEN = false;
static final boolean DEBUG_WAKEUP = false;
- static final boolean SHOW_STARTING_ANIMATIONS = true;
+ static final boolean SHOW_SPLASH_SCREENS = true;
// Whether to allow dock apps with METADATA_DOCK_HOME to temporarily take over the Home key.
// No longer recommended for desk docks;
@@ -2794,10 +2794,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
@Override
- public View addStartingWindow(IBinder appToken, String packageName, int theme,
- CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes,
- int icon, int logo, int windowFlags, Configuration overrideConfig) {
- if (!SHOW_STARTING_ANIMATIONS) {
+ public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme,
+ CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
+ int logo, int windowFlags, Configuration overrideConfig) {
+ if (!SHOW_SPLASH_SCREENS) {
return null;
}
if (packageName == null) {
@@ -2809,7 +2809,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
try {
Context context = mContext;
- if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "addStartingWindow " + packageName
+ if (DEBUG_SPLASH_SCREEN) Slog.d(TAG, "addSplashScreen " + packageName
+ ": nonLocalizedLabel=" + nonLocalizedLabel + " theme="
+ Integer.toHexString(theme));
if (theme != context.getThemeResId() || labelRes != 0) {
@@ -2822,8 +2822,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
if (overrideConfig != null && !overrideConfig.equals(EMPTY)) {
- if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "addStartingWindow: creating context based"
- + " on overrideConfig" + overrideConfig + " for starting window");
+ if (DEBUG_SPLASH_SCREEN) Slog.d(TAG, "addSplashScreen: creating context based"
+ + " on overrideConfig" + overrideConfig + " for splash screen");
final Context overrideContext = context.createConfigurationContext(overrideConfig);
overrideContext.setTheme(theme);
final TypedArray typedArray = overrideContext.obtainStyledAttributes(
@@ -2833,7 +2833,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// We want to use the windowBackground for the override context if it is
// available, otherwise we use the default one to make sure a themed starting
// window is displayed for the app.
- if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "addStartingWindow: apply overrideConfig"
+ if (DEBUG_SPLASH_SCREEN) Slog.d(TAG, "addSplashScreen: apply overrideConfig"
+ overrideConfig + " to starting window resId=" + resId);
context = overrideContext;
}
@@ -2895,19 +2895,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
}
- params.setTitle("Starting " + packageName);
+ params.setTitle("Splash Screen " + packageName);
wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
view = win.getDecorView();
- if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "Adding starting window for "
+ if (DEBUG_SPLASH_SCREEN) Slog.d(TAG, "Adding splash screen window for "
+ packageName + " / " + appToken + ": " + (view.getParent() != null ? view : null));
wm.addView(view, params);
// Only return the view if it was successfully added to the
// window manager... which we can tell by it having a parent.
- return view.getParent() != null ? view : null;
+ return view.getParent() != null ? new SplashScreenSurface(view) : null;
} catch (WindowManager.BadTokenException e) {
// ignore
Log.w(TAG, appToken + " already running, starting window not displayed. " +
@@ -2929,13 +2929,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
@Override
- public void removeStartingWindow(IBinder appToken, View window) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Removing starting window for " + appToken + ": "
- + window + " Callers=" + Debug.getCallers(4));
+ public void removeSplashScreen(IBinder appToken, StartingSurface surface) {
+ if (DEBUG_SPLASH_SCREEN) Slog.v(TAG, "Removing splash screen window for " + appToken + ": "
+ + surface + " Callers=" + Debug.getCallers(4));
- if (window != null) {
+ if (surface != null) {
WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
- wm.removeView(window);
+ wm.removeView(((SplashScreenSurface) surface).view);
}
}
diff --git a/services/core/java/com/android/server/policy/SplashScreenSurface.java b/services/core/java/com/android/server/policy/SplashScreenSurface.java
new file mode 100644
index 000000000000..d4212915c0a6
--- /dev/null
+++ b/services/core/java/com/android/server/policy/SplashScreenSurface.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.policy;
+
+import android.view.View;
+import android.view.WindowManagerPolicy;
+import android.view.WindowManagerPolicy.StartingSurface;
+
+import com.android.internal.policy.DecorView;
+import com.android.internal.policy.PhoneWindow;
+
+/**
+ * Holds the contents of a splash screen starting window, i.e. the {@link DecorView} of a
+ * {@link PhoneWindow}. This is just a wrapper such that we can return it from
+ * {@link WindowManagerPolicy#addSplashScreen}.
+ */
+class SplashScreenSurface implements StartingSurface {
+
+ final View view;
+
+ SplashScreenSurface(View view) {
+ this.view = view;
+ }
+}
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index f2ccac5197aa..8aefebc9f58d 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -136,6 +136,8 @@ public final class PowerManagerService extends SystemService
private static final int DIRTY_SCREEN_BRIGHTNESS_BOOST = 1 << 11;
// Dirty bit: sQuiescent changed
private static final int DIRTY_QUIESCENT = 1 << 12;
+ // Dirty bit: VR Mode enabled changed
+ private static final int DIRTY_VR_MODE_CHANGED = 1 << 13;
// Summarizes the state of all active wakelocks.
private static final int WAKE_LOCK_CPU = 1 << 0;
@@ -413,11 +415,15 @@ public final class PowerManagerService extends SystemService
private int mScreenBrightnessSettingMinimum;
private int mScreenBrightnessSettingMaximum;
private int mScreenBrightnessSettingDefault;
+ private int mScreenBrightnessForVrSettingDefault;
// The screen brightness setting, from 0 to 255.
// Use -1 if no value has been set.
private int mScreenBrightnessSetting;
+ // The screen brightness setting, from 0 to 255, to be used while in VR Mode.
+ private int mScreenBrightnessForVrSetting;
+
// The screen auto-brightness adjustment setting, from -1 to 1.
// Use 0 if there is no adjustment.
private float mScreenAutoBrightnessAdjustmentSetting;
@@ -511,6 +517,9 @@ public final class PowerManagerService extends SystemService
// True if brightness should be affected by twilight.
private boolean mBrightnessUseTwilight;
+ // True if we are currently in VR Mode.
+ private boolean mIsVrModeEnabled;
+
private native void nativeInit();
private static native void nativeAcquireSuspendBlocker(String name);
@@ -594,6 +603,7 @@ public final class PowerManagerService extends SystemService
mScreenBrightnessSettingMinimum = pm.getMinimumScreenBrightnessSetting();
mScreenBrightnessSettingMaximum = pm.getMaximumScreenBrightnessSetting();
mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting();
+ mScreenBrightnessForVrSettingDefault = pm.getDefaultScreenBrightnessForVrSetting();
SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());
@@ -640,6 +650,9 @@ public final class PowerManagerService extends SystemService
Settings.System.SCREEN_BRIGHTNESS),
false, mSettingsObserver, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.SCREEN_BRIGHTNESS_FOR_VR),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.SCREEN_BRIGHTNESS_MODE),
false, mSettingsObserver, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.System.getUriFor(
@@ -773,11 +786,17 @@ public final class PowerManagerService extends SystemService
}
}
- final int oldScreenBrightnessSetting = mScreenBrightnessSetting;
+ final int oldScreenBrightnessSetting = getCurrentBrightnessSettingLocked();
+
+ mScreenBrightnessForVrSetting = Settings.System.getIntForUser(resolver,
+ Settings.System.SCREEN_BRIGHTNESS_FOR_VR, mScreenBrightnessForVrSettingDefault,
+ UserHandle.USER_CURRENT);
+
mScreenBrightnessSetting = Settings.System.getIntForUser(resolver,
Settings.System.SCREEN_BRIGHTNESS, mScreenBrightnessSettingDefault,
UserHandle.USER_CURRENT);
- if (oldScreenBrightnessSetting != mScreenBrightnessSetting) {
+
+ if (oldScreenBrightnessSetting != getCurrentBrightnessSettingLocked()) {
mTemporaryScreenBrightnessSettingOverride = -1;
}
@@ -811,6 +830,10 @@ public final class PowerManagerService extends SystemService
mDirty |= DIRTY_SETTINGS;
}
+ private int getCurrentBrightnessSettingLocked() {
+ return mIsVrModeEnabled ? mScreenBrightnessForVrSetting : mScreenBrightnessSetting;
+ }
+
private void postAfterBootCompleted(Runnable r) {
if (mBootCompleted) {
BackgroundThread.getHandler().post(r);
@@ -2069,6 +2092,7 @@ public final class PowerManagerService extends SystemService
|| !mDreamsSupportedConfig
|| !mDreamsEnabledSetting
|| !mDisplayPowerRequest.isBrightOrDim()
+ || mDisplayPowerRequest.isVr()
|| (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT
| USER_ACTIVITY_SCREEN_DIM | USER_ACTIVITY_SCREEN_DREAM)) == 0
|| !mBootCompleted) {
@@ -2113,7 +2137,8 @@ public final class PowerManagerService extends SystemService
final boolean oldDisplayReady = mDisplayReady;
if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS
| DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED
- | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST | DIRTY_QUIESCENT)) != 0) {
+ | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST | DIRTY_VR_MODE_CHANGED |
+ DIRTY_QUIESCENT)) != 0) {
mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked();
// Determine appropriate screen brightness and auto-brightness adjustments.
@@ -2127,6 +2152,9 @@ public final class PowerManagerService extends SystemService
// bootloader brightness and the default brightness to be identical.
autoBrightness = false;
brightnessSetByUser = false;
+ } else if (mIsVrModeEnabled) {
+ screenBrightness = mScreenBrightnessForVrSetting;
+ autoBrightness = false;
} else if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) {
screenBrightness = mScreenBrightnessOverrideFromWindowManager;
autoBrightness = false;
@@ -2160,7 +2188,7 @@ public final class PowerManagerService extends SystemService
mDisplayPowerRequest.useAutoBrightness = autoBrightness;
mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked();
mDisplayPowerRequest.lowPowerMode = mLowPowerModeEnabled;
- mDisplayPowerRequest.boostScreenBrightness = mScreenBrightnessBoostInProgress;
+ mDisplayPowerRequest.boostScreenBrightness = shouldBoostScreenBrightness();
mDisplayPowerRequest.useTwilight = mBrightnessUseTwilight;
if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) {
@@ -2191,6 +2219,7 @@ public final class PowerManagerService extends SystemService
+ ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)
+ ", mBootCompleted=" + mBootCompleted
+ ", mScreenBrightnessBoostInProgress=" + mScreenBrightnessBoostInProgress
+ + ", mIsVrModeEnabled= " + mIsVrModeEnabled
+ ", sQuiescent=" + sQuiescent);
}
}
@@ -2220,6 +2249,10 @@ public final class PowerManagerService extends SystemService
}
}
+ private boolean shouldBoostScreenBrightness() {
+ return !mIsVrModeEnabled && mScreenBrightnessBoostInProgress;
+ }
+
private static boolean isValidBrightness(int value) {
return value >= 0 && value <= 255;
}
@@ -2230,6 +2263,10 @@ public final class PowerManagerService extends SystemService
}
private int getDesiredScreenPolicyLocked() {
+ if (mIsVrModeEnabled) {
+ return DisplayPowerRequest.POLICY_VR;
+ }
+
if (mWakefulness == WAKEFULNESS_ASLEEP || sQuiescent) {
return DisplayPowerRequest.POLICY_OFF;
}
@@ -2333,7 +2370,7 @@ public final class PowerManagerService extends SystemService
};
private boolean shouldUseProximitySensorLocked() {
- return (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0;
+ return !mIsVrModeEnabled && (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0;
}
/**
@@ -3085,7 +3122,11 @@ public final class PowerManagerService extends SystemService
pw.println(" mScreenBrightnessSettingMinimum=" + mScreenBrightnessSettingMinimum);
pw.println(" mScreenBrightnessSettingMaximum=" + mScreenBrightnessSettingMaximum);
pw.println(" mScreenBrightnessSettingDefault=" + mScreenBrightnessSettingDefault);
+ pw.println(" mScreenBrightnessForVrSettingDefault="
+ + mScreenBrightnessForVrSettingDefault);
+ pw.println(" mScreenBrightnessForVrSetting=" + mScreenBrightnessForVrSetting);
pw.println(" mDoubleTapWakeEnabled=" + mDoubleTapWakeEnabled);
+ pw.println(" mIsVrModeEnabled=" + mIsVrModeEnabled);
final int sleepTimeout = getSleepTimeoutLocked();
final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);
@@ -3223,6 +3264,14 @@ public final class PowerManagerService extends SystemService
@Override
public void onVrStateChanged(boolean enabled) {
powerHintInternal(PowerHint.VR_MODE, enabled ? 1 : 0);
+
+ synchronized (mLock) {
+ if (mIsVrModeEnabled != enabled) {
+ mIsVrModeEnabled = enabled;
+ mDirty |= DIRTY_VR_MODE_CHANGED;
+ updatePowerStateLocked();
+ }
+ }
}
};
@@ -3975,6 +4024,7 @@ public final class PowerManagerService extends SystemService
case Display.STATE_DOZE:
case Display.STATE_DOZE_SUSPEND:
case Display.STATE_ON:
+ case Display.STATE_VR:
break;
default:
screenState = Display.STATE_UNKNOWN;
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index cca8cc886246..c69b87c53763 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -25,6 +25,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.Manifest;
+import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.app.trust.ITrustListener;
@@ -103,6 +104,7 @@ public class TrustManagerService extends SystemService {
private static final int MSG_SWITCH_USER = 9;
private static final int MSG_FLUSH_TRUST_USUALLY_MANAGED = 10;
private static final int MSG_UNLOCK_USER = 11;
+ private static final int MSG_STOP_USER = 12;
private static final int TRUST_USUALLY_MANAGED_FLUSH_DELAY = 2 * 60 * 1000;
@@ -414,15 +416,18 @@ public class TrustManagerService extends SystemService {
}
}
boolean deviceLocked = secure && showingKeyguard && !trusted;
+ setDeviceLockedForUser(id, deviceLocked);
+ }
+ }
- boolean changed;
- synchronized (mDeviceLockedForUser) {
- changed = isDeviceLockedInner(id) != deviceLocked;
- mDeviceLockedForUser.put(id, deviceLocked);
- }
- if (changed) {
- dispatchDeviceLocked(id, deviceLocked);
- }
+ private void setDeviceLockedForUser(@UserIdInt int userId, boolean locked) {
+ final boolean changed;
+ synchronized (mDeviceLockedForUser) {
+ changed = isDeviceLockedInner(userId) != locked;
+ mDeviceLockedForUser.put(userId, locked);
+ }
+ if (changed) {
+ dispatchDeviceLocked(userId, locked);
}
}
@@ -724,6 +729,11 @@ public class TrustManagerService extends SystemService {
mHandler.obtainMessage(MSG_UNLOCK_USER, userId, 0, null).sendToTarget();
}
+ @Override
+ public void onStopUser(@UserIdInt int userId) {
+ mHandler.obtainMessage(MSG_STOP_USER, userId, 0, null).sendToTarget();
+ }
+
// Plumbing
private final IBinder mService = new ITrustManager.Stub() {
@@ -982,6 +992,9 @@ public class TrustManagerService extends SystemService {
mCurrentUser = msg.arg1;
refreshDeviceLockedForUser(UserHandle.USER_ALL);
break;
+ case MSG_STOP_USER:
+ setDeviceLockedForUser(msg.arg1, true);
+ break;
case MSG_FLUSH_TRUST_USUALLY_MANAGED:
SparseBooleanArray usuallyManaged;
synchronized (mTrustUsuallyManagedForUser) {
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index 35004c295681..cab39b56c3e9 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -27,21 +27,21 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WIND
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.WindowManagerService.H.ADD_STARTING;
-
-import android.graphics.Bitmap;
-import android.os.Trace;
-import com.android.server.AttributeCache;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
+import android.graphics.Bitmap;
import android.os.Binder;
import android.os.Debug;
+import android.os.Handler;
import android.os.IBinder;
-import android.os.Message;
+import android.os.Looper;
+import android.os.Trace;
import android.util.Slog;
import android.view.IApplicationToken;
+import android.view.WindowManagerPolicy.StartingSurface;
+import com.android.server.AttributeCache;
/**
* Controller for the app window token container. This is created by activity manager to link
* activity records to the app window token container they use in window manager.
@@ -52,6 +52,7 @@ public class AppWindowContainerController
extends WindowContainerController<AppWindowToken, AppWindowContainerListener> {
private final IApplicationToken mToken;
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
private final Runnable mOnWindowsDrawn = () -> {
if (mListener == null) {
@@ -80,6 +81,94 @@ public class AppWindowContainerController
mListener.onWindowsGone();
};
+ private final Runnable mAddStartingWindow = () -> {
+ final StartingData startingData;
+ final Configuration mergedOverrideConfiguration;
+
+ synchronized (mWindowMap) {
+ startingData = mContainer.startingData;
+ mergedOverrideConfiguration = mContainer.getMergedOverrideConfiguration();
+ }
+
+ if (startingData == null) {
+ // Animation has been canceled... do nothing.
+ return;
+ }
+
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Add starting "
+ + this + ": pkg=" + mContainer.startingData.pkg);
+
+ StartingSurface contents = null;
+ try {
+ contents = mService.mPolicy.addSplashScreen(mContainer.token, startingData.pkg,
+ startingData.theme, startingData.compatInfo, startingData.nonLocalizedLabel,
+ startingData.labelRes, startingData.icon, startingData.logo,
+ startingData.windowFlags, mergedOverrideConfiguration);
+ } catch (Exception e) {
+ Slog.w(TAG_WM, "Exception when adding starting window", e);
+ }
+ if (contents != null) {
+ boolean abort = false;
+
+ synchronized(mWindowMap) {
+ if (mContainer.removed || mContainer.startingData == null) {
+ // If the window was successfully added, then
+ // we need to remove it.
+ if (mContainer.startingWindow != null) {
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
+ "Aborted starting " + mContainer
+ + ": removed=" + mContainer.removed
+ + " startingData=" + mContainer.startingData);
+ mContainer.startingWindow = null;
+ mContainer.startingData = null;
+ abort = true;
+ }
+ } else {
+ mContainer.startingSurface = contents;
+ }
+ if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG_WM,
+ "Added starting " + mContainer
+ + ": startingWindow="
+ + mContainer.startingWindow + " startingView="
+ + mContainer.startingSurface);
+ }
+
+ if (abort) {
+ try {
+ mService.mPolicy.removeSplashScreen(mContainer.token, contents);
+ } catch (Exception e) {
+ Slog.w(TAG_WM, "Exception when removing starting window", e);
+ }
+ }
+ }
+ };
+
+ private final Runnable mRemoveStartingWindow = () -> {
+ IBinder token = null;
+ StartingSurface contents = null;
+ synchronized (mWindowMap) {
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting "
+ + mContainer + ": startingWindow="
+ + mContainer.startingWindow + " startingView="
+ + mContainer.startingSurface);
+ if (mContainer.startingWindow != null) {
+ contents = mContainer.startingSurface;
+ token = mContainer.token;
+ mContainer.startingData = null;
+ mContainer.startingSurface = null;
+ mContainer.startingWindow = null;
+ mContainer.startingDisplayed = false;
+ }
+ }
+ if (contents != null) {
+ try {
+ mService.mPolicy.removeSplashScreen(token, contents);
+ } catch (Exception e) {
+ Slog.w(TAG_WM, "Exception when removing starting window", e);
+ }
+ }
+ };
+
public AppWindowContainerController(IApplicationToken token,
AppWindowContainerListener listener, int taskId, int index, int requestedOrientation,
boolean fullscreen, boolean showForAllUsers, int configChanges,
@@ -393,19 +482,42 @@ public class AppWindowContainerController
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Creating StartingData");
mContainer.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel,
labelRes, icon, logo, windowFlags);
- final Message m = mService.mH.obtainMessage(ADD_STARTING, mContainer);
- // Note: we really want to do sendMessageAtFrontOfQueue() because we
- // want to process the message ASAP, before any other queued
- // messages.
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Enqueueing ADD_STARTING");
- mService.mH.sendMessageAtFrontOfQueue(m);
+ scheduleAddStartingWindow();
}
return true;
}
+ void scheduleAddStartingWindow() {
+
+ // Note: we really want to do sendMessageAtFrontOfQueue() because we
+ // want to process the message ASAP, before any other queued
+ // messages.
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Enqueueing ADD_STARTING");
+ mHandler.postAtFrontOfQueue(mAddStartingWindow);
+ }
+
public void removeStartingWindow() {
synchronized (mWindowMap) {
- mService.scheduleRemoveStartingWindowLocked(mContainer);
+ if (mHandler.hasCallbacks(mRemoveStartingWindow)) {
+ // Already scheduled.
+ return;
+ }
+
+ if (mContainer.startingWindow == null) {
+ if (mContainer.startingData != null) {
+ // Starting window has not been added yet, but it is scheduled to be added.
+ // Go ahead and cancel the request.
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
+ "Clearing startingData for token=" + mContainer);
+ mContainer.startingData = null;
+ }
+ return;
+ }
+
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, Debug.getCallers(1)
+ + ": Schedule remove starting " + mContainer
+ + " startingWindow=" + mContainer.startingWindow);
+ mHandler.post(mRemoveStartingWindow);
}
}
@@ -508,15 +620,15 @@ public class AppWindowContainerController
void reportWindowsDrawn() {
- mService.mH.post(mOnWindowsDrawn);
+ mHandler.post(mOnWindowsDrawn);
}
void reportWindowsVisible() {
- mService.mH.post(mOnWindowsVisible);
+ mHandler.post(mOnWindowsVisible);
}
void reportWindowsGone() {
- mService.mH.post(mOnWindowsGone);
+ mHandler.post(mOnWindowsGone);
}
/** Calls directly into activity manager so window manager lock shouldn't held. */
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 0a4875810aba..f4fa2206a22a 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -29,9 +29,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
@@ -47,22 +47,21 @@ import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.logWithStack;
-import android.os.Debug;
-import com.android.internal.util.ToBooleanFunction;
-import com.android.server.input.InputApplicationHandle;
-import com.android.server.wm.WindowManagerService.H;
-
import android.annotation.NonNull;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Binder;
+import android.os.Debug;
import android.os.IBinder;
-import android.os.Message;
import android.os.SystemClock;
import android.util.Slog;
import android.view.IApplicationToken;
-import android.view.View;
import android.view.WindowManager;
+import android.view.WindowManagerPolicy.StartingSurface;
+
+import com.android.internal.util.ToBooleanFunction;
+import com.android.server.input.InputApplicationHandle;
+import com.android.server.wm.WindowManagerService.H;
import java.io.PrintWriter;
import java.util.ArrayDeque;
@@ -138,7 +137,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// Information about an application starting window if displayed.
StartingData startingData;
WindowState startingWindow;
- View startingView;
+ StartingSurface startingSurface;
boolean startingDisplayed;
boolean startingMoved;
boolean firstWindowDrawn;
@@ -213,8 +212,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// it from behind the starting window, so there is no need for it to also be doing its
// own stuff.
winAnimator.clearAnimation();
- winAnimator.mService.mFinishedStarting.add(this);
- winAnimator.mService.mH.sendEmptyMessage(H.FINISHED_STARTING);
+ if (getController() != null) {
+ getController().removeStartingWindow();
+ }
}
updateReportedVisibilityLocked();
}
@@ -439,8 +439,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
void onRemovedFromDisplay() {
- AppWindowToken startingToken = null;
-
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Removing app token: " + this);
boolean delayed = setVisibility(null, false, TRANSIT_UNSET, true, mVoiceInteraction);
@@ -461,6 +459,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM, "removeAppToken: "
+ this + " delayed=" + delayed + " Callers=" + Debug.getCallers(4));
+ if (startingData != null && getController() != null) {
+ getController().removeStartingWindow();
+ }
+
final TaskStack stack = mTask.mStack;
if (delayed && !isEmpty()) {
// set the token aside because it has an active animation to be finished
@@ -477,9 +479,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
removed = true;
- if (startingData != null) {
- startingToken = this;
- }
stopFreezingScreen(true, true);
if (mService.mFocusedApp == this) {
if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "Removing focused app token:" + this);
@@ -491,9 +490,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
if (!delayed) {
updateReportedVisibilityLocked();
}
-
- // Will only remove if startingToken non null.
- mService.scheduleRemoveStartingWindowLocked(startingToken);
}
void clearAnimatingFlags() {
@@ -557,7 +553,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
mAppStopped = true;
destroySurfaces();
// Remove any starting window that was added for this app if they are still around.
- mTask.mService.scheduleRemoveStartingWindowLocked(this);
+ if (getController() != null) {
+ getController().removeStartingWindow();
+ }
}
/**
@@ -667,16 +665,20 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// TODO: Something smells about the code below...Is there a better way?
if (startingWindow == win) {
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Notify removed startingWindow " + win);
- mService.scheduleRemoveStartingWindowLocked(this);
+ if (getController() != null) {
+ getController().removeStartingWindow();
+ }
} else if (mChildren.size() == 0 && startingData != null) {
// If this is the last window and we had requested a starting transition window,
// well there is no point now.
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Nulling last startingWindow");
startingData = null;
- } else if (mChildren.size() == 1 && startingView != null) {
+ } else if (mChildren.size() == 1 && startingSurface != null) {
// If this is the last window except for a starting transition window,
// we need to get rid of the starting transition.
- mService.scheduleRemoveStartingWindowLocked(this);
+ if (getController() != null) {
+ getController().removeStartingWindow();
+ }
}
}
@@ -1015,7 +1017,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
final WindowState tStartingWindow = fromToken.startingWindow;
- if (tStartingWindow != null && fromToken.startingView != null) {
+ if (tStartingWindow != null && fromToken.startingSurface != null) {
// In this case, the starting icon has already been displayed, so start
// letting windows get shown immediately without any more transitions.
mService.mSkipAppTransitionAnimation = true;
@@ -1027,13 +1029,13 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// Transfer the starting window over to the new token.
startingData = fromToken.startingData;
- startingView = fromToken.startingView;
+ startingSurface = fromToken.startingSurface;
startingDisplayed = fromToken.startingDisplayed;
fromToken.startingDisplayed = false;
startingWindow = tStartingWindow;
reportedVisible = fromToken.reportedVisible;
fromToken.startingData = null;
- fromToken.startingView = null;
+ fromToken.startingSurface = null;
fromToken.startingWindow = null;
fromToken.startingMoved = true;
tStartingWindow.mToken = this;
@@ -1080,10 +1082,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
startingData = fromToken.startingData;
fromToken.startingData = null;
fromToken.startingMoved = true;
- final Message m = mService.mH.obtainMessage(H.ADD_STARTING, this);
- // Note: we really want to do sendMessageAtFrontOfQueue() because we want to process the
- // message ASAP, before any other queued messages.
- mService.mH.sendMessageAtFrontOfQueue(m);
+ if (getController() != null) {
+ getController().scheduleAddStartingWindow();
+ }
return true;
}
@@ -1421,10 +1422,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
pw.print(" firstWindowDrawn="); pw.print(firstWindowDrawn);
pw.print(" mIsExiting="); pw.println(mIsExiting);
}
- if (startingWindow != null || startingView != null
+ if (startingWindow != null || startingSurface != null
|| startingDisplayed || startingMoved) {
pw.print(prefix); pw.print("startingWindow="); pw.print(startingWindow);
- pw.print(" startingView="); pw.print(startingView);
+ pw.print(" startingSurface="); pw.print(startingSurface);
pw.print(" startingDisplayed="); pw.print(startingDisplayed);
pw.print(" startingMoved="); pw.println(startingMoved);
}
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index dc06d129c5bb..775d8a0862f9 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -498,7 +498,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(winAnimator.mWin,
"RECOVER DESTROY", false);
winAnimator.destroySurface();
- mService.scheduleRemoveStartingWindowLocked(winAnimator.mWin.mAppToken);
+ if (winAnimator.mWin.mAppToken != null
+ && winAnimator.mWin.mAppToken.getController() != null) {
+ winAnimator.mWin.mAppToken.getController().removeStartingWindow();
+ }
}
try {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 38cb54320a1b..4e259354ae2a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2851,33 +2851,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- void scheduleRemoveStartingWindowLocked(AppWindowToken wtoken) {
- if (wtoken == null) {
- return;
- }
- if (mH.hasMessages(H.REMOVE_STARTING, wtoken)) {
- // Already scheduled.
- return;
- }
-
- if (wtoken.startingWindow == null) {
- if (wtoken.startingData != null) {
- // Starting window has not been added yet, but it is scheduled to be added.
- // Go ahead and cancel the request.
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
- "Clearing startingData for token=" + wtoken);
- wtoken.startingData = null;
- }
- return;
- }
-
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, Debug.getCallers(1) +
- ": Schedule remove starting " + wtoken + (wtoken != null ?
- " startingWindow=" + wtoken.startingWindow : ""));
- Message m = mH.obtainMessage(H.REMOVE_STARTING, wtoken);
- mH.sendMessage(m);
- }
-
public void moveTaskToTop(int taskId) {
final long origId = Binder.clearCallingIdentity();
try {
@@ -5578,9 +5551,6 @@ public class WindowManagerService extends IWindowManager.Stub
public static final int REPORT_FOCUS_CHANGE = 2;
public static final int REPORT_LOSING_FOCUS = 3;
public static final int DO_TRAVERSAL = 4;
- public static final int ADD_STARTING = 5;
- public static final int REMOVE_STARTING = 6;
- public static final int FINISHED_STARTING = 7;
public static final int WINDOW_FREEZE_TIMEOUT = 11;
public static final int APP_TRANSITION_TIMEOUT = 13;
@@ -5722,126 +5692,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
} break;
- case ADD_STARTING: {
- final AppWindowToken wtoken = (AppWindowToken)msg.obj;
- final StartingData sd = wtoken.startingData;
-
- if (sd == null) {
- // Animation has been canceled... do nothing.
- return;
- }
-
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Add starting "
- + wtoken + ": pkg=" + sd.pkg);
-
- View view = null;
- try {
- view = mPolicy.addStartingWindow(wtoken.token, sd.pkg, sd.theme,
- sd.compatInfo, sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.logo,
- sd.windowFlags, wtoken.getMergedOverrideConfiguration());
- } catch (Exception e) {
- Slog.w(TAG_WM, "Exception when adding starting window", e);
- }
-
- if (view != null) {
- boolean abort = false;
-
- synchronized(mWindowMap) {
- if (wtoken.removed || wtoken.startingData == null) {
- // If the window was successfully added, then
- // we need to remove it.
- if (wtoken.startingWindow != null) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
- "Aborted starting " + wtoken
- + ": removed=" + wtoken.removed
- + " startingData=" + wtoken.startingData);
- wtoken.startingWindow = null;
- wtoken.startingData = null;
- abort = true;
- }
- } else {
- wtoken.startingView = view;
- }
- if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG_WM,
- "Added starting " + wtoken
- + ": startingWindow="
- + wtoken.startingWindow + " startingView="
- + wtoken.startingView);
- }
-
- if (abort) {
- try {
- mPolicy.removeStartingWindow(wtoken.token, view);
- } catch (Exception e) {
- Slog.w(TAG_WM, "Exception when removing starting window", e);
- }
- }
- }
- } break;
-
- case REMOVE_STARTING: {
- final AppWindowToken wtoken = (AppWindowToken)msg.obj;
- IBinder token = null;
- View view = null;
- synchronized (mWindowMap) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting "
- + wtoken + ": startingWindow="
- + wtoken.startingWindow + " startingView="
- + wtoken.startingView);
- if (wtoken.startingWindow != null) {
- view = wtoken.startingView;
- token = wtoken.token;
- wtoken.startingData = null;
- wtoken.startingView = null;
- wtoken.startingWindow = null;
- wtoken.startingDisplayed = false;
- }
- }
- if (view != null) {
- try {
- mPolicy.removeStartingWindow(token, view);
- } catch (Exception e) {
- Slog.w(TAG_WM, "Exception when removing starting window", e);
- }
- }
- } break;
-
- case FINISHED_STARTING: {
- IBinder token = null;
- View view = null;
- while (true) {
- synchronized (mWindowMap) {
- final int N = mFinishedStarting.size();
- if (N <= 0) {
- break;
- }
- AppWindowToken wtoken = mFinishedStarting.remove(N-1);
-
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
- "Finished starting " + wtoken
- + ": startingWindow=" + wtoken.startingWindow
- + " startingView=" + wtoken.startingView);
-
- if (wtoken.startingWindow == null) {
- continue;
- }
-
- view = wtoken.startingView;
- token = wtoken.token;
- wtoken.startingData = null;
- wtoken.startingView = null;
- wtoken.startingWindow = null;
- wtoken.startingDisplayed = false;
- }
-
- try {
- mPolicy.removeStartingWindow(token, view);
- } catch (Exception e) {
- Slog.w(TAG_WM, "Exception when removing starting window", e);
- }
- }
- } break;
-
case WINDOW_FREEZE_TIMEOUT: {
// TODO(multidisplay): Can non-default displays rotate?
synchronized (mWindowMap) {
@@ -7348,21 +7198,6 @@ public class WindowManagerService extends IWindowManager.Stub
private void dumpTokensLocked(PrintWriter pw, boolean dumpAll) {
pw.println("WINDOW MANAGER TOKENS (dumpsys window tokens)");
mRoot.dumpTokens(pw, dumpAll);
- if (!mFinishedStarting.isEmpty()) {
- pw.println();
- pw.println(" Finishing start of application tokens:");
- for (int i=mFinishedStarting.size()-1; i>=0; i--) {
- WindowToken token = mFinishedStarting.get(i);
- pw.print(" Finished Starting #"); pw.print(i);
- pw.print(' '); pw.print(token);
- if (dumpAll) {
- pw.println(':');
- token.dump(pw, " ");
- } else {
- pw.println();
- }
- }
- }
if (!mOpeningApps.isEmpty() || !mClosingApps.isEmpty()) {
pw.println();
if (mOpeningApps.size() > 0) {
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index e5ed18d118ad..19ef44cace33 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -461,16 +461,7 @@ class WindowStateAnimator {
mStackClip = STACK_CLIP_BEFORE_ANIM;
mWin.checkPolicyVisibilityChange();
mTransformation.clear();
- if (mDrawState == HAS_DRAWN
- && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING
- && mWin.mAppToken != null
- && mWin.mAppToken.firstWindowDrawn
- && mWin.mAppToken.startingData != null) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Finish starting "
- + mWin.mToken + ": first real window done animating");
- mService.mFinishedStarting.add(mWin.mAppToken);
- mService.mH.sendEmptyMessage(H.FINISHED_STARTING);
- } else if (mAttrType == LayoutParams.TYPE_STATUS_BAR && mWin.mPolicyVisibility) {
+ if (mAttrType == LayoutParams.TYPE_STATUS_BAR && mWin.mPolicyVisibility) {
// Upon completion of a not-visible to visible status bar animation a relayout is
// required.
if (displayContent != null) {
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index 1aabd5ea66f9..4df100105bcb 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -441,8 +441,9 @@ class WindowSurfacePlacer {
wtoken.deferClearAllDrawn = false;
// Ensure that apps that are mid-starting are also scheduled to have their
// starting windows removed after the animation is complete
- if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit) {
- mService.scheduleRemoveStartingWindowLocked(wtoken);
+ if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit
+ && wtoken.getController() != null) {
+ wtoken.getController().removeStartingWindow();
}
mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index cf7f1cbfd0be..2fd0603c8f89 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -103,16 +103,15 @@ static void setLight_native(
state.flashMode = Flash::NONE;
} else {
// Only set non-brightness settings when not in low-persistence mode
- state.color = colorARGB;
state.flashMode = flash;
state.flashOnMs = onMS;
state.flashOffMs = offMS;
}
+ state.color = colorARGB;
state.brightnessMode = brightness;
Status status;
-
{
ALOGD_IF_SLOW(50, "Excessive delay setting light");
Return<Status> ret = gLight->setLight(type, state);
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 09886db17af6..504626544fe4 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -59,6 +59,12 @@ static jmethodID method_reportGeofenceResumeStatus;
static jmethodID method_reportMeasurementData;
static jmethodID method_reportNavigationMessages;
+/*
+ * Save a pointer to JavaVm to attach/detach threads executing
+ * callback methods that need to make JNI calls.
+ */
+static JavaVM* sJvm;
+
using android::OK;
using android::sp;
using android::status_t;
@@ -216,6 +222,62 @@ static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa
}
}
+class ScopedJniThreadAttach {
+public:
+ ScopedJniThreadAttach() {
+ /*
+ * attachResult will also be JNI_OK if the thead was already attached to
+ * JNI before the call to AttachCurrentThread().
+ */
+ jint attachResult = sJvm->AttachCurrentThread(&mEnv, nullptr);
+ LOG_ALWAYS_FATAL_IF(attachResult != JNI_OK, "Unable to attach thread. Error %d",
+ attachResult);
+ }
+
+ ~ScopedJniThreadAttach() {
+ jint detachResult = sJvm->DetachCurrentThread();
+ /*
+ * Return if the thread was already detached. Log error for any other
+ * failure.
+ */
+ if (detachResult == JNI_EDETACHED) {
+ return;
+ }
+
+ LOG_ALWAYS_FATAL_IF(detachResult != JNI_OK, "Unable to detach thread. Error %d",
+ detachResult);
+ }
+
+ JNIEnv* getEnv() {
+ /*
+ * Checking validity of mEnv in case the thread was detached elsewhere.
+ */
+ LOG_ALWAYS_FATAL_IF(AndroidRuntime::getJNIEnv() != mEnv);
+ return mEnv;
+ }
+
+private:
+ JNIEnv* mEnv = nullptr;
+};
+
+thread_local std::unique_ptr<ScopedJniThreadAttach> tJniThreadAttacher;
+
+static JNIEnv* getJniEnv() {
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+
+ /*
+ * If env is nullptr, the thread is not already attached to
+ * JNI. It is attached below and the destructor for ScopedJniThreadAttach
+ * will detach it on thread exit.
+ */
+ if (env == nullptr) {
+ tJniThreadAttacher.reset(new ScopedJniThreadAttach());
+ env = tJniThreadAttacher->getEnv();
+ }
+
+ return env;
+}
+
/*
* GnssCallback class implements the callback methods for IGnss interface.
*/
@@ -247,7 +309,7 @@ size_t GnssCallback::sGnssSvListSize = 0;
Return<void> GnssCallback::gnssLocationCb(
const ::android::hardware::gnss::V1_0::GnssLocation& location) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj,
method_reportLocation,
location.gnssLocationFlags,
@@ -263,14 +325,14 @@ Return<void> GnssCallback::gnssLocationCb(
}
Return<void> GnssCallback::gnssStatusCb(const IGnssCallback::GnssStatusValue status) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj, method_reportStatus, status);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
}
Return<void> GnssCallback::gnssSvStatusCb(const IGnssCallback::GnssSvStatus& svStatus) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
sGnssSvListSize = svStatus.numSvs;
if (sGnssSvListSize > static_cast<uint32_t>(
@@ -292,7 +354,7 @@ Return<void> GnssCallback::gnssSvStatusCb(const IGnssCallback::GnssSvStatus& svS
Return<void> GnssCallback::gnssNmeaCb(
int64_t timestamp, const ::android::hardware::hidl_string& nmea) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
/*
* The Java code will call back to read these values.
* We do this to avoid creating unnecessary String objects.
@@ -308,7 +370,7 @@ Return<void> GnssCallback::gnssNmeaCb(
Return<void> GnssCallback::gnssSetCapabilitesCb(uint32_t capabilities) {
ALOGD("%s: %du\n", __func__, capabilities);
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj, method_setEngineCapabilities, capabilities);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
@@ -325,7 +387,7 @@ Return<void> GnssCallback::gnssReleaseWakelockCb() {
}
Return<void> GnssCallback::gnssRequestTimeCb() {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj, method_requestUtcTime);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
@@ -334,7 +396,7 @@ Return<void> GnssCallback::gnssRequestTimeCb() {
Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback::GnssSystemInfo& info) {
ALOGD("%s: yearOfHw=%d\n", __func__, info.yearOfHw);
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj, method_setGnssYearOfHardware,
info.yearOfHw);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
@@ -350,7 +412,7 @@ class GnssXtraCallback : public IGnssXtraCallback {
* interface.
*/
Return<void> GnssXtraCallback::downloadRequestCb() {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj, method_xtraDownloadRequest);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
@@ -385,7 +447,7 @@ Return<void> GnssGeofenceCallback::gnssGeofenceTransitionCb(
const android::hardware::gnss::V1_0::GnssLocation& location,
GeofenceTransition transition,
hardware::gnss::V1_0::GnssUtcTime timestamp) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj,
method_reportGeofenceTransition,
@@ -408,7 +470,7 @@ Return<void> GnssGeofenceCallback::gnssGeofenceTransitionCb(
Return<void> GnssGeofenceCallback::gnssGeofenceStatusCb(
GeofenceAvailability status,
const android::hardware::gnss::V1_0::GnssLocation& location) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj,
method_reportGeofenceStatus,
status,
@@ -426,7 +488,7 @@ Return<void> GnssGeofenceCallback::gnssGeofenceStatusCb(
Return<void> GnssGeofenceCallback::gnssGeofenceAddCb(int32_t geofenceId,
GeofenceStatus status) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
if (status != IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS) {
ALOGE("%s: Error in adding a Geofence: %d\n", __func__, status);
}
@@ -441,7 +503,7 @@ Return<void> GnssGeofenceCallback::gnssGeofenceAddCb(int32_t geofenceId,
Return<void> GnssGeofenceCallback::gnssGeofenceRemoveCb(int32_t geofenceId,
GeofenceStatus status) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
if (status != IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS) {
ALOGE("%s: Error in removing a Geofence: %d\n", __func__, status);
}
@@ -455,7 +517,7 @@ Return<void> GnssGeofenceCallback::gnssGeofenceRemoveCb(int32_t geofenceId,
Return<void> GnssGeofenceCallback::gnssGeofencePauseCb(int32_t geofenceId,
GeofenceStatus status) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
if (status != IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS) {
ALOGE("%s: Error in pausing Geofence: %d\n", __func__, status);
}
@@ -469,7 +531,7 @@ Return<void> GnssGeofenceCallback::gnssGeofencePauseCb(int32_t geofenceId,
Return<void> GnssGeofenceCallback::gnssGeofenceResumeCb(int32_t geofenceId,
GeofenceStatus status) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
if (status != IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS) {
ALOGE("%s: Error in resuming Geofence: %d\n", __func__, status);
}
@@ -496,7 +558,7 @@ struct GnssNavigationMessageCallback : public IGnssNavigationMessageCallback {
Return<void> GnssNavigationMessageCallback::gnssNavigationMessageCb(
const IGnssNavigationMessageCallback::GnssNavigationMessage& message) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
size_t dataLength = message.data.size();
@@ -545,7 +607,7 @@ struct GnssMeasurementCallback : public IGnssMeasurementCallback {
Return<void> GnssMeasurementCallback::GnssMeasurementCb(
const IGnssMeasurementCallback::GnssData& data) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
jobject clock;
jobjectArray measurementArray;
@@ -700,7 +762,7 @@ struct GnssNiCallback : public IGnssNiCallback {
Return<void> GnssNiCallback::niNotifyCb(
const IGnssNiCallback::GnssNiNotification& notification) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
jstring requestorId = env->NewStringUTF(notification.requestorId.c_str());
jstring text = env->NewStringUTF(notification.notificationMessage.c_str());
@@ -742,7 +804,7 @@ struct AGnssCallback : public IAGnssCallback {
Return<void> AGnssCallback::agnssStatusIpV6Cb(
const IAGnssCallback::AGnssStatusIpV6& agps_status) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
jbyteArray byteArray = NULL;
bool isSupported = false;
@@ -778,7 +840,7 @@ Return<void> AGnssCallback::agnssStatusIpV6Cb(
Return<void> AGnssCallback::agnssStatusIpV4Cb(
const IAGnssCallback::AGnssStatusIpV4& agps_status) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
jbyteArray byteArray = NULL;
uint32_t ipAddr = agps_status.ipV4Addr;
@@ -813,7 +875,7 @@ jbyteArray AGnssCallback::convertToIpV4(uint32_t ip) {
return NULL;
}
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
jbyteArray byteArray = env->NewByteArray(4);
if (byteArray == NULL) {
ALOGE("Unable to allocate byte array for IPv4 address");
@@ -837,14 +899,14 @@ struct AGnssRilCallback : IAGnssRilCallback {
};
Return<void> AGnssRilCallback::requestSetIdCb(IAGnssRilCallback::ID setIdFlag) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj, method_requestSetID, setIdFlag);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
}
Return<void> AGnssRilCallback::requestRefLocCb() {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj, method_requestRefLocation);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
@@ -885,6 +947,14 @@ static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env,
"reportNavigationMessage",
"(Landroid/location/GnssNavigationMessage;)V");
+ /*
+ * Save a pointer to JVM.
+ */
+ jint jvmStatus = env->GetJavaVM(&sJvm);
+ if (jvmStatus != JNI_OK) {
+ LOG_ALWAYS_FATAL("Unable to get Java VM. Error: %d", jvmStatus);
+ }
+
// TODO(b/31632518)
gnssHal = IGnss::getService("gnss");
if (gnssHal != nullptr) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 0346e4c04492..2e5b6876719e 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -75,6 +75,7 @@ import android.app.admin.SecurityLog;
import android.app.admin.SecurityLog.SecurityEvent;
import android.app.admin.SystemUpdatePolicy;
import android.app.backup.IBackupManager;
+import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -1492,6 +1493,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
return TelephonyManager.from(mContext);
}
+ TrustManager getTrustManager() {
+ return (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE);
+ }
+
IWindowManager getIWindowManager() {
return IWindowManager.Stub
.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));
@@ -4405,31 +4410,52 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
@Override
- public void lockNow(boolean parent) {
+ public void lockNow(int flags, boolean parent) {
if (!mHasFeature) {
return;
}
+
+ final int callingUserId = mInjector.userHandleGetCallingUserId();
synchronized (this) {
// This API can only be called by an active device admin,
// so try to retrieve it to check that the caller is one.
- getActiveAdminForCallerLocked(
+ final ActiveAdmin admin = getActiveAdminForCallerLocked(
null, DeviceAdminInfo.USES_POLICY_FORCE_LOCK, parent);
- int userToLock = mInjector.userHandleGetCallingUserId();
-
- // Unless this is a managed profile with work challenge enabled, lock all users.
- if (parent || !isSeparateProfileChallengeEnabled(userToLock)) {
- userToLock = UserHandle.USER_ALL;
- }
final long ident = mInjector.binderClearCallingIdentity();
try {
+ // Evict key
+ if ((flags & DevicePolicyManager.FLAG_EVICT_CE_KEY) != 0) {
+ enforceManagedProfile(callingUserId, "set FLAG_EVICT_CE_KEY");
+ if (!isProfileOwner(admin.info.getComponent(), callingUserId)) {
+ throw new SecurityException(
+ "Only profile owner admins can set FLAG_EVICT_CE_KEY");
+ }
+ if (parent) {
+ throw new IllegalArgumentException(
+ "Cannot set FLAG_EVICT_CE_KEY for the parent");
+ }
+ if (!mInjector.storageManagerIsFileBasedEncryptionEnabled()) {
+ throw new UnsupportedOperationException(
+ "FLAG_EVICT_CE_KEY only applies to FBE devices");
+ }
+ mUserManager.evictCredentialEncryptionKey(callingUserId);
+ }
+
+ // Lock all users unless this is a managed profile with a separate challenge
+ final int userToLock = (parent || !isSeparateProfileChallengeEnabled(callingUserId)
+ ? UserHandle.USER_ALL : callingUserId);
mLockPatternUtils.requireStrongAuth(
STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW, userToLock);
+
+ // Require authentication for the device or profile
if (userToLock == UserHandle.USER_ALL) {
// Power off the display
mInjector.powerManagerGoToSleep(SystemClock.uptimeMillis(),
PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN, 0);
mInjector.getIWindowManager().lockNow(null);
+ } else {
+ mInjector.getTrustManager().setDeviceLockedForUser(userToLock, true);
}
} catch (RemoteException e) {
} finally {
@@ -9984,6 +10010,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
+ " service not being available yet.");
}
mNetworkLogger = null;
+ mInjector.getNotificationManager().cancel(NETWORK_LOGGING_NOTIFICATION_ID);
}
} finally {
mInjector.binderRestoreCallingIdentity(callingIdentity);
@@ -10070,6 +10097,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
.setSmallIcon(R.drawable.ic_qs_network_logging)
.setContentTitle(mContext.getString(R.string.network_logging_notification_title))
.setContentText(mContext.getString(R.string.network_logging_notification_text))
+ .setTicker(mContext.getString(R.string.network_logging_notification_title))
.setShowWhen(true)
.setContentIntent(pendingIntent)
.build();
diff --git a/services/tests/notification/AndroidManifest.xml b/services/tests/notification/AndroidManifest.xml
index 087806eeba96..1ed8ed0c5194 100644
--- a/services/tests/notification/AndroidManifest.xml
+++ b/services/tests/notification/AndroidManifest.xml
@@ -18,7 +18,10 @@
package="com.android.frameworks.tests.notification">
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
+ <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
+ <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<application>
<uses-library android:name="android.test.runner" />
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
index ef61ec242a4c..40938fd88ef1 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -16,6 +16,7 @@
package com.android.server.notification;
+import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
@@ -29,24 +30,29 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.INotificationManager;
-import android.app.IOnNotificationChannelCreatedListener;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
+import android.content.pm.ParceledListSlice;
import android.os.Binder;
import android.os.Handler;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
+import android.support.test.annotation.UiThreadTest;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import java.util.Arrays;
+import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import com.android.server.lights.Light;
+import com.android.server.lights.LightsManager;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -58,6 +64,7 @@ public class NotificationManagerServiceTest {
private IPackageManager mPackageManager = mock(IPackageManager.class);
@Before
+ @UiThreadTest
public void setUp() throws Exception {
final Context context = InstrumentationRegistry.getTargetContext();
mNotificationManagerService = new NotificationManagerService(context);
@@ -67,37 +74,32 @@ public class NotificationManagerServiceTest {
applicationInfo.uid = Binder.getCallingUid();
when(mPackageManager.getApplicationInfo(any(), anyInt(), anyInt()))
.thenReturn(applicationInfo);
- mNotificationManagerService.setPackageManager(mPackageManager);
- mNotificationManagerService.setHandler(new Handler(context.getMainLooper()));
+ final LightsManager mockLightsManager = mock(LightsManager.class);
+ when(mockLightsManager.getLight(anyInt())).thenReturn(mock(Light.class));
+ mNotificationManagerService.init(mPackageManager, mockLightsManager);
// Tests call directly into the Binder.
mBinderService = mNotificationManagerService.getBinderService();
}
@Test
- public void testCreateNotificationChannel_SuccessCallsListener() throws Exception {
+ @UiThreadTest
+ public void testCreateNotificationChannels_SingleChannel() throws Exception {
final NotificationChannel channel =
new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_DEFAULT);
- mNotificationManagerService.setRankingHelper(mock(RankingHelper.class));
- final CountDownLatch latch = new CountDownLatch(1);
- mBinderService.createNotificationChannel("test_pkg", channel,
- new IOnNotificationChannelCreatedListener.Stub() {
- @Override public void onNotificationChannelCreated(
- NotificationChannel channel) {
- latch.countDown();
- }});
- latch.await();
+ mBinderService.createNotificationChannels("test_pkg",
+ new ParceledListSlice(Arrays.asList(channel)));
+ final NotificationChannel createdChannel =
+ mBinderService.getNotificationChannel("test_pkg", "id");
+ assertTrue(createdChannel != null);
}
@Test
- public void testCreateNotificationChannel_FailureDoesNotCallListener() throws Exception {
+ @UiThreadTest
+ public void testCreateNotificationChannels_NullChannelThrowsException() throws Exception {
try {
- mBinderService.createNotificationChannel("test_pkg", null,
- new IOnNotificationChannelCreatedListener.Stub() {
- @Override public void onNotificationChannelCreated(
- NotificationChannel channel) {
- fail("Listener was triggered from failure.");
- }});
+ mBinderService.createNotificationChannels("test_pkg",
+ new ParceledListSlice(Arrays.asList(null)));
fail("Exception should be thrown immediately.");
} catch (NullPointerException e) {
// pass
@@ -105,6 +107,54 @@ public class NotificationManagerServiceTest {
}
@Test
+ @UiThreadTest
+ public void testCreateNotificationChannels_TwoChannels() throws Exception {
+ final NotificationChannel channel1 =
+ new NotificationChannel("id1", "name", NotificationManager.IMPORTANCE_DEFAULT);
+ final NotificationChannel channel2 =
+ new NotificationChannel("id2", "name", NotificationManager.IMPORTANCE_DEFAULT);
+ mBinderService.createNotificationChannels("test_pkg",
+ new ParceledListSlice(Arrays.asList(channel1, channel2)));
+ assertTrue(mBinderService.getNotificationChannel("test_pkg", "id1") != null);
+ assertTrue(mBinderService.getNotificationChannel("test_pkg", "id2") != null);
+ }
+
+ @Test
+ @UiThreadTest
+ public void testCreateNotificationChannels_SecondCreateDoesNotChangeImportance()
+ throws Exception {
+ final NotificationChannel channel =
+ new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_DEFAULT);
+ mBinderService.createNotificationChannels("test_pkg",
+ new ParceledListSlice(Arrays.asList(channel)));
+
+ // Recreating the channel doesn't throw, but ignores importance.
+ final NotificationChannel dupeChannel =
+ new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_HIGH);
+ mBinderService.createNotificationChannels("test_pkg",
+ new ParceledListSlice(Arrays.asList(dupeChannel)));
+ final NotificationChannel createdChannel =
+ mBinderService.getNotificationChannel("test_pkg", "id");
+ assertEquals(NotificationManager.IMPORTANCE_DEFAULT, createdChannel.getImportance());
+ }
+
+ @Test
+ @UiThreadTest
+ public void testCreateNotificationChannels_IdenticalChannelsInListIgnoresSecond()
+ throws Exception {
+ final NotificationChannel channel1 =
+ new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_DEFAULT);
+ final NotificationChannel channel2 =
+ new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_HIGH);
+ mBinderService.createNotificationChannels("test_pkg",
+ new ParceledListSlice(Arrays.asList(channel1, channel2)));
+ final NotificationChannel createdChannel =
+ mBinderService.getNotificationChannel("test_pkg", "id");
+ assertEquals(NotificationManager.IMPORTANCE_DEFAULT, createdChannel.getImportance());
+ }
+
+ @Test
+ @UiThreadTest
public void testBlockedNotifications_suspended() throws Exception {
NotificationUsageStats usageStats = mock(NotificationUsageStats.class);
when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(true);
@@ -120,6 +170,7 @@ public class NotificationManagerServiceTest {
}
@Test
+ @UiThreadTest
public void testBlockedNotifications_blockedChannel() throws Exception {
NotificationUsageStats usageStats = mock(NotificationUsageStats.class);
when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false);
@@ -136,6 +187,7 @@ public class NotificationManagerServiceTest {
}
@Test
+ @UiThreadTest
public void testBlockedNotifications_blockedApp() throws Exception {
NotificationUsageStats usageStats = mock(NotificationUsageStats.class);
when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false);
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
index 9c5c67237fd2..1189dae7b21c 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
@@ -23,6 +23,7 @@ import static android.net.NetworkScoreManager.CACHE_FILTER_NONE;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
@@ -61,6 +62,7 @@ import android.net.RecommendationResult;
import android.net.ScoredNetwork;
import android.net.WifiKey;
import android.net.wifi.WifiConfiguration;
+import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.IRemoteCallback;
@@ -261,7 +263,7 @@ public class NetworkScoreServiceTest {
@Test
public void testUpdateScores_notActiveScorer() {
- when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false);
+ bindToScorer(false /*callerIsScorer*/);
try {
mNetworkScoreService.updateScores(new ScoredNetwork[0]);
@@ -273,7 +275,7 @@ public class NetworkScoreServiceTest {
@Test
public void testUpdateScores_oneRegisteredCache() throws RemoteException {
- when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true);
+ bindToScorer(true /*callerIsScorer*/);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
mNetworkScoreCache, CACHE_FILTER_NONE);
@@ -288,7 +290,7 @@ public class NetworkScoreServiceTest {
@Test
public void testUpdateScores_twoRegisteredCaches() throws RemoteException {
- when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true);
+ bindToScorer(true /*callerIsScorer*/);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
mNetworkScoreCache, CACHE_FILTER_NONE);
@@ -322,8 +324,8 @@ public class NetworkScoreServiceTest {
}
@Test
- public void testClearScores_notActiveScorer_noBroadcastNetworkPermission() {
- when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false);
+ public void testClearScores_notActiveScorer_noRequestNetworkScoresPermission() {
+ bindToScorer(false /*callerIsScorer*/);
when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
.thenReturn(PackageManager.PERMISSION_DENIED);
try {
@@ -335,8 +337,8 @@ public class NetworkScoreServiceTest {
}
@Test
- public void testClearScores_activeScorer_noBroadcastNetworkPermission() {
- when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true);
+ public void testClearScores_activeScorer_noRequestNetworkScoresPermission() {
+ bindToScorer(true /*callerIsScorer*/);
when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
.thenReturn(PackageManager.PERMISSION_DENIED);
@@ -345,7 +347,7 @@ public class NetworkScoreServiceTest {
@Test
public void testClearScores_activeScorer() throws RemoteException {
- when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true);
+ bindToScorer(true /*callerIsScorer*/);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
CACHE_FILTER_NONE);
@@ -355,9 +357,9 @@ public class NetworkScoreServiceTest {
}
@Test
- public void testClearScores_notActiveScorer_hasBroadcastNetworkPermission()
+ public void testClearScores_notActiveScorer_hasRequestNetworkScoresPermission()
throws RemoteException {
- when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false);
+ bindToScorer(false /*callerIsScorer*/);
when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
.thenReturn(PackageManager.PERMISSION_GRANTED);
@@ -382,8 +384,8 @@ public class NetworkScoreServiceTest {
}
@Test
- public void testDisableScoring_notActiveScorer_noBroadcastNetworkPermission() {
- when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false);
+ public void testDisableScoring_notActiveScorer_noRequestNetworkScoresPermission() {
+ bindToScorer(false /*callerIsScorer*/);
when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
.thenReturn(PackageManager.PERMISSION_DENIED);
@@ -396,7 +398,7 @@ public class NetworkScoreServiceTest {
}
@Test
- public void testRegisterNetworkScoreCache_noBroadcastNetworkPermission() {
+ public void testRegisterNetworkScoreCache_noRequestNetworkScoresPermission() {
doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
eq(permission.REQUEST_NETWORK_SCORES), anyString());
@@ -410,7 +412,7 @@ public class NetworkScoreServiceTest {
}
@Test
- public void testUnregisterNetworkScoreCache_noBroadcastNetworkPermission() {
+ public void testUnregisterNetworkScoreCache_noRequestNetworkScoresPermission() {
doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
eq(permission.REQUEST_NETWORK_SCORES), anyString());
@@ -448,6 +450,42 @@ public class NetworkScoreServiceTest {
assertFalse(stringWriter.toString().isEmpty());
}
+ @Test
+ public void testIsCallerActiveScorer_noBoundService() throws Exception {
+ mNetworkScoreService.systemRunning();
+
+ assertFalse(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
+ }
+
+ @Test
+ public void testIsCallerActiveScorer_boundServiceIsNotCaller() throws Exception {
+ bindToScorer(false /*callerIsScorer*/);
+
+ assertFalse(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
+ }
+
+ @Test
+ public void testIsCallerActiveScorer_boundServiceIsCaller() throws Exception {
+ bindToScorer(true /*callerIsScorer*/);
+
+ assertTrue(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
+ }
+
+ @Test
+ public void testGetActiveScorerPackage_notActive() throws Exception {
+ mNetworkScoreService.systemRunning();
+
+ assertNull(mNetworkScoreService.getActiveScorerPackage());
+ }
+
+ @Test
+ public void testGetActiveScorerPackage_active() throws Exception {
+ when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
+ mNetworkScoreService.systemRunning();
+
+ assertEquals(NEW_SCORER.packageName, mNetworkScoreService.getActiveScorerPackage());
+ }
+
// "injects" the mock INetworkRecommendationProvider into the NetworkScoreService.
private void injectProvider() {
final ComponentName componentName = new ComponentName(NEW_SCORER.packageName,
@@ -467,4 +505,14 @@ public class NetworkScoreServiceTest {
});
mNetworkScoreService.systemRunning();
}
+
+ private void bindToScorer(boolean callerIsScorer) {
+ final int callingUid = callerIsScorer ? Binder.getCallingUid() : 0;
+ NetworkScorerAppData appData = new NetworkScorerAppData(NEW_SCORER.packageName,
+ callingUid, NEW_SCORER.recommendationServiceClassName);
+ when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(appData);
+ when(mContext.bindServiceAsUser(isA(Intent.class), isA(ServiceConnection.class), anyInt(),
+ isA(UserHandle.class))).thenReturn(true);
+ mNetworkScoreService.systemRunning();
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityCacheTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityCacheTest.java
index 9ccf29067f4a..ace65a6ada80 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityCacheTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityCacheTest.java
@@ -17,12 +17,14 @@
package com.android.server.accessibility;
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.when;
import android.support.test.runner.AndroidJUnit4;
@@ -479,6 +481,25 @@ public class AccessibilityCacheTest {
AccessibilityEvent.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION);
}
+ @Test
+ public void testCacheCriticalEventList_doesntLackEvents() {
+ for (int i = 0; i < 32; i++) {
+ int eventType = 1 << i;
+ if ((eventType & AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK) == 0) {
+ try {
+ assertEventTypeClearsNode(eventType, false);
+ verify(mAccessibilityNodeRefresher, never())
+ .refreshNode(anyObject(), anyBoolean());
+ } catch (Throwable e) {
+ throw new AssertionError(
+ "Failed for eventType: " + AccessibilityEvent.eventTypeToString(
+ eventType),
+ e);
+ }
+ }
+ }
+ }
+
private void assertNodeIsRefreshedWithEventType(int eventType, int contentChangeTypes) {
AccessibilityNodeInfo nodeInfo = getNodeWithA11yAndWindowId(SINGLE_VIEW_ID, WINDOW_ID_1);
mAccessibilityCache.add(nodeInfo);
@@ -521,13 +542,28 @@ public class AccessibilityCacheTest {
}
private void assertEventTypeClearsNode(int eventType) {
+ assertEventTypeClearsNode(eventType, true);
+ }
+
+ private void assertEventTypeClearsNode(int eventType, boolean clears) {
final int nodeId = 0xBEEF;
AccessibilityNodeInfo nodeInfo = getNodeWithA11yAndWindowId(nodeId, WINDOW_ID_1);
long id = nodeInfo.getSourceNodeId();
mAccessibilityCache.add(nodeInfo);
nodeInfo.recycle();
mAccessibilityCache.onAccessibilityEvent(AccessibilityEvent.obtain(eventType));
- assertNull(mAccessibilityCache.getNode(WINDOW_ID_1, id));
+ AccessibilityNodeInfo cachedNode = mAccessibilityCache.getNode(WINDOW_ID_1, id);
+ try {
+ if (clears) {
+ assertNull(cachedNode);
+ } else {
+ assertNotNull(cachedNode);
+ }
+ } finally {
+ if (cachedNode != null) {
+ cachedNode.recycle();
+ }
+ }
}
private AccessibilityNodeInfo getParentNode() {
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index d39245992d49..182f0457de3d 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -2289,6 +2289,11 @@ public class DevicePolicyManagerTest extends DpmTestBase {
setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
mContext.packageName = admin1.getPackageName();
+ final ComponentName adminDifferentPackage =
+ new ComponentName("another.package", "whatever.random.class");
+ final int ANOTHER_UID = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, 948);
+ setUpPackageManagerForFakeAdmin(adminDifferentPackage, ANOTHER_UID, admin2);
+
// COMP mode is allowed.
assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
@@ -2304,12 +2309,66 @@ public class DevicePolicyManagerTest extends DpmTestBase {
.thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
+ // But another app should not
+ mContext.binder.callingUid = ANOTHER_UID;
+ mContext.packageName = adminDifferentPackage.getPackageName();
+ assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
+
// The DO should not be allowed to initiate provisioning if the restriction is set by
// another entity.
when(mContext.userManager.getUserRestrictionSource(
eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
.thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
+ mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+ mContext.packageName = admin1.getPackageName();
+ assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
+
+ mContext.binder.callingUid = ANOTHER_UID;
+ mContext.packageName = adminDifferentPackage.getPackageName();
+ assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
+ }
+
+ public void testIsProvisioningAllowed_nonSplitUser_comp() throws Exception {
+ setDeviceOwner();
+ setup_nonSplitUser_afterDeviceSetup_primaryUser();
+ setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
+
+ final ComponentName adminDifferentPackage =
+ new ComponentName("another.package", "whatever.class");
+ final int ANOTHER_UID = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, 948);
+ setUpPackageManagerForFakeAdmin(adminDifferentPackage, ANOTHER_UID, admin2);
+
+ final int MANAGED_PROFILE_USER_ID = 18;
+ final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 1308);
+ addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
+
+ when(mContext.userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
+ false /* we can't remove a managed profile */)).thenReturn(false);
+ when(mContext.userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
+ true)).thenReturn(true);
+
+ // We can delete the managed profile to create a new one, so provisioning is allowed.
+ mContext.packageName = admin1.getPackageName();
+ mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+ assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
+
+ mContext.packageName = adminDifferentPackage.getPackageName();
+ mContext.binder.callingUid = ANOTHER_UID;
+ assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
+
+ when(mContext.userManager.hasUserRestriction(
+ eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE),
+ eq(UserHandle.of(DpmMockContext.CALLER_USER_HANDLE))))
+ .thenReturn(true);
+
+ // Now, we can't remove the profile any more to create a new one.
+ mContext.packageName = admin1.getPackageName();
+ mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+ assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
+
+ mContext.packageName = adminDifferentPackage.getPackageName();
+ mContext.binder.callingUid = ANOTHER_UID;
assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 10ca90207d85..228b8e0d82fb 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -1403,7 +1403,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
Icon icon, Intent intent, int rank) {
final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext, id)
- .setActivity(new ComponentName(mClientContext.getPackageName(), "dummy"))
+ .setActivity(new ComponentName(mClientContext.getPackageName(), "main"))
.setShortLabel(title)
.setRank(rank)
.setIntent(intent);
@@ -1432,7 +1432,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
Icon icon, Intent[] intents, int rank) {
final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext, id)
- .setActivity(new ComponentName(mClientContext.getPackageName(), "dummy"))
+ .setActivity(new ComponentName(mClientContext.getPackageName(), "main"))
.setShortLabel(title)
.setRank(rank)
.setIntents(intents);
@@ -1455,7 +1455,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected ShortcutInfo makeShortcutWithExtras(String id, Intent intent,
PersistableBundle extras) {
final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext, id)
- .setActivity(new ComponentName(mClientContext.getPackageName(), "dummy"))
+ .setActivity(new ComponentName(mClientContext.getPackageName(), "main"))
.setShortLabel("title-" + id)
.setExtras(extras)
.setIntent(intent);
diff --git a/services/tests/servicestests/src/com/android/server/pm/InstallerTest.java b/services/tests/servicestests/src/com/android/server/pm/InstallerTest.java
new file mode 100644
index 000000000000..5ab902083b22
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/InstallerTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageStats;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import com.android.internal.util.ArrayUtils;
+
+import java.util.Arrays;
+
+public class InstallerTest extends AndroidTestCase {
+ private static final String TAG = "InstallerTest";
+
+ private Installer mInstaller;
+
+ private final Timer mManual = new Timer("Manual");
+ private final Timer mQuota = new Timer("Quota");
+
+ private static class Timer {
+ private final String mTitle;
+ private long mStart;
+ private long mTotal;
+
+ public Timer(String title) {
+ mTitle = title;
+ }
+
+ public void start() {
+ mStart = SystemClock.currentTimeMicro();
+ }
+
+ public void stop() {
+ mTotal += SystemClock.currentTimeMicro() - mStart;
+ }
+
+ public void reset() {
+ mStart = 0;
+ mTotal = 0;
+ }
+
+ @Override
+ public String toString() {
+ return mTitle + ": " + (mTotal / 1000) + "ms";
+ }
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ mInstaller = new Installer(getContext());
+ mInstaller.onStart();
+ mManual.reset();
+ mQuota.reset();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ Log.i(TAG, mManual.toString());
+ Log.i(TAG, mQuota.toString());
+ mInstaller = null;
+ }
+
+ public void testGetAppSize() throws Exception {
+ final PackageManager pm = getContext().getPackageManager();
+ for (ApplicationInfo app : pm.getInstalledApplications(0)) {
+ final int userId = UserHandle.getUserId(app.uid);
+ final int appId = UserHandle.getAppId(app.uid);
+
+ final String[] packageNames = pm.getPackagesForUid(app.uid);
+ final long[] ceDataInodes = new long[packageNames.length];
+ final String[] codePaths = new String[packageNames.length];
+
+ for (int i = 0; i < packageNames.length; i++) {
+ final ApplicationInfo info = pm.getApplicationInfo(packageNames[i], 0);
+ codePaths[i] = info.getCodePath();
+ }
+
+ final PackageStats stats = new PackageStats(app.packageName);
+ final PackageStats quotaStats = new PackageStats(app.packageName);
+
+ mManual.start();
+ mInstaller.getAppSize(app.volumeUuid, packageNames, userId, 0,
+ appId, ceDataInodes, codePaths, stats);
+ mManual.stop();
+
+ mQuota.start();
+ mInstaller.getAppSize(app.volumeUuid, packageNames, userId, Installer.FLAG_USE_QUOTA,
+ appId, ceDataInodes, codePaths, quotaStats);
+ mQuota.stop();
+
+ checkEquals(Arrays.toString(packageNames) + " UID=" + app.uid, stats, quotaStats);
+ }
+ }
+
+ public void testGetUserSize() throws Exception {
+ int[] appIds = null;
+
+ final PackageManager pm = getContext().getPackageManager();
+ for (ApplicationInfo app : pm.getInstalledApplications(0)) {
+ final int appId = UserHandle.getAppId(app.uid);
+ if (!ArrayUtils.contains(appIds, appId)) {
+ appIds = ArrayUtils.appendInt(appIds, appId);
+ }
+ }
+
+ final PackageStats stats = new PackageStats("android");
+ final PackageStats quotaStats = new PackageStats("android");
+
+ mManual.start();
+ mInstaller.getUserSize(null, UserHandle.USER_SYSTEM, 0,
+ appIds, stats);
+ mManual.stop();
+
+ mQuota.start();
+ mInstaller.getUserSize(null, UserHandle.USER_SYSTEM, Installer.FLAG_USE_QUOTA,
+ appIds, quotaStats);
+ mQuota.stop();
+
+ checkEquals(Arrays.toString(appIds), stats, quotaStats);
+ }
+
+ public void testGetExternalSize() throws Exception {
+ mManual.start();
+ final long[] stats = mInstaller.getExternalSize(null, UserHandle.USER_SYSTEM, 0);
+ mManual.stop();
+
+ mQuota.start();
+ final long[] quotaStats = mInstaller.getExternalSize(null, UserHandle.USER_SYSTEM,
+ Installer.FLAG_USE_QUOTA);
+ mQuota.stop();
+
+ for (int i = 0; i < stats.length; i++) {
+ checkEquals("#" + i, stats[i], quotaStats[i]);
+ }
+ }
+
+ private static void checkEquals(String msg, PackageStats a, PackageStats b) {
+ checkEquals(msg + " codeSize", a.codeSize, b.codeSize);
+ checkEquals(msg + " dataSize", a.dataSize, b.dataSize);
+ checkEquals(msg + " cacheSize", a.cacheSize, b.cacheSize);
+ checkEquals(msg + " externalCodeSize", a.externalCodeSize, b.externalCodeSize);
+ checkEquals(msg + " externalDataSize", a.externalDataSize, b.externalDataSize);
+ checkEquals(msg + " externalCacheSize", a.externalCacheSize, b.externalCacheSize);
+ }
+
+ private static void checkEquals(String msg, long expected, long actual) {
+ if (expected != actual) {
+ Log.e(TAG, msg + " expected " + expected + " actual " + actual);
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java
index fbf0ed2938eb..bcd72fcd6181 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java
@@ -38,6 +38,7 @@ import android.graphics.drawable.Icon;
import android.os.UserHandle;
import android.test.MoreAsserts;
import android.test.suitebuilder.annotation.SmallTest;
+import android.util.Log;
import android.util.Pair;
import com.android.frameworks.servicestests.R;
@@ -227,8 +228,9 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
private void assertPinItemRequest(PinItemRequest actualRequest) {
assertNotNull(actualRequest);
-
assertEquals(PinItemRequest.REQUEST_TYPE_SHORTCUT, actualRequest.getRequestType());
+
+ Log.i(TAG, "Requested shortcut: " + actualRequest.getShortcutInfo().toInsecureString());
}
/**
@@ -243,9 +245,16 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- ShortcutInfo s1 = makeShortcutWithIcon("s1", res32x32);
+ /// Create a shortcut with no target activity.
+ final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext, "s1")
+ .setShortLabel("Title-" + "s1")
+ .setIcon(res32x32)
+ .setIntent(makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class));
+ final ShortcutInfo s = b.build();
+
+ assertNull(s.getActivity());
- assertTrue(mManager.requestPinShortcut(s1,
+ assertTrue(mManager.requestPinShortcut(s,
resultIntent == null ? null : resultIntent.getIntentSender()));
verify(mServiceContext, times(0)).sendIntentSender(any(IntentSender.class));
@@ -271,6 +280,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(request.getShortcutInfo())
.haveIds("s1")
.areAllOrphan()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, MAIN_ACTIVITY_CLASS))
.areAllWithNoIntent();
assertAllHaveIcon(list(request.getShortcutInfo()));
@@ -295,6 +305,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.areAllNotDynamic()
.areAllEnabled()
.areAllPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, MAIN_ACTIVITY_CLASS))
.areAllWithIntent();
});
}
@@ -310,6 +321,145 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
checkRequestPinShortcut(resultIntent);
}
+ public void testRequestPinShortcut_explicitTargetActivity() {
+ setDefaultLauncher(USER_0, mMainActivityFetcher.apply(LAUNCHER_1, USER_0));
+ setDefaultLauncher(USER_10, mMainActivityFetcher.apply(LAUNCHER_2, USER_10));
+
+ runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
+ ShortcutInfo s1 = makeShortcutWithActivity("s1",
+ new ComponentName(CALLING_PACKAGE_1, "different_activity"));
+
+ assertTrue(mManager.requestPinShortcut(s1, null));
+
+ verify(mServiceContext, times(0)).sendIntentSender(any(IntentSender.class));
+
+ // Shortcut shouldn't be registered yet.
+ assertWith(getCallerShortcuts())
+ .isEmpty();
+ });
+
+ runWithCaller(LAUNCHER_1, USER_0, () -> {
+ // Check the intent passed to startActivityAsUser().
+ final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+
+ verify(mServiceContext).startActivityAsUser(intent.capture(), eq(HANDLE_USER_0));
+
+ assertPinItemRequestIntent(intent.getValue(), mInjectedClientPackage);
+
+ // Check the request object.
+ final PinItemRequest request = mLauncherApps.getPinItemRequest(intent.getValue());
+
+ assertPinItemRequest(request);
+
+ assertWith(request.getShortcutInfo())
+ .haveIds("s1")
+ .areAllOrphan()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "different_activity"))
+ .areAllWithNoIntent();
+
+ // Accept the request.
+ assertForLauncherCallbackNoThrow(mLauncherApps,
+ () -> assertTrue(request.accept()))
+ .assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_P0)
+ .haveIds("s1");
+ });
+
+ verify(mServiceContext, times(1)).sendIntentSender(eq(null));
+
+ runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
+ assertWith(getCallerShortcuts())
+ .haveIds("s1")
+ .areAllNotDynamic()
+ .areAllEnabled()
+ .areAllPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "different_activity"))
+ .areAllWithIntent();
+ });
+ }
+
+ public void testRequestPinShortcut_wrongTargetActivity() {
+ setDefaultLauncher(USER_0, mMainActivityFetcher.apply(LAUNCHER_1, USER_0));
+
+ runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
+ // Create dynamic shortcut
+ ShortcutInfo s1 = makeShortcutWithActivity("s1",
+ new ComponentName("wrong_package", "different_activity"));
+
+ assertExpectException(IllegalStateException.class, "not belong to package", () -> {
+ assertTrue(mManager.requestPinShortcut(s1, /* resultIntent=*/ null));
+ });
+
+ verify(mServiceContext, times(0)).sendIntentSender(any(IntentSender.class));
+ verify(mServiceContext, times(0)).startActivityAsUser(
+ any(Intent.class), any(UserHandle.class));
+ });
+ }
+
+ public void testRequestPinShortcut_noTargetActivity_noMainActivity() {
+ setDefaultLauncher(USER_0, mMainActivityFetcher.apply(LAUNCHER_1, USER_0));
+ setDefaultLauncher(USER_10, mMainActivityFetcher.apply(LAUNCHER_2, USER_10));
+
+ runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
+ /// Create a shortcut with no target activity.
+ final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext, "s1")
+ .setShortLabel("Title-" + "s1")
+ .setIntent(makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class));
+ final ShortcutInfo s = b.build();
+
+ assertNull(s.getActivity());
+
+ // Caller has no main activity.
+ mMainActivityFetcher = (packageName, userId) -> null;
+
+ assertTrue(mManager.requestPinShortcut(s, null));
+
+ verify(mServiceContext, times(0)).sendIntentSender(any(IntentSender.class));
+
+ // Shortcut shouldn't be registered yet.
+ assertWith(getCallerShortcuts())
+ .isEmpty();
+ });
+
+ runWithCaller(LAUNCHER_1, USER_0, () -> {
+ // Check the intent passed to startActivityAsUser().
+ final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+
+ verify(mServiceContext).startActivityAsUser(intent.capture(), eq(HANDLE_USER_0));
+
+ assertPinItemRequestIntent(intent.getValue(), mInjectedClientPackage);
+
+ // Check the request object.
+ final PinItemRequest request = mLauncherApps.getPinItemRequest(intent.getValue());
+
+ assertPinItemRequest(request);
+
+ assertWith(request.getShortcutInfo())
+ .haveIds("s1")
+ .areAllOrphan()
+ .areAllWithNoActivity() // Activity is not set; expected.
+ .areAllWithNoIntent();
+
+ // Accept the request.
+ assertForLauncherCallbackNoThrow(mLauncherApps,
+ () -> assertTrue(request.accept()))
+ .assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_P0)
+ .haveIds("s1");
+ });
+
+ verify(mServiceContext, times(1)).sendIntentSender(eq(null));
+
+ runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
+ assertWith(getCallerShortcuts())
+ .haveIds("s1")
+ .areAllNotDynamic()
+ .areAllEnabled()
+ .areAllPinned()
+ .areAllWithNoActivity() // Activity is not set; expected.
+ .areAllWithIntent();
+ });
+
+ }
+
public void testRequestPinShortcut_dynamicExists() {
setDefaultLauncher(USER_0, mMainActivityFetcher.apply(LAUNCHER_1, USER_0));
@@ -328,6 +478,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(getCallerShortcuts())
.haveIds("s1")
.areAllDynamic()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllNotPinned();
});
@@ -348,6 +499,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllWithNoIntent();
assertAllHaveIcon(list(request.getShortcutInfo()));
@@ -361,6 +513,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllEnabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllPinned();
});
}
@@ -379,6 +532,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(getCallerShortcuts())
.haveIds("ms1")
.areAllManifest()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllNotPinned();
});
@@ -399,6 +554,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllManifest()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllWithNoIntent();
assertAllHaveIcon(list(request.getShortcutInfo()));
@@ -412,6 +569,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllManifest()
.areAllEnabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllPinned();
});
}
@@ -431,6 +590,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(getCallerShortcuts())
.haveIds("s1")
.areAllDynamic()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllPinned();
assertTrue(mManager.requestPinShortcut(makeShortcutIdOnly("s1"),
@@ -456,6 +616,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(getCallerShortcuts())
.haveIds("ms1")
.areAllManifest()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllPinned();
assertTrue(mManager.requestPinShortcut(makeShortcutIdOnly("ms1"),
@@ -483,6 +645,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllNotDynamic()
.areAllEnabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllPinned();
assertTrue(mManager.requestPinShortcut(makeShortcutIdOnly("s1"),
@@ -511,6 +674,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllNotDynamic()
.areAllDisabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllPinned();
assertExpectException(IllegalArgumentException.class, "exists but disabled", () -> {
@@ -541,6 +705,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllNotManifest()
.areAllDisabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllPinned();
assertExpectException(IllegalArgumentException.class, "exists but disabled", () -> {
@@ -570,6 +736,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(getCallerShortcuts())
.haveIds("s1")
.areAllDynamic()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllPinned();
// The shortcut is already pinned, but not by the current launcher, so it'll still
@@ -597,6 +764,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllNotPinned() // Note it's not pinned by this launcher.
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllWithNoIntent();
// Accept the request.
@@ -608,6 +776,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllEnabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllPinned();
});
}
@@ -629,6 +798,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(getCallerShortcuts())
.haveIds("ms1")
.areAllManifest()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllPinned();
// The shortcut is already pinned, but not by the current launcher, so it'll still
@@ -656,6 +827,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllManifest()
.areAllNotPinned() // Note it's not pinned by this launcher.
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllWithNoIntent();
// Accept the request.
@@ -667,6 +840,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllManifest()
.areAllEnabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllPinned();
});
}
@@ -710,6 +885,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllWithNoIntent();
// Accept the request.
@@ -719,6 +895,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1", "s2")
.areAllDynamic()
.areAllEnabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllPinned();
});
@@ -727,6 +904,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1", "s2")
.areAllDynamic()
.areAllEnabled()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllPinned();
});
}
@@ -752,6 +930,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(getCallerShortcuts())
.haveIds("s1")
.areAllDynamic()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllNotPinned();
});
@@ -772,6 +951,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllWithNoIntent();
assertAllHaveIcon(list(request.getShortcutInfo()));
@@ -786,6 +966,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.areAllDynamic()
.areAllEnabled()
.areAllPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.forShortcutWithId("s1", (si) -> {
// Still the original title.
assertEquals("Title-s1", si.getShortLabel());
@@ -810,6 +991,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
assertWith(getCallerShortcuts())
.haveIds("ms1")
.areAllManifest()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllNotPinned();
});
@@ -830,6 +1013,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllManifest()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllWithNoIntent();
assertAllHaveIcon(list(request.getShortcutInfo()));
@@ -844,6 +1029,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.areAllManifest()
.areAllEnabled()
.areAllPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.forShortcutWithId("ms1", (si) -> {
// Still the original title.
// Title should be something like:
@@ -893,6 +1080,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllWithNoIntent();
// Accept the request -> should fail.
@@ -950,9 +1138,9 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllWithNoIntent();
- // Accept the request -> should fail.
assertTrue(request.accept());
});
@@ -1004,6 +1192,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllManifest()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllWithNoIntent();
// Accept the request -> should fail.
@@ -1059,10 +1249,11 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllManifest()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllWithNoIntent();
- // Accept the request -> should fail.
assertTrue(request.accept());
});
@@ -1071,6 +1262,9 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllMutable() // Note it's no longer immutable.
.areAllFloating()
+
+ // Note it's the activity from makeShortcutWithShortLabel().
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.forShortcutWithId("ms1", si -> {
assertEquals("new", si.getShortLabel());
});
@@ -1104,6 +1298,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
mManager.disableShortcuts(list("s1"));
assertWith(getCallerShortcuts())
.haveIds("s1")
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllDisabled();
});
@@ -1125,6 +1320,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("s1")
.areAllDynamic()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllWithNoIntent();
// Accept the request -> should fail.
@@ -1144,6 +1340,7 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
assertWith(getCallerShortcuts())
.haveIds("s1")
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1, "main"))
.areAllDisabled();
});
}
@@ -1174,6 +1371,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
publishManifestShortcutsAsCaller(R.xml.shortcut_0);
assertWith(getCallerShortcuts())
.haveIds("ms1")
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllDisabled();
});
@@ -1195,6 +1394,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
.haveIds("ms1")
.areAllManifest()
.areAllNotPinned()
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllWithNoIntent();
// Accept the request -> should fail.
@@ -1214,6 +1415,8 @@ public class ShortcutManagerTest8 extends BaseShortcutManagerTest {
runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
assertWith(getCallerShortcuts())
.haveIds("ms1")
+ .areAllWithActivity(new ComponentName(CALLING_PACKAGE_1,
+ ShortcutActivity.class.getName()))
.areAllDisabled();
});
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 1853a653ed1a..c4fd7221d3f4 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -16,29 +16,6 @@
package com.android.server.wm;
-import com.android.internal.policy.IKeyguardDismissCallback;
-import com.android.internal.policy.IShortcutService;
-import com.android.server.input.InputManagerService;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.content.res.CompatibilityInfo;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.Display;
-import android.view.IWindowManager;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.WindowManagerPolicy;
-import android.view.animation.Animation;
-
-import java.io.PrintWriter;
-
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
@@ -62,8 +39,8 @@ import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_PHONE;
import static android.view.WindowManager.LayoutParams.TYPE_POINTER;
-import static android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION;
+import static android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION;
import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT;
@@ -81,9 +58,30 @@ import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
-
import static org.mockito.Mockito.mock;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.res.CompatibilityInfo;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.Display;
+import android.view.IWindowManager;
+import android.view.KeyEvent;
+import android.view.WindowManager;
+import android.view.WindowManagerPolicy;
+import android.view.animation.Animation;
+
+import com.android.internal.policy.IKeyguardDismissCallback;
+import com.android.internal.policy.IShortcutService;
+import com.android.server.input.InputManagerService;
+
+import java.io.PrintWriter;
+
class TestWindowManagerPolicy implements WindowManagerPolicy {
private static final String TAG = "TestWindowManagerPolicy";
@@ -308,14 +306,14 @@ class TestWindowManagerPolicy implements WindowManagerPolicy {
}
@Override
- public View addStartingWindow(IBinder appToken, String packageName, int theme,
+ public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme,
CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
int logo, int windowFlags, Configuration overrideConfig) {
return null;
}
@Override
- public void removeStartingWindow(IBinder appToken, View window) {
+ public void removeSplashScreen(IBinder appToken, StartingSurface surface) {
}
diff --git a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
index a664f21bc0dc..ea45bd17b216 100644
--- a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
+++ b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
@@ -925,7 +925,7 @@ public class ShortcutManagerTestUtils {
}
public ShortcutListAsserter areAllWithActivity(ComponentName activity) {
- forAllShortcuts(s -> assertTrue("id=" + s.getId(), s.getActivity().equals(activity)));
+ forAllShortcuts(s -> assertEquals("id=" + s.getId(), activity, s.getActivity()));
return this;
}
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index cb9cb1219a0b..512a119927bb 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -17,20 +17,36 @@
package com.android.server.usage;
import android.app.AppOpsManager;
+import android.app.usage.ExternalStorageStats;
import android.app.usage.IStorageStatsManager;
import android.app.usage.StorageStats;
-import android.app.usage.StorageSummary;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageStats;
+import android.content.pm.UserInfo;
import android.os.Binder;
+import android.os.Environment;
+import android.os.SystemProperties;
import android.os.UserHandle;
+import android.os.UserManager;
import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.util.Log;
+import com.android.internal.util.ArrayUtils;
import com.android.server.SystemService;
import com.android.server.pm.Installer;
+import com.android.server.pm.Installer.InstallerException;
public class StorageStatsService extends IStorageStatsManager.Stub {
private static final String TAG = "StorageStatsService";
+ private static final String PROP_VERIFY_STORAGE = "fw.verify_storage";
+
+ // TODO: pivot all methods to manual mode when quota isn't supported
+
public static class Lifecycle extends SystemService {
private StorageStatsService mService;
@@ -47,12 +63,16 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
private final Context mContext;
private final AppOpsManager mAppOps;
+ private final UserManager mUser;
+ private final PackageManager mPackage;
private final StorageManager mStorage;
private final Installer mInstaller;
public StorageStatsService(Context context) {
mContext = context;
mAppOps = context.getSystemService(AppOpsManager.class);
+ mUser = context.getSystemService(UserManager.class);
+ mPackage = context.getSystemService(PackageManager.class);
mStorage = context.getSystemService(StorageManager.class);
mInstaller = new Installer(context);
}
@@ -72,22 +92,163 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
}
@Override
- public StorageStats queryStats(String volumeUuid, int uid, String callingPackage) {
+ public long getTotalBytes(String volumeUuid, String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
+ if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
+ // TODO: round total size to nearest power of two
+ return mStorage.getPrimaryStorageSize();
+ } else {
+ final VolumeInfo vol = mStorage.findVolumeByUuid(volumeUuid);
+ return vol.disk.size;
+ }
+ }
+
+ @Override
+ public long getFreeBytes(String volumeUuid, String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
+ long cacheBytes = 0;
+ for (UserInfo user : mUser.getUsers()) {
+ final StorageStats stats = queryStatsForUser(volumeUuid, user.id, null);
+ cacheBytes += stats.cacheBytes;
+ }
+
+ if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
+ return Environment.getDataDirectory().getFreeSpace() + cacheBytes;
+ } else {
+ final VolumeInfo vol = mStorage.findVolumeByUuid(volumeUuid);
+ return vol.getPath().getFreeSpace() + cacheBytes;
+ }
+ }
+
+ @Override
+ public StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage) {
enforcePermission(Binder.getCallingUid(), callingPackage);
if (UserHandle.getUserId(uid) != UserHandle.getCallingUserId()) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
}
- // TODO: call installd to collect quota stats
- return null;
+ final int userId = UserHandle.getUserId(uid);
+ final int appId = UserHandle.getUserId(uid);
+
+ final String[] packageNames = mPackage.getPackagesForUid(uid);
+ final long[] ceDataInodes = new long[packageNames.length];
+ final String[] codePaths = new String[packageNames.length];
+
+ for (int i = 0; i < packageNames.length; i++) {
+ try {
+ codePaths[i] = mPackage.getApplicationInfoAsUser(packageNames[i], 0,
+ userId).getCodePath();
+ } catch (NameNotFoundException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ final PackageStats stats = new PackageStats(TAG);
+ try {
+ mInstaller.getAppSize(volumeUuid, packageNames, userId, Installer.FLAG_USE_QUOTA,
+ appId, ceDataInodes, codePaths, stats);
+
+ if (SystemProperties.getBoolean(PROP_VERIFY_STORAGE, false)) {
+ final PackageStats manualStats = new PackageStats(TAG);
+ mInstaller.getAppSize(volumeUuid, packageNames, userId, 0,
+ appId, ceDataInodes, codePaths, manualStats);
+ checkEquals("UID " + uid, manualStats, stats);
+ }
+ } catch (InstallerException e) {
+ throw new IllegalStateException(e);
+ }
+ return translate(stats);
+ }
+
+ @Override
+ public StorageStats queryStatsForUser(String volumeUuid, int userId, String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+ if (userId != UserHandle.getCallingUserId()) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
+ }
+
+ int[] appIds = null;
+ for (ApplicationInfo app : mPackage.getInstalledApplicationsAsUser(0, userId)) {
+ final int appId = UserHandle.getAppId(app.uid);
+ if (!ArrayUtils.contains(appIds, appId)) {
+ appIds = ArrayUtils.appendInt(appIds, appId);
+ }
+ }
+
+ final PackageStats stats = new PackageStats(TAG);
+ try {
+ mInstaller.getUserSize(volumeUuid, userId, Installer.FLAG_USE_QUOTA, appIds, stats);
+
+ if (SystemProperties.getBoolean(PROP_VERIFY_STORAGE, false)) {
+ final PackageStats manualStats = new PackageStats(TAG);
+ mInstaller.getUserSize(volumeUuid, userId, 0, appIds, manualStats);
+ checkEquals("User " + userId, manualStats, stats);
+ }
+ } catch (InstallerException e) {
+ throw new IllegalStateException(e);
+ }
+ return translate(stats);
}
@Override
- public StorageSummary querySummary(String volumeUuid, String callingPackage) {
+ public ExternalStorageStats queryExternalStatsForUser(String volumeUuid, int userId,
+ String callingPackage) {
enforcePermission(Binder.getCallingUid(), callingPackage);
+ if (userId != UserHandle.getCallingUserId()) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
+ }
+
+ final long[] stats;
+ try {
+ stats = mInstaller.getExternalSize(volumeUuid, userId, Installer.FLAG_USE_QUOTA);
+
+ if (SystemProperties.getBoolean(PROP_VERIFY_STORAGE, false)) {
+ final long[] manualStats = mInstaller.getExternalSize(volumeUuid, userId, 0);
+ checkEquals("External " + userId, manualStats, stats);
+ }
+ } catch (InstallerException e) {
+ throw new IllegalStateException(e);
+ }
+
+ final ExternalStorageStats res = new ExternalStorageStats();
+ res.totalBytes = stats[0];
+ res.audioBytes = stats[1];
+ res.videoBytes = stats[2];
+ res.imageBytes = stats[3];
+ return res;
+ }
+
+ private static void checkEquals(String msg, long[] a, long[] b) {
+ for (int i = 0; i < a.length; i++) {
+ checkEquals(msg + "[" + i + "]", a[i], b[i]);
+ }
+ }
+
+ private static void checkEquals(String msg, PackageStats a, PackageStats b) {
+ checkEquals(msg + " codeSize", a.codeSize, b.codeSize);
+ checkEquals(msg + " dataSize", a.dataSize, b.dataSize);
+ checkEquals(msg + " cacheSize", a.cacheSize, b.cacheSize);
+ checkEquals(msg + " externalCodeSize", a.externalCodeSize, b.externalCodeSize);
+ checkEquals(msg + " externalDataSize", a.externalDataSize, b.externalDataSize);
+ checkEquals(msg + " externalCacheSize", a.externalCacheSize, b.externalCacheSize);
+ }
+
+ private static void checkEquals(String msg, long expected, long actual) {
+ if (expected != actual) {
+ Log.e(TAG, msg + " expected " + expected + " actual " + actual);
+ }
+ }
- // TODO: call installd to collect quota stats
- return null;
+ private static StorageStats translate(PackageStats stats) {
+ final StorageStats res = new StorageStats();
+ res.codeBytes = stats.codeSize + stats.externalCodeSize;
+ res.dataBytes = stats.dataSize + stats.externalDataSize;
+ res.cacheBytes = stats.cacheSize + stats.externalCacheSize;
+ return res;
}
}
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index c69b7c2771ac..b20384dfffbc 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -115,6 +115,13 @@ public final class Call {
*/
public static final String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
+ /**
+ * Extra key used to indicate the time (in millis) when the last outgoing emergency call was
+ * made. This is used to identify potential emergency callbacks.
+ */
+ public static final String EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS =
+ "android.telecom.extra.LAST_EMERGENCY_CALLBACK_TIME_MILLIS";
+
public static class Details {
/** Call can currently be put on hold or unheld. */
diff --git a/tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java b/tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java
index 85584d3ed2cc..4445a2238538 100644
--- a/tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java
+++ b/tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java
@@ -51,4 +51,8 @@ public class AttachInfo_Accessor {
view.dispatchDetachedFromWindow();
}
}
+
+ public static ViewRootImpl getRootView(View view) {
+ return view.mAttachInfo != null ? view.mAttachInfo.mViewRootImpl : null;
+ }
}
diff --git a/tools/layoutlib/bridge/src/android/view/ViewRootImpl_Accessor.java b/tools/layoutlib/bridge/src/android/view/ViewRootImpl_Accessor.java
new file mode 100644
index 000000000000..0e15b97243b0
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/view/ViewRootImpl_Accessor.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+/**
+ * Accessor to allow layoutlib to call {@link ViewRootImpl#dispatchApplyInsets} directly.
+ */
+public class ViewRootImpl_Accessor {
+ public static void dispatchApplyInsets(ViewRootImpl viewRoot, View host) {
+ viewRoot.dispatchApplyInsets(host);
+ }
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java
index 726ff223bd8f..2fe3ed5dc5ee 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java
@@ -38,7 +38,10 @@ import android.annotation.NonNull;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.util.TypedValue;
+import android.view.AttachInfo_Accessor;
import android.view.View;
+import android.view.ViewRootImpl;
+import android.view.ViewRootImpl_Accessor;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
@@ -302,6 +305,17 @@ class Layout extends RelativeLayout {
return Bridge.getResourceId(ResourceType.ID, ID_PREFIX + name);
}
+ @Override
+ public void requestFitSystemWindows() {
+ // The framework call would usually bubble up to ViewRootImpl but, in layoutlib, Layout will
+ // act as view root for most purposes. That way, we can also save going through the Handler
+ // to dispatch the new applied insets.
+ ViewRootImpl root = AttachInfo_Accessor.getRootView(this);
+ if (root != null) {
+ ViewRootImpl_Accessor.dispatchApplyInsets(root, this);
+ }
+ }
+
/**
* A helper class to help initialize the Layout.
*/
diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/myapplication.widgets/InsetsWidget.java b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/myapplication.widgets/InsetsWidget.java
new file mode 100644
index 000000000000..36e5c2646420
--- /dev/null
+++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/myapplication.widgets/InsetsWidget.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.layoutlib.test.myapplication.widgets;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.WindowInsets;
+import android.widget.TextView;
+
+public class InsetsWidget extends TextView {
+ public static boolean sApplyInsetsCalled = false;
+
+ public InsetsWidget(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ requestApplyInsets();
+ }
+
+ @Override
+ public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+ sApplyInsetsCalled = true;
+ return super.onApplyWindowInsets(insets);
+ }
+}
diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/insets.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/insets.xml
new file mode 100644
index 000000000000..ff06d79dd00a
--- /dev/null
+++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/insets.xml
@@ -0,0 +1,12 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:padding="16dp"
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <com.android.layoutlib.test.myapplication.widgets.InsetsWidget
+ android:text="Hello world"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/text1"/>
+</LinearLayout>
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
index c813a1292318..7a436eb3313e 100644
--- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
+++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
@@ -63,6 +63,7 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
@@ -87,6 +88,7 @@ import java.util.zip.ZipFile;
import com.google.android.collect.Lists;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -434,6 +436,37 @@ public class Main {
renderAndVerify(params, "simple_activity.png");
}
+ @Test
+ public void testOnApplyInsetsCall()
+ throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
+ // We get the widget via reflection to avoid IntelliJ complaining about the class being
+ // located in the wrong package. (From the Bridge tests point of view, it is)
+ Class insetsWidgetClass = Class.forName("com.android.layoutlib.test.myapplication.widgets" +
+ ".InsetsWidget");
+ Field field = insetsWidgetClass.getDeclaredField("sApplyInsetsCalled");
+ assertFalse((Boolean)field.get(null));
+
+ LayoutPullParser parser = createLayoutPullParser("insets.xml");
+ LayoutLibTestCallback layoutLibCallback =
+ new LayoutLibTestCallback(getLogger(), mDefaultClassLoader);
+ layoutLibCallback.initResources();
+ SessionParams params = getSessionParams(parser, ConfigGenerator.NEXUS_5,
+ layoutLibCallback, "Theme.Material.Light.NoActionBar", false,
+ RenderingMode.NORMAL, 22);
+ try {
+ renderAndVerify(params, "scrolled.png");
+ } catch(AssertionError e) {
+ // In this particular test we do not care about the image similarity.
+ // TODO: Create new render method that allows to not compare images.
+ if (!e.getLocalizedMessage().startsWith("Images differ")) {
+ throw e;
+ }
+ }
+
+ assertTrue((Boolean)field.get(null));
+ field.set(null, false);
+ }
+
@AfterClass
public static void tearDown() {
sLayoutLibLog = null;